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

2020-06-17 06:58:38易采站长站整理

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 h1").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的话,我后续补充修复~