使用nodejs怎么批量下载图片

  介绍

本篇文章为大家展示了使用nodejs怎么批量下载图片,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

<强> 1。爬取图片链接

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

使用nodejs怎么批量下载图片

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

使用nodejs怎么批量下载图片

分析完毕,刷刷写代码:

var  request =,要求(& # 39;请求# 39;);   var  cheerio =,要求(& # 39;加油# 39;);   var  url =, & # 39; http://image.so.com/i?q=%E7%8C%AB&, src=https://www.yisu.com/zixun/tab_www ';      请求(url,函数(呃,res,身体){   如果(!犯错& & res.statusCode===200) {   var=美元cheerio.load(身体);   var imgList=[]   JSON.parse($('脚本(id=" initData "]) . html ()) .list.forEach(函数(项){   imgList.push (item.img)   });   console.log (imgList);   }   });

使用nodejs怎么批量下载图片

<强> 2。下载图片到本地

<强> 2.1粗糙的方案

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

var  downloadPic =,函数(src,桌子){   请求(src)才能.pipe (fs.createWriteStream(桌子))。(& # 39;关闭# 39;函数(){   ,,,console.log (& # 39; pic 得救了! & # 39;)   })才能   }

使用方式:

downloadPic (imgList [0], & # 39;。/catpics/1. jpg # 39;);

, 使用nodejs怎么批量下载图片

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

<强> 2.2使用异步异步批量下载

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

提供了两种方式:

<李>

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

<李>

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

在此处:

async.mapSeries (imgList,函数(项目,,回调){   setTimeout(才能函数(){   ,,,downloadPic(项目,& # 39;。/catpics & # 39; +, (new 日期()).getTime (), + & # 39; jpg # 39;);   ,,,回调(null,,项目);   ,,},400);   },,函数(呃,,结果){});

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

, 使用nodejs怎么批量下载图片

成功捕获一批猫猫!

<强> 2.3使用风笛批量

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

npm  install  bagpipe ——保存

使用:

var  bagpipe =,要求(& # 39;风笛# 39;);      var  bagpipe =, new 风笛(10);   var  files =,(& # 39;这里有很多很多文件& # 39;];   (vari =0,小姐:& lt;, files.length;,我+ +){   bagpipe.push才能(fs.readFile,文件(我),& # 39;utf - 8 # 39;,函数(呃,,数据){   ,,,…   ,,});   }

在此处:

var  bagpipe =, new 风笛(10,{超时:,100});   (var 小姐:=,0;,小姐:& lt;, imgList.length;,我+ +),{   console.log才能(& # 39;我:& # 39;+ i)   bagpipe.push才能(downloadPic, imgList[我],& # 39;。/catpics/& # 39; +,小姐:+ & # 39;jpg # 39;,,函数(呃,,数据){   ,,//,,});   }

使用nodejs怎么批量下载图片