有个朋友在搞留学工作室,经常访问的一个网站叫留学者指南,然而每次都要去访问该网站,显得极其不专业。于是托俺帮忙写脚本去爬他家的东西,我观察了下,这次,我们要爬的东西就有点多了——大概就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(){ //开始









