我的任务是通过大约200k链接,并检查他们的响应的状态代码。除2xx以外的任何内容都意味着问题,这意味着必须手动检查链接(稍后添加到数据库)。
我从数据库获得的链接是http和https,其中一些是无效的(例如ww.fyxs.d)。我得到的格式是JSON,它就是这样的
{
"id": xxx,
"url": xxxx
}
我选择了一个非常简单的解决方案,但遗憾的是无法解决问题。
我从json文件中获取链接,然后从后面开始发送http / https.get请求,等待响应,检查并处理状态代码,并在删除上一个链接之后移动到下一个链接保存内存的列表。问题是我几乎一直都在使用4xx,如果我从REST客户端进行GET,我会得到200 OK。
我不知道是否可能,但我只需要正确的状态代码和我对HEAD方法不感兴趣的正文。我也尝试过
method: 'GET'
- 仍然是错误的状态代码和http/https.request
- 我甚至没有收到回复。
这是我的代码:
var https = require('https');
var http = require('http');
var urlMod = require('url');
var links = require('./links_to_check.json').links_to_check;
var callsRemaining = links.length;
var current = links.length - 1;
startQueue();
function startQueue(){
getCode(links[current].url);
current--;
}
function getCode(url){
var urlObj = urlMod.parse(url);
var options = {
method: 'HEAD',
hostName: urlObj.host,
path: urlObj.path
};
var httpsIndex = url.indexOf('https');
if(httpsIndex > -1 && httpsIndex < 5){
https.get(options,function(response){
proccessResponse(response.statusCode);
}).on('error', (e) => {
startQueue();
});
}else{
if(url.indexOf('http:') < 0) return;
http.get(options,function(response){
proccessResponse(response.statusCode);
}).on('error', (e) => {
startQueue();
});
}
}
function proccessResponse(responseCode){
console.log("response => " + responseCode);
if(responseCode != 200){
errorCount++;
}
ResponseReady();
}
function ResponseReady(){
--callsRemaining;
if(callsRemaining <= 0){
//Proccess error when done
}
links.pop();
startQueue();
}
我真的很感激一些帮助 - 当我们成功时,我会将其作为一个模块发布,所以如果有人需要检查一组链接,他们就可以使用它:)
在我们解决这个问题后,我考虑使用async.map并将链接拆分为块并并行运行分析,因此速度更快。用shell编写的当前进程大约需要36个小时。