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 相关文章推荐
14款NodeJS Web框架推荐
Jul 11 NodeJs
NodeJs中的VM模块详解
May 06 NodeJs
使用nodejs下载风景壁纸
Feb 05 NodeJs
NodeJS、NPM安装配置步骤(windows版本) 以及环境变量详解
May 13 NodeJs
Nodejs+express+ejs简单使用实例代码
Sep 18 NodeJs
nodejs Assert中equal(),strictEqual(),deepEqual(),strictDeepEqual()比较
Sep 18 NodeJs
nodejs项目windows下开机自启动的方法
Nov 22 NodeJs
nodejs 简单实现动态html的方法
May 12 NodeJs
NodeJs实现简单的爬虫功能案例分析
Dec 05 NodeJs
图解NodeJS实现登录注册功能
Sep 16 NodeJs
ubuntu系统下使用pm2设置nodejs开机自启动的方法
May 12 NodeJs
浅谈Node的内存泄露问题
May 06 NodeJs
NodeJs使用webpack打包项目的方法详解
Feb 28 #NodeJs
node快速搭建后台的实现步骤
nodejs利用readline提示输入内容实例代码
详解NodeJS模块化
NodeJs内存占用过高的排查实战记录
详解nodejs内置模块
May 06 #NodeJs
浅谈JS和Nodejs中的事件驱动
May 05 #NodeJs
You might like
PHP数据库链接类(PDO+Access)实例分享
2013/12/05 PHP
php中文繁体和简体相互转换的方法
2015/03/21 PHP
Laravel 5 框架入门(三)
2015/04/09 PHP
Laravel框架运行出错提示RuntimeException No application encryption key has been specified.解决方法
2019/04/02 PHP
PHP命名空间与自动加载机制的基础介绍
2019/08/25 PHP
javascript学习笔记(九) js对象 设计模式
2012/06/19 Javascript
javascript的渐进增强与平稳退化浅谈
2013/11/12 Javascript
JQuery与Ajax调用新浪API获取短网址的代码
2014/02/07 Javascript
JS中使用sort结合localeCompare实现中文排序实例
2014/07/23 Javascript
jQuery实现复选框成对选择及对应取消的方法
2015/03/03 Javascript
jQuery获取某天的农历日期并判断是否除夕或新年的方法
2016/03/01 Javascript
jQuery中$.each()函数的用法引申实例
2016/05/12 Javascript
JavaScript中Array对象用法实例总结
2016/11/29 Javascript
js实现漫天星星效果
2017/01/19 Javascript
JavaScript之Date_动力节点Java学院整理
2017/06/28 Javascript
详解ES6 Promise对象then方法链式调用
2018/10/20 Javascript
详解用场景去理解函数柯里化(入门篇)
2019/04/11 Javascript
如何在postman测试用例中实现断言过程解析
2020/07/09 Javascript
在vue项目中 实现定义全局变量 全局函数操作
2020/10/26 Javascript
python使用rsa加密算法模块模拟新浪微博登录
2014/01/22 Python
Python常见异常分类与处理方法
2017/06/04 Python
彻底理解Python list切片原理
2017/10/27 Python
Python实现将doc转化pdf格式文档的方法
2018/01/19 Python
python实现学生信息管理系统
2020/04/05 Python
python实现求特征选择的信息增益
2018/12/18 Python
Python3中urlencode和urldecode的用法详解
2019/07/23 Python
python通过matplotlib生成复合饼图
2020/02/06 Python
Python selenium页面加载慢超时的解决方案
2020/03/18 Python
如何在django中运行scrapy框架
2020/04/22 Python
Keras: model实现固定部分layer,训练部分layer操作
2020/06/28 Python
Pandas中DataFrame基本函数整理(小结)
2020/07/20 Python
CSS3 选择器 基本选择器介绍
2012/01/21 HTML / CSS
美国羊皮公司:Overland
2018/01/15 全球购物
禁止高声喧哗的标语
2014/06/11 职场文书
当幸福来敲门观后感
2015/06/01 职场文书
微信小程序实现拍照和相册选取图片
2021/05/09 Javascript