nodejs制作爬虫实现批量下载图片

发布时间 - 2026-01-11 01:10:36    点击率:

今天想获取一大批猫的图片,然后就在360流浪器搜索框中输入 ,然后点击图片。就看到了一大波猫的图片: http://image.so.com/i?q=%E7%8... ,我在想啊,要是审查元素,一张张手动下载,多麻烦,所以打算写程序来实现。不写不知道,一写发现里面还是有很多道道的。

1. 爬取图片链接

因为之前也写过nodejs爬虫功能(参见:NodeJS制作爬虫全过程 ),所以觉得应该很简单,就用cheerio来处理dom啦,结果打印一下啥也没有,后来查看源代码:

发现 waterfall_zoom 里面空空如也,查找了一下,发现所有的数据都是写在 <script> 里面,然后动态加载到页面的,所以用cheerio.load到的页面里面其实没数据的。真实数据:

分析完毕,刷刷写代码:

var request = require('request');
var cheerio = require('cheerio');
var url = 'http://image.so.com/i?q=%E7%8C%AB&src=tab_www';

request(url,function(err,res,body){
  if(!err && res.statusCode === 200){
    var $ = cheerio.load(body);
    var imgList = []
    JSON.parse($('script[id="initData"]').html()).list.forEach(function(item){
      imgList.push(item.img)
    });
    console.log(imgList);
  }
});

2. 下载图片到本地 2.1 粗糙的方案

最初的思路很简单,简单的 fs.createWriteStream() 就能解决:

var downloadPic = function(src, dest){
  request(src).pipe(fs.createWriteStream(dest)).on('close',function(){
    console.log('pic saved!')
  })
}

使用方式:

downloadPic(imgList[0],'./catpics/1.jpg');

成功捕获一只猫!然后写了一个循环准备捕获所有猫。然而这种方式是串行的,速度很慢!下载一大批图片要花大量时间。

2.2 使用async异步批量下载

关于async的map操作,详见: async_demo/map.js ,对集合中的每一个元素,执行某个异步操作,得到结果。所有的结果将汇总到最终的callback里。与forEach的区别是,forEach只关心操作不管最后的值,而map关心的最后产生的值。

提供了两种方式:

并行执行。 async.map 同时对集合中所有元素进行操作,结果汇总到最终callback里。如果出错,则立刻返回错误以及已经执行完的任务的结果,未执行完的占个空位

顺序执行。 async.mapSeries 对集合中的元素一个一个执行操作,结果汇总到最终callback里。如果出错,则立刻返回错误以及已经执行完的结果,未执行的被忽略。

在此处:

async.mapSeries(imgList,function(item, callback){
  setTimeout(function(){
    downloadPic(item, './catpics/'+ (new Date()).getTime() +'.jpg');
    callback(null, item);
  },400);
}, function(err, results){});

注: 此处使用setTimeout,是因为下载需要一定时间,在笔者较慢网速下,需要400ms的间隔能确保每张图片下载完全。

成功捕获一批猫猫!

2.3 使用bagpipe批量

bagpipe 是朴灵大大做的一个在nodejs中控制并发执行的模块。其安装和使用也比较简单:

npm install bagpipe --save

使用:

var Bagpipe = require('bagpipe');

var bagpipe = new Bagpipe(10);
var files = ['这里有很多很多文件'];
for(vari =0; i < files.length; i++){
  bagpipe.push(fs.readFile, files[i], 'utf-8',function(err, data){
    ...
  });
}

在此处:

var bagpipe = new Bagpipe(10,{timeout: 100});
for(var i = 0; i < imgList.length; i++) {
  console.log('i:'+i)
  bagpipe.push(downloadPic, imgList[i], './catpics/'+ i +'.jpg', function(err, data){
    //
   });
}

3.总结

作为一个程序员,能用程序解决就不手动解决。每一次尝都会有新的收获。


