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 npm package.json中文文档
Sep 04 NodeJs
NodeJS学习笔记之Http模块
Jan 13 NodeJs
NodeJS爬虫实例之糗事百科
Dec 14 NodeJs
nodejs+express搭建多人聊天室步骤
Feb 12 NodeJs
nodejs简单访问及操作mysql数据库的方法示例
Mar 15 NodeJs
nodejs 十六进制字符串型数据与btye型数据相互转换
Jul 30 NodeJs
nodejs实现范围请求的实现代码
Oct 12 NodeJs
详解nodejs 配置文件处理方案
Jan 02 NodeJs
Nodejs对postgresql基本操作的封装方法
Feb 20 NodeJs
nodejs分离html文件里面的js和css的方法
Apr 09 NodeJs
nodejs利用readline提示输入内容实例代码
Jul 15 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 object转数组示例
2014/01/15 PHP
php使用number_format函数截取小数的方法分析
2016/05/27 PHP
ThinkPHP框架实现数据增删改
2017/05/07 PHP
Javascript 继承机制的实现
2009/08/12 Javascript
Javascript 面向对象特性
2009/12/28 Javascript
JS多物体 任意值 链式 缓冲运动
2012/08/10 Javascript
js页面跳转的常用方法整理
2013/10/18 Javascript
jquery 模板的应用示例
2013/11/12 Javascript
Eclipse去除js(JavaScript)验证错误
2014/02/11 Javascript
jquery插件开发之实现google+圈子选择功能
2014/03/10 Javascript
Jquery焦点图实例代码
2014/11/25 Javascript
JS中的Replace方法使用经验分享
2015/05/20 Javascript
JS实时弹出新消息提示框并有提示音响起的实现代码
2016/04/20 Javascript
Seajs是什么及sea.js 由来,特点以及优势
2016/10/13 Javascript
基于jQuery实现弹幕APP
2017/02/10 Javascript
微信小程序 弹框和模态框实现代码
2017/03/10 Javascript
vue props传值失败 输出undefined的解决方法
2018/09/11 Javascript
layui--select使用以及下拉框实现键盘选择的例子
2019/09/24 Javascript
使用layer模态框给新页面传值的方法
2019/09/27 Javascript
你可能从未使用过的11+个JavaScript特性(小结)
2020/01/08 Javascript
Jquery使用each函数实现遍历及数组处理
2020/07/14 jQuery
JS中循环遍历数组的四种方式总结
2021/01/23 Javascript
[26:40]DOTA2上海特级锦标赛A组资格赛#1 Secret VS MVP.Phx第一局
2016/02/25 DOTA
简介Django框架中可使用的各类缓存
2015/07/23 Python
python基础之入门必看操作
2017/07/26 Python
解决python使用open打开文件中文乱码的问题
2017/12/29 Python
flask框架json数据的拿取和返回操作示例
2019/11/28 Python
详解background属性的8个属性值(面试题)
2020/11/02 HTML / CSS
Oroton中国官网:澳洲知名奢侈配饰品牌
2017/03/26 全球购物
机电一体化大学生求职信
2013/11/08 职场文书
在校生自我鉴定
2014/01/23 职场文书
办公室主任主任岗位责任制
2014/02/11 职场文书
无毒社区工作方案
2014/05/23 职场文书
应届生自荐书
2014/06/23 职场文书
朋友离别感言
2015/08/04 职场文书
Android Studio实现带三角函数对数运算功能的高级计算器
2022/05/20 Java/Android