【发布时间】:2013-06-04 09:57:26
【问题描述】:
我正在使用 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)
调试起来非常棘手,我真的不知道从哪里开始。首先,IS 是什么套接字挂起错误?是 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 选择器。这使用了 Node 的 async 库。
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);
}
]);
});
}
【问题讨论】:
-
表示socket在超时时间内没有发送连接
end事件。如果您通过http.request(不是http.get)收到cheerio 请求。您必须致电request.end()才能完成发送请求。 -
@user568109 我应该注意,我使用的是节点
request服务,而不是特定的http.request请求(我想,我对节点很陌生!)。这是一个:github.com/mikeal/request 这似乎是自动完成请求,不是吗?编辑:根据文档,http method, defaults to GET所以这不是问题。 -
那应该不是问题。如果您注释掉包括 Cheerio.load 在内的抓取部分并返回相同的内容会发生什么。这里的问题是,
cheerio.load是异步的。所以在你开始用 $ 做事情之前它可能不会完成。 -
我有时还发现,如果我对网站的抓取过于激进(例如同时连接 10 个以上),他们会开始响应套接字挂断,所以也可能是这样。
-
仅供参考,在英语中,
hang up表示 to end an electronic conversation by cutting the connection;源于挂断老式电话。
标签: node.js