小編給大家分享一下nodejs如何制作爬蟲實(shí)現(xiàn)批量下載圖片,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!
創(chuàng)新互聯(lián)擁有一支富有激情的企業(yè)網(wǎng)站制作團(tuán)隊(duì),在互聯(lián)網(wǎng)網(wǎng)站建設(shè)行業(yè)深耕十余年,專業(yè)且經(jīng)驗(yàn)豐富。十余年網(wǎng)站優(yōu)化營銷經(jīng)驗(yàn),我們已為成百上千家中小企業(yè)提供了網(wǎng)站制作、網(wǎng)站建設(shè)解決方案,按需設(shè)計(jì),設(shè)計(jì)滿意,售后服務(wù)無憂。所有客戶皆提供一年免費(fèi)網(wǎng)站維護(hù)!今天想獲取一大批貓的圖片,然后就在360流浪器搜索框中輸入貓
,然后點(diǎn)擊圖片。就看到了一大波貓的圖片: http://image.so.com/i?q=%E7%8... ,我在想啊,要是審查元素,一張張手動(dòng)下載,多麻煩,所以打算寫程序來實(shí)現(xiàn)。不寫不知道,一寫發(fā)現(xiàn)里面還是有很多道道的。
1. 爬取圖片鏈接
因?yàn)橹耙矊戇^nodejs爬蟲功能(參見:NodeJS制作爬蟲全過程 ),所以覺得應(yīng)該很簡單,就用cheerio來處理dom啦,結(jié)果打印一下啥也沒有,后來查看源代碼:
發(fā)現(xiàn)waterfall_zoom
里面空空如也,查找了一下,發(fā)現(xiàn)所有的數(shù)據(jù)都是寫在里面,然后動(dòng)態(tài)加載到頁面的,所以用cheerio.load到的頁面里面其實(shí)沒數(shù)據(jù)的。真實(shí)數(shù)據(jù):
分析完畢,刷刷寫代碼:
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');
成功捕獲一只貓!然后寫了一個(gè)循環(huán)準(zhǔn)備捕獲所有貓。然而這種方式是串行的,速度很慢!下載一大批圖片要花大量時(shí)間。
2.2 使用async異步批量下載
關(guān)于async的map操作,詳見: async_demo/map.js ,對集合中的每一個(gè)元素,執(zhí)行某個(gè)異步操作,得到結(jié)果。所有的結(jié)果將匯總到最終的callback里。與forEach的區(qū)別是,forEach只關(guān)心操作不管最后的值,而map關(guān)心的最后產(chǎn)生的值。
提供了兩種方式:
并行執(zhí)行。async.map
同時(shí)對集合中所有元素進(jìn)行操作,結(jié)果匯總到最終callback里。如果出錯(cuò),則立刻返回錯(cuò)誤以及已經(jīng)執(zhí)行完的任務(wù)的結(jié)果,未執(zhí)行完的占個(gè)空位
順序執(zhí)行。async.mapSeries
對集合中的元素一個(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í)行的模塊。其安裝和使用也比較簡單:
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如何制作爬蟲實(shí)現(xiàn)批量下載圖片”有了一定的了解,如果想了解更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)網(wǎng)站建設(shè)公司行業(yè)資訊頻道,感謝各位的閱讀!
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)建站www.cdcxhl.com,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。