91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

nodejs如何制作爬蟲實現批量下載圖片

發布時間:2021-06-22 11:27:51 來源:億速云 閱讀:166 作者:小新 欄目:web開發

小編給大家分享一下nodejs如何制作爬蟲實現批量下載圖片,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!

今天想獲取一大批貓的圖片,然后就在360流浪器搜索框中輸入 ,然后點擊圖片。就看到了一大波貓的圖片: http://image.so.com/i?q=%E7%8... ,我在想啊,要是審查元素,一張張手動下載,多麻煩,所以打算寫程序來實現。不寫不知道,一寫發現里面還是有很多道道的。

nodejs如何制作爬蟲實現批量下載圖片

1. 爬取圖片鏈接

因為之前也寫過nodejs爬蟲功能(參見: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關心的最后產生的值。

提供了兩種方式:

并行執行。 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的間隔能確保每張圖片下載完全。

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){
    //
   });
}

看完了這篇文章,相信你對“nodejs如何制作爬蟲實現批量下載圖片”有了一定的了解,如果想了解更多相關知識,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

正安县| 景洪市| 东乌| 海宁市| 丰都县| 佛坪县| 湘阴县| 旌德县| 武功县| 郯城县| 尼木县| 调兵山市| 房山区| 商丘市| 裕民县| 上栗县| 彰化县| 施秉县| 宜君县| 阿坝| 社会| 合肥市| 克东县| 沁阳市| 夏邑县| 六安市| 兴城市| 兰坪| 三原县| 长沙县| 大连市| 酒泉市| 乐至县| 桦南县| 连山| 新兴县| 永新县| 印江| 红原县| 温州市| 东城区|