Ich baue einen Web-Scraper mit Node und Cheerio, und für eine bestimmte Website erhalte ich den folgenden Fehler (es tritt nur auf dieser einen Website auf, bei keiner anderen, die ich zu scrapen versuche).
Es passiert jedes Mal an einem anderen Ort, also manchmal ist es url x
, der den Fehler wirft, andere Male ist url x
in Ordnung und es handelt sich um eine völlig andere URL:
Fehler!: Fehler: Socket wurde geschlossen using [zufällige URL einfügen, es ist jedes Mal eine andere]
Fehler: Socket wurde geschlossen
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)
Das ist sehr schwierig zu debuggen, ich weiß nicht wirklich, wo ich anfangen soll. Um zu beginnen, was IST ein Verbindungsabbruchfehler (Socket hang up error)? Ist es ein 404-Fehler oder ähnliches? Oder bedeutet es einfach, dass der Server eine Verbindung verweigert hat?
Ich kann keine Erklärung dafür finden!
BEARBEITEN: Hier ist ein Codebeispiel, der (manchmal) Fehler zurückgibt:
function scrapeNexts(url, oncomplete) {
request(url, function(err, resp, body) {
if (err) {
console.log("Ach, ScrapeNexts Fehler!: " + err + " beim Verwenden von " + url);
errors.nexts.push(url);
}
$ = cheerio.load(body);
// hier wird etwas mit dem '$' Cheerio-Inhalt gemacht
});
}
Es erfolgt kein direkter Aufruf, um die Verbindung zu schließen, aber ich verwende Node Request
, das (soweit ich das beurteilen kann) http.get
verwendet, sodass dies nicht erforderlich ist. Bitte korrigiere mich, wenn ich falsch liege!
BEARBEITEN 2: Hier ist ein tatsächliches, im Einsatz befindliches Code-Snippet, das Fehler verursacht. prodURL
und andere Variablen sind größtenteils vorher definierte jQuery-Selektoren. Hier wird die async
-Bibliothek für Node verwendet.
function scrapeNexts(url, oncomplete) {
request(url, function (err, resp, body) {
if (err) {
console.log("Ach, ScrapeNexts Fehler!: " + err + " beim Verwenden von " + 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);
}
]);
});
}