中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發布時間:2020-08-25 21:34:23 來源:腳本之家 閱讀:144 作者:hn-failte 欄目:web開發

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

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

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

上代碼!

const cheerio = require("cheerio"); //用于處于HTML文檔流,用法類似jQuery
const 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插件
      title = $(".container-public h2").text().replace(/\s/,"").trim(); //讀取數據流部分的標題
      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的話,我后續補充修復~

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

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

仙游县| 凯里市| 察隅县| 白城市| 临沧市| 四川省| 丹巴县| 张家港市| 福清市| 沧州市| 尼玛县| 吉林市| 宜宾市| 平潭县| 湖南省| 宜良县| 莫力| 连南| 文水县| 阿鲁科尔沁旗| 安顺市| 西畴县| 高雄县| 同心县| 旬邑县| 民乐县| 资中县| 义马市| 辽中县| 宜良县| 东兴市| 虹口区| 铁岭县| 丰都县| 来安县| 昌吉市| 上饶县| 凉山| 庆安县| 嘉黎县| 长治县|