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 url验证(url-valid)的使用方法
Nov 18 NodeJs
nodejs获取本机内网和外网ip地址的实现代码
Jun 01 NodeJs
详谈Angular路由与Nodejs路由的区别
Mar 05 NodeJs
NodeJS学习笔记之Module的简介
Mar 24 NodeJs
win系统下nodejs环境安装配置
May 04 NodeJs
nodejs动态创建二维码的方法
Aug 12 NodeJs
nodejs中Express与Koa2对比分析
Feb 06 NodeJs
详解Nodejs内存治理
May 13 NodeJs
nodejs require js文件入口,在package.json中指定默认入口main方法
Oct 10 NodeJs
nodejs中实现用户注册路由功能
May 20 NodeJs
nodejs中各种加密算法的实现详解
Jul 11 NodeJs
nodejs中的异步编程知识点详解
Jan 17 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/04/22 PHP
php中isset与empty函数的困惑与用法分析
2019/07/05 PHP
Laravel (Lumen) 解决JWT-Auth刷新token的问题
2019/10/24 PHP
设定php简写功能的方法
2019/11/28 PHP
laravel框架中控制器的创建和使用方法分析
2019/11/23 PHP
Javascript 判断客户端浏览器类型代码
2010/03/01 Javascript
网站接入QQ登录的两种方法
2014/07/22 Javascript
浅谈jquery选择器 :first与:first-child的区别
2016/11/20 Javascript
深入剖析Node.js cluster模块
2018/05/23 Javascript
extract-text-webpack-plugin用法详解
2019/02/14 Javascript
使用JavaScript解析URL的方法示例
2019/03/01 Javascript
浏览器事件循环与vue nextTicket的实现
2019/04/16 Javascript
详解vue为什么要求组件模板只能有一个根元素
2019/07/22 Javascript
微信小程序如何实现五星评价功能
2019/10/15 Javascript
JS如何定义用字符串拼接的变量
2020/07/11 Javascript
uniapp实现可以左右滑动导航栏
2020/10/21 Javascript
在RedHat系Linux上部署Python的Celery框架的教程
2015/04/07 Python
解决pyqt中ui编译成窗体.py中文乱码的问题
2016/12/23 Python
使用pandas中的DataFrame数据绘制柱状图的方法
2018/04/10 Python
Python 中的lambda函数介绍
2018/10/10 Python
python根据文章标题内容自动生成摘要的实例
2019/02/21 Python
Python中的几种矩阵乘法(小结)
2019/07/10 Python
在python中logger setlevel没有生效的解决
2020/02/21 Python
Python转换字典成为对象,可以用&quot;.&quot;方式访问对象属性实例
2020/05/11 Python
详解Pymongo常用查询方法总结
2021/01/29 Python
html5构建触屏网站之touch事件介绍
2013/01/07 HTML / CSS
HTML5利用约束验证API来检查表单的输入数据的代码实例
2016/12/20 HTML / CSS
iframe与window.onload如何使用详解
2020/05/07 HTML / CSS
HTML5 drag和drop具体使用详解
2021/01/18 HTML / CSS
澳大利亚UGG工厂直销:Australian Ugg Boots
2017/10/14 全球购物
印度尼西亚最大的电商平台:Tokopedia(印尼版淘宝)
2017/12/02 全球购物
情侣吵架检讨书
2014/02/05 职场文书
工资证明范本
2015/06/12 职场文书
倡议书怎么写?
2019/04/11 职场文书
elementui的el-popover修改样式不生效的解决
2021/06/30 Javascript
详解Spring Boot使用系统参数表提升系统的灵活性
2021/06/30 Java/Android