Ich baue mit Node und Cheerio einen Web-Scraper und für eine bestimmte Website erhalte ich den folgenden Fehler (es passiert nur auf dieser einen Website, keine anderen, die ich zu kratzen versuche.
Es passiert jedes Mal an einem anderen Ort, also ist es manchmal url xder Fehler, manchmal url xist es in Ordnung und es ist eine völlig andere 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)
Das Debuggen ist sehr schwierig, ich weiß nicht wirklich, wo ich anfangen soll. Um zu beginnen, was IST eine Steckdose up Fehler hängen? Ist es ein 404-Fehler oder ähnliches? Oder bedeutet das nur, dass der Server eine Verbindung abgelehnt hat?
Ich kann nirgendwo eine Erklärung dafür finden!
BEARBEITEN: Hier ist ein Codebeispiel, das (manchmal) Fehler zurückgibt:
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
});
}
Es gibt keinen direkten Anruf, um die Verbindung zu schließen, aber ich verwende, Node Requestwas (soweit ich das beurteilen kann) verwendet, http.getso dass dies nicht erforderlich ist. Korrigieren Sie mich, wenn ich falsch liege!
BEARBEITEN 2: Hier ist ein tatsächlich verwendetes Codebit, das Fehler verursacht. prodURLund andere Variablen sind meistens jquery-Selektoren, die zuvor definiert wurden. Dies verwendet die asyncBibliothek für 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, keine spezifische http.requestAnfrage (ich denke, ich bin sehr neu im Knoten!). Dies ist die eine: github.com/mikeal/request Dies scheint die Anfrage automatisch zu beenden, nein? EDIT: Laut den Dokumenten ist http method, defaults to GETdas also nicht das Problem.
cheerio.loadist asynchron. Es kann also sein, dass es nicht fertig ist, bevor Sie anfangen, Dinge mit $ zu tun.
hang upbedeutet auf Englisch, ein elektronisches Gespräch zu beenden, indem die Verbindung unterbrochen wird. entstand aus dem Auflegen des altmodischen Telefons.
endinnerhalb des Zeitlimits kein Verbindungsereignis sendet . Wenn Sie die Anfrage für Cheerio überhttp.request(nichthttp.get) erhalten. Sie müssen anrufenrequest.end(), um das Senden der Anfrage abzuschließen.