我正在使用Node和Cheerio构建网络抓取工具,对于某个网站,我遇到以下错误(它仅在该网站上发生,没有其他我尝试抓取的错误。
每次都在不同的位置发生,因此有时url x是引发错误,有时url x是好的,并且完全是另一个URL:
Error!: Error: socket hang up using [insert random URL, it's different every time]
Error: socket hang up
at createHangUpError (http.js:1445:15)
at Socket.socketOnEnd [as onend] (http.js:1541:23)
at Socket.g (events.js:175:14)
at Socket.EventEmitter.emit (events.js:117:20)
at _stream_readable.js:910:16
at process._tickCallback (node.js:415:13)
调试起来非常棘手,我真的不知道从哪里开始。首先,什么是套接字挂起错误?是404错误还是类似错误?还是仅表示服务器拒绝连接?
我在任何地方都找不到对此的解释!
编辑:这是(有时)返回错误的代码示例:
function scrapeNexts(url, oncomplete) {
request(url, function(err, resp, body) {
if (err) {
console.log("Uh-oh, ScrapeNexts Error!: " + err + " using " + url);
errors.nexts.push(url);
}
$ = cheerio.load(body);
// do stuff with the '$' cheerio content here
});
}
没有直接调用来关闭连接,但是我正在使用Node Request(据我所知)使用的连接,http.get因此这不是必需的,如果我错了,请纠正我!
编辑2:这是导致错误的实际使用中的代码。prodURL其他变量大多是前面定义的jquery选择器。这将async库用于Node。
function scrapeNexts(url, oncomplete) {
request(url, function (err, resp, body) {
if (err) {
console.log("Uh-oh, ScrapeNexts Error!: " + err + " using " + url);
errors.nexts.push(url);
}
async.series([
function (callback) {
$ = cheerio.load(body);
callback();
},
function (callback) {
$(prodURL).each(function () {
var theHref = $(this).attr('href');
urls.push(baseURL + theHref);
});
var next = $(next_select).first().attr('href');
oncomplete(next);
}
]);
});
}
request服务,而不是特定的http.request请求(我认为,我对节点非常陌生!)。这是一个:github.com/mikeal/request好像它自动完成了请求,不是吗?编辑:根据文档,http method, defaults to GET所以这不是问题。
cheerio.load是异步的。因此,在开始使用$进行操作之前,它可能无法完成。
hang up表示通过断开连接来结束电子对话;源自挂断老式电话。
end在超时时间内不会发送连接事件。如果您通过http.request(不是http.get)获得了对cheerio的请求。您必须致电request.end()以完成发送请求。