我正在以连续的方式(一天一次多次请求)抓取网站,并且每次都使用异步和请求节点模块。我使用async eachLimit并行运行函数getPage(此处未在代码中显示)。但是,在几千次查询中,我收到以下错误:
Error: getaddrinfo ENOTFOUND 247sports.com 247sports.com:80
at errnoException (dns.js:26:10)
at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:77:26)
即使我知道我通过的网址也是有效的。我发现有人使用http模块并获得相同的错误的解决方案,但似乎没有人使用请求模块得到这个。 我知道我的ip没有被阻止,因为我能够在错误发生后立即访问该网站。我也知道我的用户代理不是问题,因为我在用户代理列表中轮换,所有用户代理都是有效的。 我的猜测是问题在于请求库与节点http模块的交互。不幸的是,我无法准确地重现问题,因为当我同时或连续推送大量请求时,它似乎只是被触发。
下面的功能代码是我的功能:
function getPage(){
var options = {
url: "http://stackoverflow.com/",
headers: { 'User-agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:2.0.1) Gecko/20110506 Firefox/4.0.1'
};
request(options, function(err, resp, body) {
if (err){
throw err;
return;
}
PagesScraped++;
console.log(PagesScraped);
return;
});
};
for (var i = 0; i < 600; i++){
getPage();
};
注意:我意识到这段代码异步地获取同一页600次,但如果运行的时间足够多,则错误仍然存在...我的本地代码访问同一网站上的数千页。