# nodejs实现爬虫  # nodejs实现网络爬虫  # nodejs  # 爬虫  # nodejs批量下载图片的实现方法  # node.js读取Excel数据(下载图片)的方法示例  # 详解node.js 下载图片的 2 种方式  # angular.js+node.js实现下载图片处理详解  # 利用Node.js批量抓取高清妹子图片实例教程  # Node.js批量给图片加水印的方法  # Node.js读写文件之批量替换图片的实现方法  # 用Node.js通过sitemap.xml批量抓取美女图片  # Node.js实现批量下载图片简单操作示例  # 有很多  # 很简单  # 大波  # 都是  # 会有  # 是因为  # 我在  # 就在  # 就能  # 就不  # 两种  # 空空如也  # 找了  # 写了  # 作为一个  # 就看  # 就用  # 来实现  # 写在  # 要花 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Python图片处理进阶教程_Pillow滤镜与图像增强  如何正确选择百度移动适配建站域名?  php后缀怎么变mp4格式错误_修改扩展名提示格式不对怎么办【技巧】  Laravel如何使用Laravel Vite编译前端_Laravel10以上版本前端静态资源管理【教程】  Laravel如何记录自定义日志?(Log频道配置)  iOS发送验证码倒计时应用  Laravel DB事务怎么使用_Laravel数据库事务回滚操作  Laravel怎么实现观察者模式Observer_Laravel模型事件监听与解耦开发【指南】  如何自定义建站之星网站的导航菜单样式?  如何快速登录WAP自助建站平台?  Laravel Pest测试框架怎么用_从PHPUnit转向Pest的Laravel测试教程  Win11怎么设置默认图片查看器_Windows11照片应用关联设置  JavaScript如何操作视频_媒体API怎么控制播放  郑州企业网站制作公司,郑州招聘网站有哪些?  Linux系统命令中screen命令详解  小米17系列还有一款新机?主打6.9英寸大直屏和旗舰级影像  Laravel怎么使用artisan命令缓存配置和视图  车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?  如何快速辨别茅台真假?关键步骤解析  Laravel怎么做数据加密_Laravel内置Crypt门面的加密与解密功能  Laravel的契約(Contracts)是什么_深入理解Laravel Contracts与依赖倒置  Laravel如何使用Telescope进行调试?(安装和使用教程)  LinuxShell函数封装方法_脚本复用设计思路【教程】  海南网站制作公司有哪些,海口网是哪家的?  如何在Tomcat中配置并部署网站项目?  如何快速搭建支持数据库操作的智能建站平台?  Chrome浏览器标签页分组怎么用_谷歌浏览器整理标签页技巧【效率】  laravel怎么配置Redis作为缓存驱动_laravel Redis缓存配置教程  韩国代理服务器如何选?解析IP设置技巧与跨境访问优化指南  Laravel如何集成Inertia.js与Vue/React?(安装配置)  利用 Google AI 进行 YouTube 视频 SEO 描述优化  网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?  微信小程序 配置文件详细介绍  JavaScript数据类型有哪些_如何准确判断一个变量的类型  合肥制作网站的公司有哪些,合肥聚美网络科技有限公司介绍?  网站制作软件有哪些,制图软件有哪些?  零基础网站服务器架设实战:轻量应用与域名解析配置指南  如何用AI一键生成爆款短视频文案?小红书AI文案写作指令【教程】  php结合redis实现高并发下的抢购、秒杀功能的实例  香港服务器租用费用高吗?如何避免常见误区?  Laravel如何实现本地化和多语言支持_Laravel多语言配置与翻译文件管理  Linux系统运维自动化项目教程_Ansible批量管理实战  三星网站视频制作教程下载,三星w23网页如何全屏?  深圳防火门网站制作公司,深圳中天明防火门怎么编码?  黑客如何通过漏洞一步步攻陷网站服务器?  如何在建站主机中优化服务器配置?  Python3.6正式版新特性预览  Laravel如何自定义分页视图?(Pagination示例)  如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?  焦点电影公司作品,电影焦点结局是什么?