nodejs批量下载图片的实现方法


Posted in NodeJs onMay 19, 2017

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

nodejs批量下载图片的实现方法

1. 爬取图片链接

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

nodejs批量下载图片的实现方法

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

nodejs批量下载图片的实现方法

分析完毕,刷刷写代码:

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);
  }
});

nodejs批量下载图片的实现方法

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');

 nodejs批量下载图片的实现方法

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

2.2 使用async异步批量下载

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

提供了两种方式:

  1. 并行执行。async.map同时对集合中所有元素进行操作,结果汇总到最终callback里。如果出错,则立刻返回错误以及已经执行完的任务的结果,未执行完的占个空位
  2. 顺序执行。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的间隔能确保每张图片下载完全。

 nodejs批量下载图片的实现方法

成功捕获一批猫猫!

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与Mysql的交互示例代码
Aug 18 NodeJs
跟我学Nodejs(三)--- Node.js模块
May 25 NodeJs
nodejs 实现模拟form表单上传文件
Jul 14 NodeJs
Nodejs+express+html5 实现拖拽上传
Aug 08 NodeJs
Nodejs从有门道无门菜鸟起飞必看教程
Jul 20 NodeJs
nodejs简单实现操作arduino
Sep 25 NodeJs
深入浅析Nodejs的Http模块
Jun 20 NodeJs
详解IWinter 一个路由转控制器的 Nodejs 库
Nov 15 NodeJs
Nodejs模块载入运行原理
Feb 23 NodeJs
nodejs中密码加密处理操作详解
Mar 20 NodeJs
NodeJs之word文件生成与解析的实现代码
Apr 01 NodeJs
nodejs中各种加密算法的实现详解
Jul 11 NodeJs
nodejs制作爬虫实现批量下载图片
May 19 #NodeJs
详解Windows下安装Nodejs步骤
May 18 #NodeJs
nodejs+websocket实时聊天系统改进版
May 18 #NodeJs
nodejs6下使用koa2框架实例
May 18 #NodeJs
Nodejs中使用captchapng模块生成图片验证码
May 18 #NodeJs
详解使用nodeJs安装Vue-cli
May 17 #NodeJs
NodeJS创建最简单的HTTP服务器
May 15 #NodeJs
You might like
表单复选框向PHP传输数据的代码
2007/11/13 PHP
php修改时间格式的代码
2011/05/29 PHP
php实现过滤表单提交中html标签的方法
2014/10/17 PHP
THinkPHP获取客户端IP与IP地址查询的方法
2016/11/14 PHP
php合并数组并保留键值的实现方法
2018/03/12 PHP
Javascript实现的分页函数
2007/02/07 Javascript
js中将URL中的参数提取出来作为对象的实现代码
2011/08/16 Javascript
jQuery EasyUI 布局之动态添加tabs标签页
2015/11/18 Javascript
Bootstrap学习笔记之css样式设计(2)
2016/06/07 Javascript
几种tab切换详解
2017/02/03 Javascript
详解vue数据渲染出现闪烁问题
2017/06/29 Javascript
vue引入swiper插件的使用实例
2017/07/19 Javascript
vue和webpack安装命令详解
2018/06/15 Javascript
webpack4.x打包过程详解
2018/07/18 Javascript
Angular刷新当前页面的实现方法
2018/11/21 Javascript
js实现金山打字通小游戏
2020/07/24 Javascript
如何利用JS将手机号中间四位变成*号
2020/09/29 Javascript
微信小程序实现天气预报功能(附源码)
2020/12/10 Javascript
[48:39]Ti4主赛事胜者组第一天 EG vs NEWBEE 2
2014/07/19 DOTA
[01:05:59]Mineski vs Secret 2019国际邀请赛淘汰赛 败者组 BO3 第二场 8.22
2019/09/05 DOTA
[55:44]完美世界DOTA2联赛决赛 FTD vs Phoenix 第二场 11.08
2020/11/11 DOTA
python访问纯真IP数据库的代码
2011/05/19 Python
Python实现基本数据结构中队列的操作方法示例
2017/12/04 Python
python将.ppm格式图片转换成.jpg格式文件的方法
2018/10/27 Python
Pytorch修改ResNet模型全连接层进行直接训练实例
2019/09/10 Python
Python中的四种交换数值的方法解析
2019/11/18 Python
Python PyInstaller安装和使用教程详解
2020/01/08 Python
Python解析m3u8拼接下载mp4视频文件的示例代码
2021/03/03 Python
css3编写浏览器背景渐变背景色的方法
2018/03/05 HTML / CSS
Happy Plugs官网:瑞典无线耳机品牌
2020/07/16 全球购物
公务员年总结的自我评价
2013/10/25 职场文书
班级年度安全计划书
2014/05/01 职场文书
运动会口号8字
2014/06/07 职场文书
巾帼文明岗汇报材料
2014/12/24 职场文书
食堂管理制度范本
2015/08/04 职场文书
电工生产实习心得体会
2016/01/22 职场文书