Sto costruendo un raschietto web con Node e Cheerio, e per un certo sito Web sto ottenendo il seguente errore (succede solo su questo sito Web, nessun altro che provo a raschiare.
Succede in una posizione diversa ogni volta, quindi a volte è url xche genera l'errore, altre volte url xva bene ed è un URL completamente diverso:
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)
È molto difficile eseguire il debug, non so davvero da dove cominciare. Per cominciare, che cosa È una presa di riagganciare errore? È un errore 404 o simile? O significa semplicemente che il server ha rifiutato una connessione?
Non riesco a trovare una spiegazione di questo da nessuna parte!
EDIT: ecco un esempio di codice che a volte restituisce errori:
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
});
}
Non c'è una chiamata diretta per chiudere la connessione, ma sto usando Node Requestquale (per quanto posso dire) usa http.getquindi non è necessario, correggimi se sbaglio!
EDIT 2: Ecco un vero e proprio bit di codice in uso che causa errori. prodURLe altre variabili sono per lo più selettori jquery definiti in precedenza. Questo utilizza la asynclibreria per 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);
}
]);
});
}
requestservizio nodo , non una http.requestrichiesta specifica (penso, sono molto nuovo nel nodo!). Questo è quello: github.com/mikeal/request Sembra che termini automaticamente la richiesta, no? EDIT: secondo i documenti, http method, defaults to GETquindi non è questo il problema.
cheerio.loadè asincrono. Quindi potrebbe non finire prima di iniziare a fare cose con $.
hang upsignifica terminare una conversazione elettronica tagliando la connessione ; nasce dal riagganciare il telefono vecchio stile.
endevento di connessione entro il periodo di timeout. Se ricevi la richiesta di cheerio tramitehttp.request(nonhttp.get). Devi chiamarerequest.end()per terminare l'invio della richiesta.