Node.js实现爬取网站图片的示例代码


Posted in NodeJs onApril 04, 2022

涉及知识点

开发一个小爬虫,涉及的知识点如下所示:

  • https模块,主要是用户获取网络资源,如:网页源码,图片资源等。
  • cheerio模块,主要用于解析html源码,并可访问,查找html节点内容。
  • fs模块,主要用于文件的读写操作,如保存图片,日志等。
  • 闭包,主要是对于异步操作,对象的隔离保护。

cheerio简介

什么是cheerio ?

cheerio是为服务器特别定制的,快速、灵活、实施的jQuery核心实现。主要用于在服务端解析html。特点如下所示:

  • 易用,语法类似jQuery语法,从jQuery库中去除了所有 DOM不一致性和浏览器尴尬的部分。
  • 解析快,比JSDOM快八倍。
  • 灵活,Cheerio 封装了兼容的htmlparser。Cheerio 几乎能够解析任何的 HTML 和 XML document。

安装cheerio

首先在命令行,切换到程序目录,然后输入安装命令进行安装,如下所示:

cnpm install cheerio

安装过程,如下所示:

Node.js实现爬取网站图片的示例代码

准备工作

在编写爬虫之前,首先需要分析目标内容,本次需要爬取的是某网站,星空类型的图片内容,经过分析,发现所有的图片都是在ul下每一个li中的a标签内的img中,本次只需要解析出img的src属性,即可获取图片的下载路径。如下所示:

Node.js实现爬取网站图片的示例代码

核心代码

经过以上分析,通过Node.js编写代码,分为两步,获取所有图片的url路径,即解析所有目标img元素的src属性。然后再下载具体图片进行保存即可。

引用所需要的功能模块,如下所示:

var https = require('https');
var cheerio = require('cheerio');
var fs = require('fs');

获取并解析html页面内容,如下所示:

//爬取的网址
var addrs=['https://www.*****.com/topic/show_27202_1.html','https://www.******.com/topic/show_27202_2.html','https://www.*****.com/topic/show_27202_3.html'];
var logger = fs.createWriteStream('./download/log.txt',{flags:'a+',autoClose:'true'});

for(i in addrs){
    (function(num){
   var addr = addrs[num];
   //创建目录
   var p1 = new Promise(function(resolve,reject){
     fs.access('./download',function(err){
       if(err){
           fs.mkdir('./download',function(e){
               if(e){
                   console.log('创建失败');
               }
           });
        }else{
            resolve("success");
        }
       });
   });

   p1.then(function(datas){
       var html='';
       var p2 = new Promise(function(resolve,reject){
           https.get(addr,function(res){
                res.on('data',function(data){
                    html+=data.toString();
                })
                res.on('end',function(){
                    resolve("success");
                });

            });

       });
      p2.then(function(data){
        //下载完成后,进行解析
        const $ =cheerio.load(html);
        var lis = $('#img-list-outer').find('li');
        for(var j=0;j<lis.length-1;j++){
            var li = lis[j];
            var src =$(li).find('a').find('img').attr('src');
            //console.log(src);
            //console.log('-------------------------');
            var imgurl='https:'+src;
            download(imgurl);
            var msg='['+j+']下载成功:'+imgurl;
            logger.write(msg+'\n');
            console.log(msg);
        }
      });
   });
   })(i);
}

注意:因为所有爬取的目标共分为3页,所以用到了循环,并且在循环中用到了闭包。

下载并保存单张图片代码,如下所示:

//下载图片
function download(imgurl){
    var p1 = new Promise(function(resolve,reject){
        https.get(imgurl,function(res){
            var imgName=imgurl.substr(imgurl.lastIndexOf('/')+1);
            var stream = fs.createWriteStream('./download/'+imgName);
            res.pipe(stream);
            setTimeout(function(){
                resolve('success');
            },300);

        });
    });
    p1.then(function(data){
        return;
    });
}

示例截图

开发完成后,运行代码,如下所示

Node.js实现爬取网站图片的示例代码

爬取的图片,保存在文件夹中,如下所示:

Node.js实现爬取网站图片的示例代码

注意:添加日志,是为了方便记录程序执行过程,对比图片和日志,便于发现问题。

