Я создаю веб-скребок с Node и Cheerio, и для определенного веб-сайта я получаю следующую ошибку (это происходит только на этом веб-сайте, другие, которые я пытаюсь очистить).
Это происходит в другом месте каждый раз, поэтому иногда он url x
, который выдает ошибку, в других случаях url x
отлично, и он совсем другой URL:
Error!: Error: socket hang up using [insert random URL, it 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 или аналогичная? Или это просто означает, что сервер отказался от соединения?
Я не могу найти объяснения этого нигде!
EDIT: Здесь образец кода, который (иногда) возвращает ошибки:
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);
}
]);
});
}