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 实现模拟form表单上传文件
Jul 14 NodeJs
nodejs中实现阻塞实例
Mar 24 NodeJs
浅析Nodejs npm常用命令
Jun 14 NodeJs
nodeJS实现路由功能实例代码
Jun 08 NodeJs
浅谈nodejs中的类定义和继承的套路
Jul 26 NodeJs
nodejs动态创建二维码的方法
Aug 12 NodeJs
nodejs中密码加密处理操作详解
Mar 20 NodeJs
详解从NodeJS搭建中间层再谈前后端分离
Nov 13 NodeJs
NodeJs 文件系统操作模块fs使用方法详解
Nov 26 NodeJs
详解nodejs解压版安装和配置(带有搭建前端项目脚手架)
Dec 06 NodeJs
nodejs 使用http进行post或get请求的实例(携带cookie)
Jan 03 NodeJs
nodejs脚本centos开机启动实操方法
Mar 04 NodeJs
NodeJs使用webpack打包项目的方法详解
Feb 28 #NodeJs
node快速搭建后台的实现步骤
nodejs利用readline提示输入内容实例代码
详解NodeJS模块化
NodeJs内存占用过高的排查实战记录
详解nodejs内置模块
May 06 #NodeJs
浅谈JS和Nodejs中的事件驱动
May 05 #NodeJs
You might like
php中get_defined_constants函数用法实例分析
2015/05/12 PHP
JavaScript 学习 - 提高篇
2007/02/02 Javascript
js改变文章字体大小的实例代码
2013/11/27 Javascript
使用AngularJS制作一个简单的RSS阅读器的教程
2015/06/18 Javascript
12个超实用的JQuery代码片段
2015/11/02 Javascript
jQuery Validate表单验证入门学习
2015/12/18 Javascript
AngularJS  自定义指令详解及实例代码
2016/09/14 Javascript
JS中微信小程序自定义底部弹出框
2016/12/22 Javascript
nodejs基于express实现文件上传的方法
2018/03/19 NodeJs
QQ跳转支付宝并自动领红包脚本(最新)
2018/06/22 Javascript
JavaScript 格式化数字、金额、千分位、保留几位小数、舍入舍去
2019/07/23 Javascript
解决ele ui 表格表头太长问题的实现
2019/11/13 Javascript
Javascript模块化机制实现原理详解
2020/04/02 Javascript
layui实现显示数据表格、搜索和修改功能示例
2020/06/03 Javascript
基于python中staticmethod和classmethod的区别(详解)
2017/10/24 Python
对Python3 goto 语句的使用方法详解
2019/02/16 Python
详解Python 爬取13个旅游城市,告诉你五一大家最爱去哪玩?
2019/05/07 Python
python中使用ctypes调用so传参设置遇到的问题及解决方法
2019/06/19 Python
Django 全局的static和templates的使用详解
2019/07/19 Python
Python稀疏矩阵及参数保存代码实现
2020/04/18 Python
Python如何在单元测试中给对象打补丁
2020/08/03 Python
美国著名童装品牌:OshKosh B’gosh
2016/08/05 全球购物
DNA基因检测和分析:23andMe
2019/05/01 全球购物
铭立家具面试题
2012/12/06 面试题
C#面试常见问题
2013/02/25 面试题
《故都的秋》教学反思
2014/04/15 职场文书
2015年幼儿园保育员工作总结
2015/04/23 职场文书
污水处理保证书
2015/05/09 职场文书
西游降魔篇观后感
2015/06/15 职场文书
我爱我班主题班会
2015/08/13 职场文书
校园安全学习心得体会
2016/01/18 职场文书
职场中的你,辞职信写对了吗?
2019/06/26 职场文书
《烈火英雄》观后感:致敬和平时代的英雄
2019/11/11 职场文书
JS实现扫雷项目总结
2021/05/19 Javascript
国庆节到了,利用JS实现一个生成国庆风头像的小工具 详解实现过程
2021/10/05 Javascript
小喇叭开始广播了! 四十多年前珍贵老照片
2022/05/09 无线电