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极简入门教程(一):模块机制
Oct 25 NodeJs
nodejs批量修改文件编码格式
Jan 22 NodeJs
nodejs URL模块操作URL相关方法介绍
Mar 03 NodeJs
ubuntu下安装nodejs以及升级的办法
May 08 NodeJs
浅析Nodejs npm常用命令
Jun 14 NodeJs
NodeJS爬虫实例之糗事百科
Dec 14 NodeJs
深入理解NodeJS 多进程和集群
Oct 17 NodeJs
nodejs微信开发之授权登录+获取用户信息
Mar 17 NodeJs
nodejs检测因特网是否断开的解决方案
Apr 17 NodeJs
NodeJs实现简易WEB上传下载服务器
Aug 10 NodeJs
图解NodeJS实现登录注册功能
Sep 16 NodeJs
Sublime Text3 配置 NodeJs 环境的方法
May 20 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(3)
2006/10/09 PHP
PHP学习笔记 (1) 环境配置与代码调试
2011/06/19 PHP
PHP采集利器 Snoopy 试用心得
2011/07/03 PHP
php内嵌函数用法实例
2015/03/20 PHP
PHP 模拟登陆功能实例详解
2019/09/10 PHP
List Installed Software Features
2007/06/11 Javascript
javascript 混合的构造函数和原型方式,动态原型方式
2009/12/07 Javascript
关于在IE下的一个安全BUG --可用于跟踪用户的系统鼠标位置
2013/04/17 Javascript
jquery在项目中做复选框时遇到的一些问题笔记
2013/11/17 Javascript
js中的hasOwnProperty和isPrototypeOf方法使用实例
2014/06/06 Javascript
深入理解js函数的作用域与this指向
2016/05/28 Javascript
微信小程序 wx.request(接口调用方式)详解及实例
2016/11/23 Javascript
浅谈javascript中的数据类型转换
2016/12/27 Javascript
微信小程序 安全包括(框架、功能模块、账户使用)详解
2017/01/16 Javascript
微信小程序教程系列之视图层的条件渲染(10)
2017/04/19 Javascript
JS实现前端缓存的方法
2017/09/21 Javascript
jQuery实现购物车的总价计算和总价传值功能
2018/11/28 jQuery
vue实现动态显示与隐藏底部导航的方法分析
2019/02/11 Javascript
详解无限滚动插件vue-infinite-scroll源码解析
2019/05/12 Javascript
使用element-ui的el-menu导航选中后刷新页面保持当前选中状态
2019/07/19 Javascript
JavaScript/TypeScript 实现并发请求控制的示例代码
2021/01/18 Javascript
python 生成不重复的随机数的代码
2011/05/15 Python
Python插件virtualenv搭建虚拟环境
2017/11/20 Python
pandas 读取各种格式文件的方法
2018/06/22 Python
使用Python自动化破解自定义字体混淆信息的方法实例
2019/02/13 Python
对Tensorflow中tensorboard日志的生成与显示详解
2020/02/04 Python
一款利用纯css3实现的360度翻转按钮的实例教程
2014/11/05 HTML / CSS
CSS3自定义滚动条样式 ::webkit-scrollbar的示例代码详解
2020/06/01 HTML / CSS
Gloeilampgoedkoop荷兰:在线购买灯泡
2019/02/16 全球购物
Troy-Bilt官网:草坪割草机、吹雪机、分蘖机等
2019/02/19 全球购物
加拿大在线隐形眼镜和眼镜店:VisionPros
2019/10/06 全球购物
SQL Server里面什么样的视图才能创建索引
2015/04/17 面试题
给同事的道歉信
2014/01/11 职场文书
新娘父亲婚礼致辞
2015/07/27 职场文书
党员公开承诺书2016
2016/03/24 职场文书
简历上的自我评价,该怎么写呢?
2019/06/13 职场文书