全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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

今天想获取一大批猫的图片,然后就在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实现批量下载图片简单操作示例  # 有很多  # 很简单  # 大波  # 都是  # 会有  # 是因为  # 我在  # 就在  # 就能  # 就不  # 两种  # 空空如也  # 找了  # 写了  # 作为一个  # 就看  # 就用  # 来实现  # 写在  # 要花 


相关文章: 在线制作视频网站免费,都有哪些好的动漫网站?  如何在阿里云高效完成企业建站全流程?  网站好制作吗知乎,网站开发好学吗?有什么技巧?  如何在Golang中使用encoding/gob序列化对象_存储和传输数据  宝华建站服务条款解析:五站合一功能与SEO优化设置指南  常州企业网站制作公司,全国继续教育网怎么登录?  如何高效生成建站之星成品网站源码?  如何在阿里云虚拟主机上快速搭建个人网站?  网站制作壁纸教程视频,电脑壁纸网站?  魔毅自助建站系统:模板定制与SEO优化一键生成指南  如何快速搭建安全的FTP站点?  广州美橙建站如何快速搭建多端合一网站?  如何选择香港主机高效搭建外贸独立站?  详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)  高防服务器如何保障网站安全无虞?  北京制作网站的公司,北京铁路集团官方网站?  建站主机类型有哪些?如何正确选型  建站之星如何修改网站生成路径?  小型网站制作HTML,*游戏网站怎么搭建?  网站海报制作教学视频教程,有什么免费的高清可商用图片网站,用于海报设计?  ,怎么在广州志愿者网站注册?  如何零基础开发自助建站系统?完整教程解析  定制建站是什么?如何实现个性化需求?  网站制作新手教程,新手建设一个网站需要注意些什么?  香港服务器如何优化才能显著提升网站加载速度?  如何配置IIS站点权限与局域网访问?  如何在云主机快速搭建网站站点?  如何通过免费商城建站系统源码自定义网站主题与功能?  动图在线制作网站有哪些,滑动动图图集怎么做?  电商网站制作多少钱一个,电子商务公司的网站制作费用计入什么科目?  网站制作说明怎么写,简述网页设计的流程并说明原因?  国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?  建站主机CVM配置优化、SEO策略与性能提升指南  微课制作网站有哪些,微课网怎么进?  如何在IIS中新建站点并解决端口绑定冲突?  洛阳网站制作公司有哪些,洛阳的招聘网站都有哪些?  深圳网站制作的公司有哪些,dido官方网站?  如何零基础在云服务器搭建WordPress站点?  家庭建站与云服务器建站,如何选择更优?  七夕网站制作视频,七夕大促活动怎么报名?  成都网站制作价格表,现在成都广电的单独网络宽带有多少的,资费是什么情况呢?  淘宝制作网站有哪些,淘宝网官网主页?  建站主机SSH密钥生成步骤及常见问题解答?  上海网站制作开发公司,上海买房比较好的网站有哪些?  杭州银行网站设计制作流程,杭州银行怎么开通认证方式?  制作网站的网址是什么,请问后缀为.com和.com.cn还有.cn的这三种网站是分别是什么类型的网站?  内网网站制作软件,内网的网站如何发布到外网?  建站之星官网登录失败?如何快速解决?  如何打造高效商业网站?建站目的决定转化率  已有域名如何快速搭建专属网站? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。