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

創(chuàng)新互聯(lián)公司2013年開創(chuàng)至今,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目成都網(wǎng)站制作、成都網(wǎng)站設(shè)計(jì)網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢想脫穎而出為使命,1280元內(nèi)黃做網(wǎng)站,已為上家服務(wù),為內(nèi)黃各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:18982081108
在20多萬個(gè)文件中,下載極有可能會(huì)被中斷,因此需要做下載進(jìn)度備份,下載進(jìn)度恢復(fù)。
那么針對這樣子的需求,我們開始吧!
上代碼!
const cheerio = require("cheerio"); //用于處于HTML文檔流,用法類似jQuery
const http = require("http"); //用于發(fā)起請求
const fs = require("fs"); //用于檢測、寫入文件等其他文件操作
// "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; //控制源的序號
var arr = []; //合并的下載地址數(shù)組
var sou = []; //源下載地址數(shù)組
var i = 0; //當(dāng)前下載地址數(shù)組序號
fs.exists(__dirname+"/compassedu", function(flag){ //下載路徑檢測
if(!flag) fs.mkdirSync(__dirname+"/compassedu"); //創(chuàng)建下載存放目錄
})
fs.exists(__dirname+"/logs", function(flag){ //日志路徑檢測
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(); //開始初始化程序
}
else{
init(); //開始初始化程序
}
function init(){ //初始化
http.get(source[s], function(res){ //獲取源下載地址文件
//將源文件的內(nèi)容存儲(chǔ)到數(shù)組
let rawData = "";
res.setEncoding("utf8");
res.on("data", function(chunk){ //監(jiān)聽數(shù)據(jù)流
rawData += chunk;
});
res.on("end", function(){ //監(jiān)聽結(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爬蟲配置完畢!!\n開始爬取 >>");
start(); //開始爬取程序
}
});
})
}
function start(){ //開始
let url = arr[i];
console.log(url); //打印當(dāng)前爬取的URL
http.get(url,function(res){ //發(fā)起請求
let obj = { //將當(dāng)前的信息存儲(chǔ)到對象中
"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"); //將當(dāng)前的下載URL序號寫入斷連恢復(fù)文件
//讀取請求到的數(shù)據(jù)流
let rawData = "";
res.setEncoding("utf8");
res.on("data", function(chunk){ //監(jiān)聽數(shù)據(jù)流事件
rawData += chunk;
});
res.on("end", function(){ //監(jiān)聽結(jié)束事件
$ = cheerio.load(rawData); //啟用類jQuery插件
title = $(".container-public h2").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)備寫入文件
i++; //序號+1
fs.writeFile(__dirname+"/compassedu/"+title+".html", body, "utf8", function(err){ //將處理好的數(shù)據(jù)寫入文件
if(!err) console.log(title, "寫入成功");
else{
console.log(err);
}
});
if(i>=arr.length) { //若序號達(dá)到數(shù)組的最后,結(jié)束程序
console.log("爬取結(jié)束");
fs.unlinkSync("./logs/compassedu_backup");//爬取結(jié)束,銷毀斷連恢復(fù)文件
return;
}
else { //否則遞歸運(yùn)行
start();
}
});
res.on("error", function(err){ //監(jiān)聽其他錯(cuò)誤
console.log(err);
});
})
}
至此,就結(jié)束了,是否有bug還不清楚,數(shù)據(jù)還沒爬完呢~
有bug的話,我后續(xù)補(bǔ)充修復(fù)~
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。
分享題目:Node爬取大批量文件的方法示例
文章轉(zhuǎn)載:http://www.chinadenli.net/article20/pgsoco.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供搜索引擎優(yōu)化、網(wǎng)頁設(shè)計(jì)公司、定制網(wǎng)站、ChatGPT、靜態(tài)網(wǎng)站、營銷型網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)