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

Node爬取大批量文件的方法示例

 更新時(shí)間:2019年06月28日 08:26:31   作者:hn-failte  
這篇文章主要介紹了Node爬取大批量文件的方法示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

有個(gè)朋友在搞留學(xué)工作室,經(jīng)常訪問(wèn)的一個(gè)網(wǎng)站叫留學(xué)者指南,然而每次都要去訪問(wèn)該網(wǎng)站,顯得極其不專(zhuān)業(yè)。于是托俺幫忙寫(xiě)腳本去爬他家的東西,我觀察了下,這次,我們要爬的東西就有點(diǎn)多了——大概就20多萬(wàn)個(gè)文件吧~~~

在20多萬(wàn)個(gè)文件中,下載極有可能會(huì)被中斷,因此需要做下載進(jìn)度備份,下載進(jìn)度恢復(fù)。

那么針對(duì)這樣子的需求,我們開(kāi)始吧!

上代碼!

const cheerio = require("cheerio"); //用于處于HTML文檔流,用法類(lèi)似jQuery
const http = require("http"); //用于發(fā)起請(qǐng)求
const fs = require("fs"); //用于檢測(cè)、寫(xiě)入文件等其他文件操作

// "http://www.compassedu.hk/sitemap1.txt",
// "http://www.compassedu.hk/sitemap2.txt", //重復(fù)的鏈接
var source = [ //Robots.txt顯示的數(shù)據(jù)源
  "http://m.compassedu.hk/sitemap3.txt",
  "http://m.compassedu.hk/sitemap4.txt",
  "http://m.compassedu.hk/sitemap6.txt",
  "http://m.compassedu.hk/sitemap7.txt",
  "http://m.compassedu.hk/sitemap8.txt"
]
var s = 0; //控制源的序號(hào)
var arr = []; //合并的下載地址數(shù)組
var sou = []; //源下載地址數(shù)組
var i = 0; //當(dāng)前下載地址數(shù)組序號(hào)

fs.exists(__dirname+"/compassedu", function(flag){ //下載路徑檢測(cè)
  if(!flag) fs.mkdirSync(__dirname+"/compassedu"); //創(chuàng)建下載存放目錄
})
fs.exists(__dirname+"/logs", function(flag){ //日志路徑檢測(cè)
  if(!flag) fs.mkdirSync(__dirname+"/logs"); //創(chuàng)建日志存放目錄
})

if(fs.existsSync(__dirname+"/logs/compassedu_backup")){ //是否存在斷連恢復(fù)下載的控制文檔
  let obj = JSON.parse(fs.readFileSync(__dirname+"/logs/compassedu_backup")); //存在則讀取上次下載的位置
  i = obj.index;
  init(); //開(kāi)始初始化程序
}
else{
  init(); //開(kāi)始初始化程序
}

function init(){ //初始化
  http.get(source[s], function(res){ //獲取源下載地址文件

    //將源文件的內(nèi)容存儲(chǔ)到數(shù)組
    let rawData = "";
    res.setEncoding("utf8");
    res.on("data", function(chunk){ //監(jiān)聽(tīng)數(shù)據(jù)流
      rawData += chunk;
    });
    res.on("end", function(){ //監(jiān)聽(tīng)結(jié)束
      sou[s] = rawData.split("\n");
      console.log("源", s+1, ": ", sou[s].length, "條數(shù)據(jù)");
      s++;
      if(s<source.length){ //源文件還未讀取完
        init();
      }
      else{ //源文件讀取完畢
        for(let m=0;m<sou.length;m++){ //將所有的地址數(shù)組合并
          arr = arr.concat(sou[m]);
        }
        arr = [...new Set(arr)]; //去重
        console.log("總計(jì): ", arr.length, "條數(shù)據(jù)", "\n爬蟲(chóng)配置完畢!!\n開(kāi)始爬取 >>");
        start(); //開(kāi)始爬取程序
      }
    });
  })
}

function start(){ //開(kāi)始
  let url = arr[i];
  console.log(url); //打印當(dāng)前爬取的URL
  
  http.get(url,function(res){ //發(fā)起請(qǐng)求
    let obj = { //將當(dāng)前的信息存儲(chǔ)到對(duì)象中
     "time": new Date().toLocaleTimeString(),
      "index": i,
      "url": url,
      "status": res.statusCode
    };
    fs.appendFileSync("./logs/download.log", JSON.stringify(obj), "utf8"); //寫(xiě)入日志文件
    fs.writeFileSync("./logs/compassedu_backup", JSON.stringify({"index": i}), "utf8"); //將當(dāng)前的下載URL序號(hào)寫(xiě)入斷連恢復(fù)文件
    //讀取請(qǐng)求到的數(shù)據(jù)流
    let rawData = "";
    res.setEncoding("utf8");
    res.on("data", function(chunk){ //監(jiān)聽(tīng)數(shù)據(jù)流事件
      rawData += chunk;
    });
    res.on("end", function(){ //監(jiān)聽(tīng)結(jié)束事件
      $ = cheerio.load(rawData); //啟用類(lèi)jQuery插件
      title = $(".container-public h1").text().replace(/\s/,"").trim(); //讀取數(shù)據(jù)流部分的標(biāo)題
      body = $(".container-public").html(); //讀取數(shù)據(jù)流部分的內(nèi)容
      body = body.split("visible-xs")[0]; //剝離多于的數(shù)據(jù)或其他處理,準(zhǔn)備寫(xiě)入文件
      i++; //序號(hào)+1
      fs.writeFile(__dirname+"/compassedu/"+title+".html", body, "utf8", function(err){ //將處理好的數(shù)據(jù)寫(xiě)入文件
        if(!err) console.log(title, "寫(xiě)入成功");
        else{
          console.log(err);
        }
      });
      if(i>=arr.length) { //若序號(hào)達(dá)到數(shù)組的最后,結(jié)束程序
        console.log("爬取結(jié)束");
        fs.unlinkSync("./logs/compassedu_backup");//爬取結(jié)束,銷(xiāo)毀斷連恢復(fù)文件
        return;
      }
      else { //否則遞歸運(yùn)行
        start();
      }
    });
    res.on("error", function(err){ //監(jiān)聽(tīng)其他錯(cuò)誤
      console.log(err);
    });
  })
}

