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入门详解(多篇文章结合)
Mar 07 NodeJs
NodeJS url验证(url-valid)的使用方法
Nov 18 NodeJs
Nodejs的express使用教程
Nov 23 NodeJs
NodeJs的fs读写删除移动监听
Apr 28 NodeJs
nodejs使用express获取get和post传值及session验证的方法
Nov 09 NodeJs
NodeJs实现定时任务的示例代码
Dec 05 NodeJs
修改Nodejs内置的npm默认配置路径方法
May 13 NodeJs
nodejs express配置自签名https服务器的方法
May 22 NodeJs
nodejs高大上的部署方式(PM2)
Sep 11 NodeJs
nodejs基础之buffer缓冲区用法分析
Dec 26 NodeJs
nodejs基础之多进程实例详解
Dec 27 NodeJs
通过Nodejs搭建网站简单实现注册登录流程
Jun 14 NodeJs
NodeJs使用webpack打包项目的方法详解
Feb 28 #NodeJs
node快速搭建后台的实现步骤
nodejs利用readline提示输入内容实例代码
详解NodeJS模块化
NodeJs内存占用过高的排查实战记录
详解nodejs内置模块
May 06 #NodeJs
浅谈JS和Nodejs中的事件驱动
May 05 #NodeJs
You might like
粗略计算在线时间,bug:ip相同
2006/12/09 PHP
PHP关联链接常用代码
2012/11/05 PHP
php中怎么搜索相关联数组键值及获取之
2013/10/17 PHP
PHP中读取照片exif信息的方法
2014/08/20 PHP
Yii入门教程之目录结构、入口文件及路由设置
2014/11/25 PHP
PHP实现多图上传和单图上传功能
2018/05/17 PHP
jquery 卷帘效果实现代码(不同方向)
2013/02/05 Javascript
简约JS日历控件 实例代码
2013/07/12 Javascript
利用javascript实现全部删或清空所选的操作
2014/05/27 Javascript
浅谈JavaScript实现面向对象中的类
2014/12/09 Javascript
javascript 实现 原路返回
2015/01/21 Javascript
js对字符的验证方法汇总
2015/02/04 Javascript
JavaScript实现按照指定长度为数字前面补零输出的方法
2015/03/19 Javascript
JavaScript获取当前cpu使用率的方法
2015/12/15 Javascript
jquery实现上传文件大小类型的验证例子(推荐)
2016/06/25 Javascript
解决bootstrap导航栏navbar在IE8上存在缺陷的方法
2016/07/01 Javascript
微信小程序 Tab页切换更新数据
2017/01/05 Javascript
微信浏览器禁止页面下拉查看网址实例详解
2017/06/28 Javascript
Javascript es7中比较实用的两个方法示例
2017/07/21 Javascript
微信小程序 Animation实现图片旋转动画示例
2018/08/22 Javascript
Bootstrap-table使用footerFormatter做统计列功能
2018/09/07 Javascript
element-ui 的el-button组件中添加自定义颜色和图标的实现方法
2018/10/26 Javascript
vue cli3.0 引入eslint 结合vscode使用
2019/05/27 Javascript
python 从csv读数据到mysql的实例
2018/06/21 Python
为什么说Python可以实现所有的算法
2019/10/04 Python
Python中bisect的使用方法
2019/12/31 Python
浅谈django 模型类使用save()方法的好处与注意事项
2020/03/28 Python
巴西体育用品商店:Lojão dos Esportes
2018/07/21 全球购物
西班牙最好的在线购买葡萄酒的商店:Vinoseleccion
2019/10/30 全球购物
Yahoo-PHP面试题2
2014/12/06 面试题
信息技术专业大学生职业生涯规划书
2014/01/24 职场文书
活动总结怎么写
2014/04/28 职场文书
常务副总经理任命书
2014/06/05 职场文书
2015年库房工作总结
2015/04/30 职场文书
2016新年晚会开场白
2015/12/03 职场文书
Vue OpenLayer测距功能的实现
2022/04/20 Vue.js