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访问ActiveX对象,以操作Access数据库为例。
Dec 15 NodeJs
Nodejs+express+html5 实现拖拽上传
Aug 08 NodeJs
基于NodeJS的前后端分离的思考与实践(五)多终端适配
Sep 26 NodeJs
nodejs 提示‘xxx’ 不是内部或外部命令解决方法
Nov 20 NodeJs
NodeJS中的MongoDB快速入门详细教程
Nov 11 NodeJs
Nodejs 搭建简单的Web服务器详解及实例
Nov 30 NodeJs
解析NodeJs的调试方法
Dec 11 NodeJs
进阶之初探nodeJS
Jan 24 NodeJs
详解nodejs实现本地上传图片并预览功能(express4.0+)
Jun 28 NodeJs
NodeJs实现定时任务的示例代码
Dec 05 NodeJs
nodejs+mongodb aggregate级联查询操作示例
Mar 17 NodeJs
5分钟教你用nodeJS手写一个mock数据服务器的方法
Sep 10 NodeJs
NodeJs使用webpack打包项目的方法详解
Feb 28 #NodeJs
node快速搭建后台的实现步骤
nodejs利用readline提示输入内容实例代码
详解NodeJS模块化
NodeJs内存占用过高的排查实战记录
详解nodejs内置模块
May 06 #NodeJs
浅谈JS和Nodejs中的事件驱动
May 05 #NodeJs
You might like
PHP实现长文章分页实例代码(附源码)
2016/02/03 PHP
php实现学生管理系统
2020/03/21 PHP
微信随机生成红包金额算法php版
2016/07/21 PHP
Yii全局函数用法示例
2017/01/22 PHP
jQuery Ajax请求状态管理器打包
2012/05/03 Javascript
JS实现图片翻书效果示例代码
2013/09/09 Javascript
cookie的复制与使用记住用户名实现代码
2013/11/04 Javascript
Vuejs第八篇之Vuejs组件的定义实例解析
2016/09/05 Javascript
详解ECharts使用心得总结
2016/12/06 Javascript
jQuery的extend方法【三种】
2016/12/14 Javascript
JavaScript实现自定义媒体播放器方法介绍
2017/01/03 Javascript
详解JavaScript中this的指向问题
2017/01/20 Javascript
bootstrap datetimepicker 日期插件在火狐下出现一条报错信息的原因分析及解决办法
2017/03/08 Javascript
AngularJS实现的JSONP跨域访问数据传输功能详解
2017/07/20 Javascript
vue2.0 + ele的循环表单及验证字段方法
2018/09/18 Javascript
javascript实现简易聊天室
2019/07/12 Javascript
JavaScript实现轮播图特效
2020/04/10 Javascript
vue-axios同时请求多个接口 等所有接口全部加载完成再处理操作
2020/11/09 Javascript
Python设计模式之MVC模式简单示例
2018/01/10 Python
Python多继承顺序实例分析
2018/05/26 Python
Python中BeautifuSoup库的用法使用详解
2019/11/15 Python
python的等深分箱实例
2019/11/22 Python
jupyter notebook 添加kernel permission denied的操作
2020/04/21 Python
基于Python+QT的gui程序开发实现
2020/07/03 Python
Python3安装模块报错Microsoft Visual C++ 14.0 is required的解决方法
2020/07/28 Python
HTML5新增属性data-*和js/jquery之间的交互及注意事项
2017/08/08 HTML / CSS
性能服装:HYLETE
2018/08/14 全球购物
荷兰美妆护肤品海淘网站:Beautinow(中文)
2020/11/22 全球购物
党委书记岗位职责
2013/11/24 职场文书
2014年冬季防火方案
2014/05/21 职场文书
2014物价局民主生活会对照检查材料思想汇报
2014/09/24 职场文书
防灾减灾宣传标语
2014/10/07 职场文书
青年志愿者服务活动总结
2015/05/06 职场文书
婚育证明格式
2015/06/17 职场文书
法人代表资格证明书
2015/06/18 职场文书
关于springboot 配置date字段返回时间戳的问题
2021/07/25 Java/Android