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 x
der Fehler, manchmal url x
ist 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 Request
was (soweit ich das beurteilen kann) verwendet, http.get
so dass dies nicht erforderlich ist. Korrigieren Sie mich, wenn ich falsch liege!
BEARBEITEN 2: Hier ist ein tatsächlich verwendetes Codebit, das Fehler verursacht. prodURL
und andere Variablen sind meistens jquery-Selektoren, die zuvor definiert wurden. Dies verwendet die async
Bibliothek 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.request
Anfrage (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 GET
das also nicht das Problem.
cheerio.load
ist asynchron. Es kann also sein, dass es nicht fertig ist, bevor Sie anfangen, Dinge mit $ zu tun.
hang up
bedeutet auf Englisch, ein elektronisches Gespräch zu beenden, indem die Verbindung unterbrochen wird. entstand aus dem Auflegen des altmodischen Telefons.
end
innerhalb 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.