最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

基于nodejs 的多頁面爬蟲實例代碼

 更新時間:2017年05月31日 09:24:15   作者:藍色的秋風  
本篇文章主要介紹了基于nodejs 的多頁面爬蟲 ,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

前言

前端時間再回顧了一下node.js,于是順勢做了一個爬蟲來加深自己對node的理解。

主要用的到是request,cheerio,async三個模塊

request

用于請求地址和快速下載圖片流。 https://github.com/request/request

cheerio

為服務器特別定制的,快速、靈活、實施的jQuery核心實現(xiàn).

便于解析html代碼。 https://www.npmjs.com/package/cheerio

async

異步調(diào)用,防止堵塞。 http://caolan.github.io/async/

核心思路

  1. 用request 發(fā)送一個請求。獲取html代碼,取得其中的img標簽和a標簽。
  2. 通過獲取的a表情進行遞歸調(diào)用。不斷獲取img地址和a地址,繼續(xù)遞歸
  3. 獲取img地址通過request(photo).pipe(fs.createWriteStream(dir + “/” + filename));進行快速下載。
function requestall(url) {

 request({

  uri: url,

  headers: setting.header

 }, function (error, response, body) {

  if (error) {

   console.log(error);

  } else {

   console.log(response.statusCode);

   if (!error && response.statusCode == 200) {

    var $ = cheerio.load(body);

    var photos = [];

    $('img').each(function () {

     // 判斷地址是否存在

     if ($(this).attr('src')) {

      var src = $(this).attr('src');

      var end = src.substr(-4, 4).toLowerCase();

      if (end == '.jpg' || end == '.png' || end == '.jpeg') {

       if (IsURL(src)) {

        photos.push(src);

       }

      }

     }

    });

    downloadImg(photos, dir, setting.download_v);

    // 遞歸爬蟲

    $('a').each(function () {

     var murl = $(this).attr('href');

     if (IsURL(murl)) {

      setTimeout(function () {

       fetchre(murl);

      }, timeout);

      timeout += setting.ajax_timeout;

     } else {

      setTimeout(function () {

       fetchre("http://www.ivsky.com/" + murl);

      }, timeout);

      timeout += setting.ajax_timeout;

     }

    })

   }

  }

 });

} 

防坑

1.在request通過圖片地址下載時,綁定error事件防止爬蟲異常的中斷。

2.通過async的mapLimit限制并發(fā)。

3.加入請求報頭,防止ip被屏蔽。

4.獲取一些圖片和超鏈接地址,可能是相對路徑(待考慮解決是否有通過方法)。

function downloadImg(photos, dir, asyncNum) {

 console.log("即將異步并發(fā)下載圖片,當前并發(fā)數(shù)為:" + asyncNum);

 async.mapLimit(photos, asyncNum, function (photo, callback) {

  var filename = (new Date().getTime()) + photo.substr(-4, 4);

  if (filename) {

   console.log('正在下載' + photo);

   // 默認

   // fs.createWriteStream(dir + "/" + filename)

   // 防止pipe錯誤

   request(photo)

    .on('error', function (err) {

     console.log(err);

    })

    .pipe(fs.createWriteStream(dir + "/" + filename));

   console.log('下載完成');

   callback(null, filename);

  }

 }, function (err, result) {

  if (err) {

   console.log(err);

  } else {

   console.log(" all right ! ");

   console.log(result);

  }

 })

} 

測試:


可以感覺到速度還是比較快的。

 

完整地址。https://github.com/hua1995116/node-crawler/

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

相關(guān)文章

  • nodejs中用npm初始化來創(chuàng)建package.json的實例講解

    nodejs中用npm初始化來創(chuàng)建package.json的實例講解

    今天小編就為大家分享一篇nodejs中用npm初始化來創(chuàng)建package.json的實例講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-10-10
  • Node.js使用officecrypto-tool實現(xiàn)讀取加密的Excel和Word文檔

    Node.js使用officecrypto-tool實現(xiàn)讀取加密的Excel和Word文檔

    這篇文章主要為大家詳細介紹了Node.js如何使用officecrypto-tool實現(xiàn)讀取加密的Excel和Word文檔的功能,感興趣的小伙伴可以跟隨小編一起了解一下
    2023-09-09
  • nodejs 的 session 簡單使用

    nodejs 的 session 簡單使用

    session 不用多介紹,使一個http可以對應一個終端用戶,需要的朋友可以參考下。
    2016-06-06
  • Node.js開發(fā)靜態(tài)資源服務器

    Node.js開發(fā)靜態(tài)資源服務器

    這篇文章主要為大家介紹了Node.js開發(fā)靜態(tài)資源服務器示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-08-08
  • 詳解node如何將Excel導入數(shù)據(jù)庫

    詳解node如何將Excel導入數(shù)據(jù)庫

    這篇文章主要為大家詳細介紹了node如何通過腳本實現(xiàn)將Excel導入mysql數(shù)據(jù)庫里,文中的示例代碼講解詳細,感興趣的小伙伴可以了解一下
    2024-11-11
  • node命令以及切換node版本詳細步驟

    node命令以及切換node版本詳細步驟

    這篇文章主要給大家介紹了關(guān)于node命令以及切換node版本的相關(guān)資料,在使用node命令切換node版本時可以使用nvm(Node?Version?Manager)工具來管理不同版本的node,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2023-12-12
  • Linux環(huán)境部署node服務并啟動詳細步驟

    Linux環(huán)境部署node服務并啟動詳細步驟

    最近用node.js開發(fā)了一個web項目,下面這篇文章主要給大家介紹了關(guān)于Linux環(huán)境部署node服務并啟動的詳細步驟,文中通過圖文以及示例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-05-05
  • nodejs dgram模塊廣播+組播的實現(xiàn)示例

    nodejs dgram模塊廣播+組播的實現(xiàn)示例

    這篇文章主要介紹了nodejs dgram模塊廣播+組播的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-11-11
  • Node Sass依賴問題排查思路解析

    Node Sass依賴問題排查思路解析

    這篇文章主要為大家介紹了Node Sass依賴問題排查思路解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-04-04
  • NodeJS基礎(chǔ)API搭建服務器詳細過程記錄

    NodeJS基礎(chǔ)API搭建服務器詳細過程記錄

    本文將以一個超小型web項目,來詳細介紹如何使用NodeJS基礎(chǔ)的http, fs, path, url等模塊提供的API來搭建一個簡單的web服務器。具有很好的參考價值。下面跟著小編一起來看下吧
    2017-04-04

最新評論

攀枝花市| 商城县| 蒙城县| 翼城县| 尉氏县| 沁阳市| 高青县| 巴马| 泸水县| 湾仔区| 呈贡县| 雷州市| 偃师市| 曲周县| 威宁| 新丰县| 登封市| 牟定县| 讷河市| 商南县| 济阳县| 睢宁县| 平凉市| 锦州市| 确山县| 定陶县| 泗水县| 永德县| 区。| 驻马店市| 昭通市| 聂荣县| 屯留县| 大兴区| 寿阳县| 石河子市| 应用必备| 交城县| 和田县| 北碚区| 岐山县|