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框架Express的模板视图机制分析
Jul 19 NodeJs
Nodejs极简入门教程(三):进程
Oct 27 NodeJs
轻松创建nodejs服务器(6):作出响应
Dec 18 NodeJs
轻松创建nodejs服务器(10):处理POST请求
Dec 18 NodeJs
NodeJS配置HTTPS服务实例分享
Feb 19 NodeJs
详解nodejs微信公众号开发——4.自动回复各种消息
Apr 11 NodeJs
NodeJS、NPM安装配置步骤(windows版本) 以及环境变量详解
May 13 NodeJs
nodejs创建简易web服务器与文件读写的实例
Sep 07 NodeJs
Nodejs中使用phantom将html转为pdf或图片格式的方法
Sep 18 NodeJs
nodejs 生成和导出 word的实例代码
Jul 31 NodeJs
Nodejs调用Dll模块的方法
Sep 17 NodeJs
NodeJS http模块用法示例【创建web服务器/客户端】
Nov 05 NodeJs
NodeJs使用webpack打包项目的方法详解
Feb 28 #NodeJs
node快速搭建后台的实现步骤
nodejs利用readline提示输入内容实例代码
详解NodeJS模块化
NodeJs内存占用过高的排查实战记录
详解nodejs内置模块
May 06 #NodeJs
浅谈JS和Nodejs中的事件驱动
May 05 #NodeJs
You might like
php反射应用示例
2014/02/25 PHP
php返回相对时间(如:20分钟前,3天前)的方法
2015/04/14 PHP
微信公众号实现扫码获取微信用户信息(网页授权)
2019/04/09 PHP
javascript在一段文字中的光标处插入其他文字
2007/08/26 Javascript
Javascript 中的类和闭包
2010/01/08 Javascript
20款超赞的jQuery插件 Web开发人员必备
2011/02/26 Javascript
jQuery输入城市查看地图使用介绍
2013/05/08 Javascript
jQuery中outerWidth()方法用法实例
2015/01/19 Javascript
简介JavaScript中toTimeString()方法的使用
2015/06/12 Javascript
jQuery自动完成插件completer附源码下载
2016/01/04 Javascript
解决使用Vue.js显示数据的时,页面闪现原始代码的问题
2018/02/11 Javascript
对vue里函数的调用顺序介绍
2018/03/17 Javascript
Vue组件全局注册实现警告框的实例详解
2018/06/11 Javascript
element-ui多文件上传的实现示例
2019/04/10 Javascript
解决layui动态加载复选框无法选中的问题
2019/09/20 Javascript
nodejs中使用archive压缩文件的实现代码
2019/11/26 NodeJs
原生js实现无缝轮播图
2020/01/11 Javascript
为react组件库添加typescript类型提示的方法
2020/06/15 Javascript
python实现的防DDoS脚本
2011/02/08 Python
python基础教程之类class定义使用方法
2014/02/20 Python
用于业余项目的8个优秀Python库
2018/09/21 Python
Python输出\u编码将其转换成中文的实例
2018/12/15 Python
python使用response.read()接收json数据的实例
2018/12/19 Python
利用python提取wav文件的mfcc方法
2019/01/09 Python
Python GUI之tkinter窗口视窗教程大集合(推荐)
2020/10/20 Python
linux centos 7.x 安装 python3.x 替换 python2.x的过程解析
2020/12/14 Python
C#如何调用Word并打开一个Word文档
2013/05/08 面试题
十八大报告观后感
2014/01/28 职场文书
就业表自我评价分享
2014/02/06 职场文书
预备党员入党自我评价范文
2014/03/10 职场文书
介绍信如何写
2015/01/31 职场文书
违纪开除通知书
2015/04/25 职场文书
基层组织建设年活动总结
2015/05/09 职场文书
2019年销售人员的职业生涯规划书
2019/03/25 职场文书
React列表栏及购物车组件使用详解
2021/06/28 Javascript
Shell中的单中括号和双中括号的用法详解
2022/12/24 Servers