Я создаю веб-скребок с 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, которые определены ранее. Это использует 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);
}
]);
});
}
requestслужбу узла , а не конкретный http.requestзапрос (думаю, я очень новичок в работе с узлом!). Это один: github.com/mikeal/request Похоже, что он автоматически завершает запрос, нет? РЕДАКТИРОВАТЬ: Согласно документам, http method, defaults to GETтак что это не проблема.
cheerio.loadасинхронный. Так что это может не закончиться, прежде чем вы начнете делать вещи с $
hang upозначает завершение электронного разговора, разорвав соединение ; возник из-за повешения старомодного телефона.
endсобытие подключения в течение периода ожидания. Если вы получаете запрос на Cheerio черезhttp.request(неhttp.get). Вы должны позвонить,request.end()чтобы закончить отправку запроса.