亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

nodejs制作爬蟲(chóng)實(shí)現(xiàn)批量下載圖片

 更新時(shí)間:2017年05月19日 08:50:13   作者:芒果屋里的貓  
本文給大家分享的是作者使用nodejs制作爬蟲(chóng)來(lái)爬去圖片并批量下載的全過(guò)程,非常的細(xì)致,有需要的小伙伴可以參考下

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

1. 爬取圖片鏈接

因?yàn)橹耙矊?xiě)過(guò)nodejs爬蟲(chóng)功能(參見(jiàn):NodeJS制作爬蟲(chóng)全過(guò)程 ),所以覺(jué)得應(yīng)該很簡(jiǎn)單,就用cheerio來(lái)處理dom啦,結(jié)果打印一下啥也沒(méi)有,后來(lái)查看源代碼:

發(fā)現(xiàn) waterfall_zoom 里面空空如也,查找了一下,發(fā)現(xiàn)所有的數(shù)據(jù)都是寫(xiě)在 <script> 里面,然后動(dòng)態(tài)加載到頁(yè)面的,所以用cheerio.load到的頁(yè)面里面其實(shí)沒(méi)數(shù)據(jù)的。真實(shí)數(shù)據(jù):

分析完畢,刷刷寫(xiě)代碼:

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 粗糙的方案

最初的思路很簡(jiǎn)單,簡(jiǎn)單的 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');

成功捕獲一只貓!然后寫(xiě)了一個(gè)循環(huán)準(zhǔn)備捕獲所有貓。然而這種方式是串行的,速度很慢!下載一大批圖片要花大量時(shí)間。

2.2 使用async異步批量下載

關(guān)于async的map操作,詳見(jiàn): async_demo/map.js ,對(duì)集合中的每一個(gè)元素,執(zhí)行某個(gè)異步操作,得到結(jié)果。所有的結(jié)果將匯總到最終的callback里。與forEach的區(qū)別是,forEach只關(guān)心操作不管最后的值,而map關(guān)心的最后產(chǎn)生的值。

提供了兩種方式:

并行執(zhí)行。 async.map 同時(shí)對(duì)集合中所有元素進(jìn)行操作,結(jié)果匯總到最終callback里。如果出錯(cuò),則立刻返回錯(cuò)誤以及已經(jīng)執(zhí)行完的任務(wù)的結(jié)果,未執(zhí)行完的占個(gè)空位

順序執(zhí)行。 async.mapSeries 對(duì)集合中的元素一個(gè)一個(gè)執(zhí)行操作,結(jié)果匯總到最終callback里。如果出錯(cuò),則立刻返回錯(cuò)誤以及已經(jīng)執(zhí)行完的結(jié)果,未執(zhí)行的被忽略。

在此處:

async.mapSeries(imgList,function(item, callback){
  setTimeout(function(){
    downloadPic(item, './catpics/'+ (new Date()).getTime() +'.jpg');
    callback(null, item);
  },400);
}, function(err, results){});

注: 此處使用setTimeout,是因?yàn)橄螺d需要一定時(shí)間,在筆者較慢網(wǎng)速下,需要400ms的間隔能確保每張圖片下載完全。

成功捕獲一批貓貓!

2.3 使用bagpipe批量

bagpipe 是樸靈大大做的一個(gè)在nodejs中控制并發(fā)執(zhí)行的模塊。其安裝和使用也比較簡(jiǎn)單:

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.總結(jié)

作為一個(gè)程序員,能用程序解決就不手動(dòng)解決。每一次嘗都會(huì)有新的收獲。

相關(guān)文章

  • 如何使用?Node.js?將?MongoDB?連接到您的應(yīng)用程序

    如何使用?Node.js?將?MongoDB?連接到您的應(yīng)用程序

    NoSQL?數(shù)據(jù)庫(kù)對(duì)于處理大量分布式數(shù)據(jù)非常有用,我們可以在這個(gè)數(shù)據(jù)庫(kù)中存儲(chǔ)信息,對(duì)其進(jìn)行管理,這篇文章主要介紹了使用?Node.js?將?MongoDB?連接到您的應(yīng)用程序,需要的朋友可以參考下
    2022-09-09
  • 簡(jiǎn)單了解node npm cnpm的具體使用方法

    簡(jiǎn)單了解node npm cnpm的具體使用方法

    這篇文章主要介紹了簡(jiǎn)單了解node npm cnpm的具體使用方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-02-02
  • node.js的exports、module.exports與ES6的export、export default深入詳解

    node.js的exports、module.exports與ES6的export、export default深入詳解

    這篇文章主要給大家介紹了關(guān)于node.js中的exports、module.exports與ES6中的export、export default到時(shí)是什么的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-10-10
  • 安裝Node.js并創(chuàng)建Web程序

    安裝Node.js并創(chuàng)建Web程序

    這篇文章介紹了安裝Node.js并創(chuàng)建Web程序的方法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • Node.js編碼規(guī)范

    Node.js編碼規(guī)范

    編碼規(guī)范比比皆是,但是很少有公司做好編碼規(guī)范的。忍不住想談?wù)劸幋a規(guī)范的重要性,希望所有人都能夠重視起來(lái)。
    2014-07-07
  • 使用Node.js創(chuàng)建本地HTTP服務(wù)器并實(shí)現(xiàn)異地遠(yuǎn)程訪(fǎng)問(wèn)的方法

    使用Node.js創(chuàng)建本地HTTP服務(wù)器并實(shí)現(xiàn)異地遠(yuǎn)程訪(fǎng)問(wèn)的方法

    Node.js 是能夠在服務(wù)器端運(yùn)行 JavaScript 的開(kāi)放源代碼、跨平臺(tái)運(yùn)行環(huán)境,這篇文章主要介紹了如何使用Node.js快速創(chuàng)建本地HTTP服務(wù)器并實(shí)現(xiàn)異地遠(yuǎn)程訪(fǎng)問(wèn),需要的朋友可以參考下
    2024-01-01
  • Node.js的基本應(yīng)用你知道多少

    Node.js的基本應(yīng)用你知道多少

    這篇文章主要為大家詳細(xì)介紹了Node.js的基本應(yīng)用,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-02-02
  • NodeJS讀取分析Nginx錯(cuò)誤日志的方法

    NodeJS讀取分析Nginx錯(cuò)誤日志的方法

    這篇文章主要介紹了NodeJS讀取分析Nginx錯(cuò)誤日志的相關(guān)知識(shí),本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-05-05
  • Node.js如何實(shí)現(xiàn)注冊(cè)郵箱激活功能 (常見(jiàn))

    Node.js如何實(shí)現(xiàn)注冊(cè)郵箱激活功能 (常見(jiàn))

    今天了解了node如何實(shí)現(xiàn)郵箱激活功能,這個(gè)功能非常常見(jiàn),當(dāng)我們注冊(cè)一個(gè)賬號(hào)時(shí),肯定會(huì)有這步,下面看下如何實(shí)現(xiàn)這個(gè)功能
    2017-07-07
  • NodeJs實(shí)現(xiàn)簡(jiǎn)易WEB上傳下載服務(wù)器

    NodeJs實(shí)現(xiàn)簡(jiǎn)易WEB上傳下載服務(wù)器

    這篇文章主要為大家詳細(xì)介紹了NodeJs實(shí)現(xiàn)一個(gè)簡(jiǎn)易WEB上傳下載服務(wù)器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-08-08

最新評(píng)論