到此这篇关于Node.js实现爬取网站图片的示例代码的文章就介绍到这了,更多相关Node.js爬取图片内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

NodeJs 相关文章推荐
nodejs中操作mysql数据库示例
Dec 20 NodeJs
NodeJS制作爬虫全过程(续)
Dec 22 NodeJs
NodeJS实现微信公众号关注后自动回复功能
May 31 NodeJs
docker中编译nodejs并使用nginx启动
Jun 23 NodeJs
nodejs 子进程正确的打开方式
Jul 03 NodeJs
nodejs前端自动化构建环境的搭建
Jul 26 NodeJs
Nodejs中crypto模块的安全知识讲解
Jan 03 NodeJs
详解nodeJs文件系统(fs)与流(stream)
Jan 24 NodeJs
Nodejs中怎么实现函数的串行执行
Mar 02 NodeJs
nodejs提示:cross-device link not permitted, rename错误的解决方法
Jun 10 NodeJs
NodeJS http模块用法示例【创建web服务器/客户端】
Nov 05 NodeJs
Nodejs + Websocket 指定发送及群聊的实现
Jan 09 NodeJs
NodeJs使用webpack打包项目的方法详解
Feb 28 #NodeJs
node快速搭建后台的实现步骤
nodejs利用readline提示输入内容实例代码
详解NodeJS模块化
NodeJs内存占用过高的排查实战记录
详解nodejs内置模块
May 06 #NodeJs
浅谈JS和Nodejs中的事件驱动
May 05 #NodeJs
You might like
初品cakephp 入门基础
2012/02/16 PHP
解析PHP提交后跳转
2013/06/23 PHP
php检索或者复制远程文件的方法
2015/03/13 PHP
php用户密码加密算法分析【Discuz加密算法】
2016/10/12 PHP
关于laravel 子查询 &amp; join的使用
2019/10/16 PHP
使用Jquery搭建最佳用户体验的登录页面之记住密码自动登录功能(含后台代码)
2011/07/10 Javascript
jquery插件制作 自增长输入框实现代码
2012/08/17 jQuery
加载远程图片时,经常因为缓存而得不到更新的解决方法(分享)
2013/06/26 Javascript
将json对象转换为字符串的方法
2014/02/20 Javascript
关于事件mouseover ,mouseout ,mouseenter,mouseleave的区别
2015/10/12 Javascript
基于jquery实现瀑布流布局
2020/06/28 Javascript
详解JavaScript for循环中发送AJAX请求问题
2020/06/23 Javascript
JS二叉树的简单实现方法示例
2017/04/05 Javascript
原生js调用json方法总结
2018/02/22 Javascript
layui的table单击行勾选checkbox功能方法
2018/08/14 Javascript
微信小程序点击保存图片到本机功能
2019/12/13 Javascript
详解JavaScript 作用域
2020/07/14 Javascript
Python统计列表中的重复项出现的次数的方法
2014/08/18 Python
Python 文件处理注意事项总结
2017/04/10 Python
python编程培训 python培训靠谱吗
2018/01/17 Python
python实现自主查询实时天气
2018/06/22 Python
python使用dlib进行人脸检测和关键点的示例
2020/12/05 Python
英国设计的甲板鞋和船鞋:Chatham
2018/12/06 全球购物
瑞士设计师家具和家居饰品网上商店:Bruno Wickart
2019/03/18 全球购物
台湾良兴购物网:EcLife
2019/12/01 全球购物
美国在线面料商店:Fashion Fabrics Club
2020/01/31 全球购物
精选鞋类、服装和配饰的全球领先目的地:Bodega
2021/02/27 全球购物
当当网软件测试笔试题
2015/11/24 面试题
自动化工程专业个人应聘自荐信
2013/09/26 职场文书
家长写给老师的建议书
2014/03/13 职场文书
搞笑婚礼主持词
2014/03/13 职场文书
2014年终个人工作总结
2014/11/07 职场文书
离婚民事起诉状
2015/08/03 职场文书
2015年圣诞节寄语
2015/08/17 职场文书
如何用python绘制雷达图
2021/04/24 Python
JavaScript实现淘宝商品图切换效果
2021/04/29 Javascript