欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

nodejs批量下載圖片的實現(xiàn)方法

 更新時間:2017年05月19日 09:32:42   作者:芒果屋里的貓  
本篇文章主要介紹了nodejs批量下載圖片的實現(xiàn)方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

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

1. 爬取圖片鏈接

因為之前也寫過nodejs爬蟲功能,所以覺得應該很簡單,就用cheerio來處理dom啦,結果打印一下啥也沒有,后來查看源代碼:

發(fā)現(xiàn)waterfall_zoom里面空空如也,查找了一下,發(fā)現(xiàn)所有的數據都是寫在<script>里面,然后動態(tài)加載到頁面的,所以用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');

 

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

2.2 使用async異步批量下載

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

提供了兩種方式:

  1. 并行執(zhí)行。async.map同時對集合中所有元素進行操作,結果匯總到最終callback里。如果出錯,則立刻返回錯誤以及已經執(zhí)行完的任務的結果,未執(zhí)行完的占個空位
  2. 順序執(zhí)行。async.mapSeries對集合中的元素一個一個執(zhí)行操作,結果匯總到最終callback里。如果出錯,則立刻返回錯誤以及已經執(zhí)行完的結果,未執(zhí)行的被忽略。

在此處:

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中控制并發(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){
    //
   });
}

3.總結

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

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

相關文章

  • Node.js 條形碼識別程序構建思路詳解

    Node.js 條形碼識別程序構建思路詳解

    這篇文章主要介紹了Node.js 條形碼識別程序構建思路詳解的相關資料,需要的朋友可以參考下
    2016-02-02
  • cnpm安裝詳細步驟(附圖文!)

    cnpm安裝詳細步驟(附圖文!)

    由于npm軟件包管理器有時可能不太穩(wěn)定,安裝依賴包容易報錯,所以就有了cnpm,這篇文章主要給大家介紹了關于cnpm安裝的相關資料,文中通過圖文介紹的非常詳細,需要的朋友可以參考下
    2023-02-02
  • node.js抓取并分析網頁內容有無特殊內容的js文件

    node.js抓取并分析網頁內容有無特殊內容的js文件

    nodejs獲取網頁內容綁定data事件,獲取到的數據會分幾次相應,如果想全局內容匹配,需要等待請求結束,在end結束事件里把累積起來的全局數據進行操作,本文給大家介紹node.js抓取并分析網頁內容有無特殊內容的js文件,需要的朋友參考下
    2015-11-11
  • Node.js 緩沖區(qū)(Buffer)模塊的方法及實例分析

    Node.js 緩沖區(qū)(Buffer)模塊的方法及實例分析

    在本篇文章里小編給大家整理了一篇關于Node.js 緩沖區(qū)(Buffer)模塊的方法及實例分析,對此有興趣的朋友們可以跟著學習下。
    2022-01-01
  • 輕松創(chuàng)建nodejs服務器(2):nodejs服務器的構成分析

    輕松創(chuàng)建nodejs服務器(2):nodejs服務器的構成分析

    這篇文章主要介紹了輕松創(chuàng)建nodejs服務器(2):nodejs服務器的構成分析,本文是對第一節(jié)中簡單服務器的代碼進行分析總結,需要的朋友可以參考下
    2014-12-12
  • node指定內存上限簡單代碼實例

    node指定內存上限簡單代碼實例

    NodeJS啟動的應用,內存使用是有上限的,下面這篇文章主要給大家介紹了關于node指定內存上限的相關資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2023-11-11
  • 詳解Nodejs內存治理

    詳解Nodejs內存治理

    本篇文章給大家分享了Nodejs內存處理相關的知識點以及實例代碼分享,有興趣的朋友跟著學習下。
    2018-05-05
  • 安裝Node.js并創(chuàng)建Web程序

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

    這篇文章介紹了安裝Node.js并創(chuàng)建Web程序的方法,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-04-04
  • nodejs中實現(xiàn)修改用戶路由功能

    nodejs中實現(xiàn)修改用戶路由功能

    這篇文章主要介紹了nodejs中實現(xiàn)修改用戶路由功能,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值 ,需要的朋友可以參考下
    2019-05-05
  • Node.js中JavaScript操作MySQL的常用方法整理

    Node.js中JavaScript操作MySQL的常用方法整理

    這篇文章主要介紹了Node.js中JavaScript操作MySQL的常用方法整理,包括作者對使用MySQL模塊連接池時錯誤解決的一個記錄,需要的朋友可以參考下
    2016-03-03

最新評論