Я будую веб-скребок з 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 чи подібне? Або це просто означає, що сервер відмовився від з'єднання?
Я ніде не можу знайти пояснення цьому!
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так що це не потрібно, виправте мене, якщо я помиляюся!
EDIT 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подія з'єднання протягом періоду очікування. Якщо ви отримуєте запит на cheerio черезhttp.request(неhttp.get). Вам потрібно зателефонувати,request.end()щоб закінчити надсилання запиту.