全网整合营销服务商

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

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

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

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

1. 爬取图片链接

因为之前也写过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关心的最后产生的值。

提供了两种方式:

  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的间隔能确保每张图片下载完全。

 

成功捕获一批猫猫!

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


相关文章: 网站制作软件免费下载安装,有哪些免费下载的软件网站?  昆明网站制作哪家好,昆明公租房申请网上登录入口?  如何在Golang中实现微服务服务拆分_Golang微服务拆分与接口管理方法  高配服务器限时抢购:企业级配置与回收服务一站式优惠方案  网站按钮制作软件,如何实现网页中按钮的自动点击?  如何在万网开始建站?分步指南解析  高端网站建设与定制开发一站式解决方案 中企动力  如何配置FTP站点权限与安全设置?  TestNG的testng.xml配置文件怎么写  打鱼网站制作软件,波克捕鱼官方号怎么注册?  如何通过.red域名打造高辨识度品牌网站?  如何快速查询网址的建站时间与历史轨迹?  建站之星如何保障用户数据免受黑客入侵?  单页制作网站有哪些,朋友给我发了一个单页网站,我应该怎么修改才能把他变成自己的呢,请求高手指点迷津?  齐河建站公司:营销型网站建设与SEO优化双核驱动策略  如何在Windows服务器上快速搭建网站?  建站主机空间推荐 高性价比配置与快速部署方案解析  制作网页的网站有哪些,电脑上怎么做网页?  建站之星×万网:智能建站系统+自助建站平台一键生成  宝塔建站教程:一键部署配置流程与SEO优化实战指南  武汉外贸网站制作公司,现在武汉外贸前景怎么样啊?  建站主机SSH密钥生成步骤及常见问题解答?  如何在服务器上配置二级域名建站?  图册素材网站设计制作软件,图册的导出方式有几种?  建站主机选购指南:核心配置优化与品牌推荐方案  香港服务器WordPress建站指南:SEO优化与高效部署策略  如何在自有机房高效搭建专业网站?  无锡制作网站公司有哪些,无锡优八网络科技有限公司介绍?  php能控制zigbee模块吗_php通过串口与cc2530 zigbee通信【介绍】  ,制作一个手机app网站要多少钱?  如何快速搭建FTP站点实现文件共享?  一键制作网站软件下载安装,一键自动采集网页文档制作步骤?  建站与域名管理如何高效结合?  如何通过云梦建站系统实现SEO快速优化?  微网站制作教程,我微信里的网站怎么才能复制到浏览器里?  如何破解联通资金短缺导致的基站建设难题?  网站app免费制作软件,能免费看各大网站视频的手机app?  如何打造高效商业网站?建站目的决定转化率  如何快速登录WAP自助建站平台?  如何在IIS管理器中快速创建并配置网站?  如何在阿里云通过域名搭建网站?  ,怎么在广州志愿者网站注册?  可靠的网站设计制作软件,做网站设计需要什么样的电脑配置?  C++如何将C风格字符串(char*)转换为std::string?(代码示例)  网站制作公司哪里好做,成都网站制作公司哪家做得比较好,更正规?  html制作网站的步骤有哪些,iapp如何添加网页?  如何快速重置建站主机并恢复默认配置?  教育培训网站制作流程,请问edu教育网站的域名怎么申请?  宝塔Windows建站如何避免显示默认IIS页面?  网站制作服务平台,有什么网站可以发布本地服务信息? 

您的项目需求

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