至此,就結(jié)束了,是否有bug還不清楚,數(shù)據(jù)還沒(méi)爬完呢~

有bug的話,我后續(xù)補(bǔ)充修復(fù)~

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 利用C/C++編寫(xiě)node.js原生模塊的方法教程

    利用C/C++編寫(xiě)node.js原生模塊的方法教程

    這篇文章主要給大家介紹了關(guān)于利用C/C++編寫(xiě)node.js原生模塊的相關(guān)資料,文中將實(shí)現(xiàn)的步驟一步步的介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面跟著小編來(lái)一起看看吧。
    2017-07-07
  • NodeJs中express框架的send()方法簡(jiǎn)介

    NodeJs中express框架的send()方法簡(jiǎn)介

    這篇文章主要介紹了NodeJs中express框架的send()方法簡(jiǎn)介,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-06-06
  • 用C/C++來(lái)實(shí)現(xiàn) Node.js 的模塊(一)

    用C/C++來(lái)實(shí)現(xiàn) Node.js 的模塊(一)

    這篇文章的主要內(nèi)容其實(shí)簡(jiǎn)而言之就是——用C/C++來(lái)實(shí)現(xiàn) Node.js 的模塊,非常的不錯(cuò),有需要的朋友可以參考下
    2014-09-09
  • Nodejs關(guān)于gzip/deflate壓縮詳解

    Nodejs關(guān)于gzip/deflate壓縮詳解

    本文主要向大家介紹了nodejs中關(guān)于gzip/deflate壓縮的2種方法,分別是管道壓縮和非管道壓縮,十分詳細(xì),并附帶示例,這里推薦給大家參考下。
    2015-03-03
  • Nodejs Stream 數(shù)據(jù)流使用手冊(cè)

    Nodejs Stream 數(shù)據(jù)流使用手冊(cè)

    這篇文章主要介紹了Nodejs Stream 數(shù)據(jù)流使用手冊(cè)的相關(guān)資料,感興趣的小伙伴一起學(xué)習(xí)吧
    2016-04-04
  • Node.js中的require.resolve方法使用簡(jiǎn)介

    Node.js中的require.resolve方法使用簡(jiǎn)介

    在Node.js中,可以使用require.resolve函數(shù)來(lái)查詢某個(gè)模塊文件的帶有完整絕對(duì)路徑的文件名,下面這篇文章主要介紹了Node.js中require.resolve方法使用的相關(guān)資料,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。
    2017-04-04
  • node命令以及切換node版本詳細(xì)步驟

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

    這篇文章主要給大家介紹了關(guān)于node命令以及切換node版本的相關(guān)資料,在使用node命令切換node版本時(shí)可以使用nvm(Node?Version?Manager)工具來(lái)管理不同版本的node,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-12-12
  • CentOS 安裝NodeJS V8.0.0的方法

    CentOS 安裝NodeJS V8.0.0的方法

    這篇文章主要介紹了CentOS 安裝NodeJS V8.0.0的方法,需要的朋友可以參考下
    2017-06-06
  • 詳解阿里Node.js技術(shù)文檔之process模塊學(xué)習(xí)指南

    詳解阿里Node.js技術(shù)文檔之process模塊學(xué)習(xí)指南

    這篇文章主要介紹了詳解阿里Node.js技術(shù)文檔之process模塊學(xué)習(xí)指南,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • nodejs中安裝ghost出錯(cuò)的原因及解決方法

    nodejs中安裝ghost出錯(cuò)的原因及解決方法

    本篇文章主要介紹了nodejs中安裝ghost出錯(cuò)的原因及解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-10-10

最新評(píng)論

乡城县| 绍兴市| 东山县| 永济市| 琼中| 陆河县| 宁武县| 闻喜县| 临沭县| 云龙县| 疏附县| 汾西县| 建德市| 黄陵县| 格尔木市| 长兴县| 介休市| 岳阳市| 镇康县| 来宾市| 石渠县| 秀山| 平潭县| 麟游县| 丹棱县| 芷江| 湛江市| 鄂伦春自治旗| 泸州市| 普兰店市| 恩施市| 台湾省| 鄢陵县| 东阿县| 永寿县| 蓝田县| 曲周县| 舒城县| 云安县| 奎屯市| 会理县|