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中启用ECMAScript 6小结(windos以及Linux)
Jul 15 NodeJs
Nodejs异步回调的优雅处理方法
Sep 25 NodeJs
轻松创建nodejs服务器(1):一个简单nodejs服务器例子
Dec 18 NodeJs
nodejs调用cmd命令实现复制目录
May 04 NodeJs
Nodejs Stream 数据流使用手册
Apr 17 NodeJs
初探nodeJS
Jan 24 NodeJs
NodeJs入门教程之定时器和队列
Mar 08 NodeJs
关于NodeJS中的循环引用详解
Jul 23 NodeJs
NodeJs crypto加密制作token的实现代码
Nov 15 NodeJs
在nodejs中创建child process的方法
Jan 26 NodeJs
一文秒懂nodejs中的异步编程
Jan 28 NodeJs
详解NodeJS模块化
Jun 15 NodeJs
NodeJs使用webpack打包项目的方法详解
Feb 28 #NodeJs
node快速搭建后台的实现步骤
nodejs利用readline提示输入内容实例代码
详解NodeJS模块化
NodeJs内存占用过高的排查实战记录
详解nodejs内置模块
May 06 #NodeJs
浅谈JS和Nodejs中的事件驱动
May 05 #NodeJs
You might like
PHP数据库万能引擎类adodb配置使用以及实例集锦
2014/06/12 PHP
ThinkPHP查询中的魔术方法简述
2014/06/25 PHP
Javascript学习笔记7 原型链的原理
2010/01/11 Javascript
Jquery优化效率 提升性能解决方案
2010/09/06 Javascript
js 调用本地exe的例子(支持IE内核的浏览器)
2012/12/26 Javascript
jsvascript图像处理—(计算机视觉应用)图像金字塔
2013/01/15 Javascript
jQuery cdn使用介绍
2013/05/08 Javascript
parentElement,srcElement的使用小结
2014/01/13 Javascript
jquery实现的导航固定效果
2014/04/28 Javascript
jquery实现美观的导航菜单鼠标提示特效代码
2015/09/06 Javascript
jQuery常用的一些技巧汇总
2016/03/26 Javascript
基于d3.js实现实时刷新的折线图
2016/08/03 Javascript
js html5 css俄罗斯方块游戏再现
2016/10/17 Javascript
JS检测window.open打开的窗口是否关闭
2017/06/25 Javascript
jQuery除指定区域外点击任何地方隐藏DIV功能
2017/11/13 jQuery
JavaScript封闭函数及常用内置对象示例
2019/05/13 Javascript
使用localStorage替代cookie做本地存储
2019/09/25 Javascript
[14:25]教你分分钟做大人:主宰(HEROS)
2014/12/08 DOTA
用Python生成器实现微线程编程的教程
2015/04/13 Python
python实现类的静态变量用法实例
2015/05/08 Python
Django框架中数据的连锁查询和限制返回数据的方法
2015/07/17 Python
两个使用Python脚本操作文件的小示例分享
2015/08/27 Python
python进程管理工具supervisor的安装与使用教程
2017/09/05 Python
在Python中Dataframe通过print输出多行时显示省略号的实例
2018/12/22 Python
python输入错误后删除的方法
2019/10/12 Python
GDAL 矢量属性数据修改方式(python)
2020/03/10 Python
Python更换pip源方法过程解析
2020/05/19 Python
HTML5学习心得总结(推荐)
2016/07/08 HTML / CSS
法国女性内衣购物网站:Glamuse
2019/05/13 全球购物
李维斯法国官网:Levi’s法国
2019/07/13 全球购物
自我评价个人范文
2013/12/16 职场文书
优秀教师主要事迹
2014/02/01 职场文书
体育课课后反思
2014/04/24 职场文书
护士年终考核评语
2014/12/31 职场文书
毕业生政审意见范文
2015/06/04 职场文书
SQL基础的查询语句
2021/11/11 MySQL