国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

nodejs批量下載圖片的實現方法

2019-11-19 16:33:02
字體:
來源:轉載
供稿:網友

今天想獲取一大批貓的圖片,然后就在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.總結

作為一個程序員,能用程序解決就不手動解決。每一次嘗都會有新的收獲。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 金川县| 防城港市| 富蕴县| 渭南市| 都匀市| 陵水| 巴中市| 承德县| 虎林市| 翁源县| 台江县| 乌恰县| 曲阳县| 沙湾县| 来安县| 沁源县| 高清| 红原县| 伊吾县| 新龙县| 新和县| 安陆市| 阿合奇县| 岑巩县| 灵川县| 余庆县| 丰原市| 互助| 聂拉木县| 德钦县| 仁寿县| 偃师市| 盖州市| 乌兰县| 宜州市| 台中县| 大方县| 玉溪市| 花垣县| 涞源县| 吉隆县|