国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > JS > 正文

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

2024-05-06 16:52:54
字體:
來源:轉載
供稿:網友

有個朋友在搞留學工作室,經常訪問的一個網站叫留學者指南,然而每次都要去訪問該網站,顯得極其不專業。于是托俺幫忙寫腳本去爬他家的東西,我觀察了下,這次,我們要爬的東西就有點多了——大概就20多萬個文件吧~~~

在20多萬個文件中,下載極有可能會被中斷,因此需要做下載進度備份,下載進度恢復。

那么針對這樣子的需求,我們開始吧!

上代碼!

const cheerio = require("cheerio"); //用于處于HTML文檔流,用法類似jQueryconst http = require("http"); //用于發起請求const fs = require("fs"); //用于檢測、寫入文件等其他文件操作// "http://www.compassedu.hk/sitemap1.txt",// "http://www.compassedu.hk/sitemap2.txt", //重復的鏈接var source = [ //Robots.txt顯示的數據源  "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; //控制源的序號var arr = []; //合并的下載地址數組var sou = []; //源下載地址數組var i = 0; //當前下載地址數組序號fs.exists(__dirname+"/compassedu", function(flag){ //下載路徑檢測  if(!flag) fs.mkdirSync(__dirname+"/compassedu"); //創建下載存放目錄})fs.exists(__dirname+"/logs", function(flag){ //日志路徑檢測  if(!flag) fs.mkdirSync(__dirname+"/logs"); //創建日志存放目錄})if(fs.existsSync(__dirname+"/logs/compassedu_backup")){ //是否存在斷連恢復下載的控制文檔  let obj = JSON.parse(fs.readFileSync(__dirname+"/logs/compassedu_backup")); //存在則讀取上次下載的位置  i = obj.index;  init(); //開始初始化程序}else{  init(); //開始初始化程序}function init(){ //初始化  http.get(source[s], function(res){ //獲取源下載地址文件    //將源文件的內容存儲到數組    let rawData = "";    res.setEncoding("utf8");    res.on("data", function(chunk){ //監聽數據流      rawData += chunk;    });    res.on("end", function(){ //監聽結束      sou[s] = rawData.split("/n");      console.log("源", s+1, ": ", sou[s].length, "條數據");      s++;      if(s<source.length){ //源文件還未讀取完        init();      }      else{ //源文件讀取完畢        for(let m=0;m<sou.length;m++){ //將所有的地址數組合并          arr = arr.concat(sou[m]);        }        arr = [...new Set(arr)]; //去重        console.log("總計: ", arr.length, "條數據", "/n爬蟲配置完畢!!/n開始爬取 >>");        start(); //開始爬取程序      }    });  })}function start(){ //開始  let url = arr[i];  console.log(url); //打印當前爬取的URL    http.get(url,function(res){ //發起請求    let obj = { //將當前的信息存儲到對象中     "time": new Date().toLocaleTimeString(),      "index": i,      "url": url,      "status": res.statusCode    };    fs.appendFileSync("./logs/download.log", JSON.stringify(obj), "utf8"); //寫入日志文件    fs.writeFileSync("./logs/compassedu_backup", JSON.stringify({"index": i}), "utf8"); //將當前的下載URL序號寫入斷連恢復文件    //讀取請求到的數據流    let rawData = "";    res.setEncoding("utf8");    res.on("data", function(chunk){ //監聽數據流事件      rawData += chunk;    });    res.on("end", function(){ //監聽結束事件      $ = cheerio.load(rawData); //啟用類jQuery插件      body = $(".container-public").html(); //讀取數據流部分的內容      body = body.split("visible-xs")[0]; //剝離多于的數據或其他處理,準備寫入文件      i++; //序號+1      fs.writeFile(__dirname+"/compassedu/"+title+".html", body, "utf8", function(err){ //將處理好的數據寫入文件        if(!err) console.log(title, "寫入成功");        else{          console.log(err);        }      });      if(i>=arr.length) { //若序號達到數組的最后,結束程序        console.log("爬取結束");        fs.unlinkSync("./logs/compassedu_backup");//爬取結束,銷毀斷連恢復文件        return;      }      else { //否則遞歸運行        start();      }    });    res.on("error", function(err){ //監聽其他錯誤      console.log(err);    });  })}

至此,就結束了,是否有bug還不清楚,數據還沒爬完呢~

有bug的話,我后續補充修復~

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


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 阳春市| 菏泽市| 平南县| 开封市| 满城县| 专栏| 安塞县| 新平| 德兴市| 革吉县| 灌南县| 余庆县| 万山特区| 辽阳县| 东兴市| 黎城县| 玛多县| 武定县| 札达县| 福安市| 平原县| 临洮县| 永济市| 盐亭县| 夹江县| 永春县| 丰县| 利津县| 应城市| 安溪县| 名山县| 安达市| 昌宁县| 遵义县| 论坛| 巨野县| 吉木萨尔县| 洱源县| 南郑县| 五原县| 彰化市|