Estoy construyendo un raspador web con Node y Cheerio, y para un determinado sitio web obtengo el siguiente error (solo ocurre en este sitio web, no en otros que intento raspar).
Ocurre en una ubicación diferente cada vez, por lo que a veces es url xel error, otras veces url xestá bien y es una URL completamente diferente:
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)
Esto es muy difícil de depurar, realmente no sé por dónde empezar. Para comenzar, ¿qué ES un error de colgar el socket? ¿Es un error 404 o similar? ¿O solo significa que el servidor rechazó una conexión?
¡No puedo encontrar una explicación de esto en ningún lado!
EDITAR: Aquí hay una muestra de código que (a veces) devuelve errores:
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
});
}
No hay una llamada directa para cerrar la conexión, pero estoy usando lo Node Requestque (por lo que puedo decir) usa, http.getasí que esto no es obligatorio, ¡corríjame si me equivoco!
EDITAR 2: Aquí hay un bit de código real en uso que está causando errores. prodURLy otras variables son en su mayoría selectores jquery que se definieron anteriormente. Esto usa la asyncbiblioteca para 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);
}
]);
});
}
requestservicio de nodo , no una http.requestsolicitud específica (¡creo que soy muy nuevo en el nodo!). Este es el siguiente: github.com/mikeal/request Parece que finaliza la solicitud automáticamente, ¿no? EDITAR: Según los documentos, http method, defaults to GETese no es el problema.
cheerio.loades asíncrono. Por lo tanto, puede que no termine antes de comenzar a hacer cosas con $.
hang upsignifica terminar una conversación electrónica cortando la conexión ; se originó al colgar el teléfono antiguo.
endevento de conexión dentro del período de tiempo de espera. Si recibe la solicitud de cheerio a través dehttp.request(nohttp.get). Debe llamarrequest.end()para terminar de enviar la solicitud.