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

基于nodejs 的多頁面爬蟲實(shí)例代碼

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

前言

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

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

request

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

cheerio

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

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

async

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

核心思路

  1. 用request 發(fā)送一個請求。獲取html代碼,取得其中的img標(biāo)簽和a標(biāo)簽。
  2. 通過獲取的a表情進(jìn)行遞歸調(diào)用。不斷獲取img地址和a地址,繼續(xù)遞歸
  3. 獲取img地址通過request(photo).pipe(fs.createWriteStream(dir + “/” + filename));進(jìn)行快速下載。
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ā)下載圖片,當(dāng)前并發(fā)數(shù)為:" + asyncNum);

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

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

  if (filename) {

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

   // 默認(rèn)

   // 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)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

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

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

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

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

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

    nodejs 的 session 簡單使用

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

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

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

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

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

    node命令以及切換node版本詳細(xì)步驟

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

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

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

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

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

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

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

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

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

最新評論

宽甸| 东乌珠穆沁旗| 泸溪县| 安泽县| 清徐县| 凭祥市| 韶关市| 吉水县| 庄浪县| 天峻县| 凤冈县| 巩义市| 镇远县| 洞口县| 黑河市| 蒲江县| 兴文县| 洮南市| 平顶山市| 三原县| 福建省| 曲周县| 望谟县| 江北区| 扬州市| 云梦县| 盘山县| 防城港市| 启东市| 鄂州市| 潼关县| 凤庆县| 仁怀市| 桓仁| 永济市| 双城市| 平泉县| 香港| 闽侯县| 昌图县| 托里县|