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获取本机内网和外网ip地址的实现代码
Jun 01 NodeJs
NodeJS制作爬虫全过程
Dec 22 NodeJs
windows下安装nodejs及框架express
Aug 07 NodeJs
Nodejs抓取html页面内容(推荐)
Aug 11 NodeJs
NodeJS创建最简单的HTTP服务器
May 15 NodeJs
Windows下快速搭建NodeJS本地服务器的步骤
Aug 09 NodeJs
Nodejs调用WebService的示例代码
Sep 29 NodeJs
Nodejs下使用gm圆形裁剪并合成图片的示例
Feb 22 NodeJs
解决Nodejs全局安装模块后找不到命令的问题
May 15 NodeJs
nodejs实现套接字服务功能详解
Jun 21 NodeJs
独立部署小程序基于nodejs的服务器过程详解
Jun 24 NodeJs
NodeJs使用webpack打包项目的方法详解
Feb 28 #NodeJs
node快速搭建后台的实现步骤
nodejs利用readline提示输入内容实例代码
详解NodeJS模块化
NodeJs内存占用过高的排查实战记录
详解nodejs内置模块
May 06 #NodeJs
浅谈JS和Nodejs中的事件驱动
May 05 #NodeJs
You might like
Zend Framework教程之动作的基类Zend_Controller_Action详解
2016/03/07 PHP
PHP的AES加密算法完整实例
2016/07/20 PHP
PHP自动补全表单的两种方法
2017/03/06 PHP
JavaScript-世界上误解最深的语言分析
2007/08/12 Javascript
Javascript学习笔记2 函数
2010/01/11 Javascript
jquery多浏览器捕捉回车事件代码
2010/06/22 Javascript
基于jquery的返回顶部效果(兼容IE6)
2011/01/17 Javascript
js实现动态改变字体大小代码
2014/01/02 Javascript
JS自调用匿名函数具体实现
2014/02/11 Javascript
jQuery事件绑定和委托实例
2014/11/25 Javascript
js实现获取div坐标的方法
2015/11/16 Javascript
基于jQuery实现文本框只能输入数字(小数、整数)
2016/01/14 Javascript
jQuery调用WebMethod(PageMethod) NET2.0的方法
2016/04/15 Javascript
laypage分页控件使用实例详解
2016/05/19 Javascript
Javascript在IE和Firefox浏览器常见兼容性问题总结
2016/08/03 Javascript
使用jQuery的toggle()方法对HTML标签进行显示、隐藏的方法(示例)
2016/09/01 Javascript
angularjs ocLazyLoad分步加载js文件实例
2017/01/17 Javascript
javascript验证香港身份证的格式或真实性
2017/02/07 Javascript
Vue.js 2.0中select级联下拉框实例
2017/03/06 Javascript
Vue2.0 UI框架ElementUI使用方法详解
2017/04/14 Javascript
jQuery实现动态删除LI的方法
2017/05/30 jQuery
浅谈ES6新增的数组方法和对象
2017/08/08 Javascript
纯JavaScript实现实时反馈系统时间
2017/10/26 Javascript
VScode格式化ESlint方法(最全最好用方法)
2019/09/10 Javascript
解决Pycharm中import时无法识别自己写的程序方法
2018/05/18 Python
pandas进行数据的交集与并集方式的数据合并方法
2018/06/27 Python
jupyter notebook 增加kernel教程
2020/04/10 Python
Pandas对DataFrame单列/多列进行运算(map, apply, transform, agg)
2020/06/14 Python
浅析Python打包时包含静态文件处理方法
2021/01/15 Python
html5中的input新属性range使用记录
2014/09/05 HTML / CSS
英国儿童鞋和靴子:Start-Rite
2019/05/06 全球购物
出国留学自荐信
2013/10/25 职场文书
元旦晚会主持词开场白
2015/05/28 职场文书
公司老总年会致辞
2015/07/30 职场文书
担保书怎么写 ?
2019/04/22 职场文书
Win11控制面板快捷键是什么?Win11打开控制面板的方法汇总
2022/07/07 数码科技