Je construis un grattoir Web avec Node et Cheerio, et pour un certain site Web, j'obtiens l'erreur suivante (cela ne se produit que sur ce site Web, pas d'autres que j'essaie de gratter.
Cela se produit à un endroit différent à chaque fois, donc parfois c'est ce url xqui jette l'erreur, d'autres fois url xc'est bien et c'est une URL complètement différente:
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)
C'est très difficile à déboguer, je ne sais pas vraiment par où commencer. Pour commencer, c'EST une prise raccrocher erreur? S'agit-il d'une erreur 404 ou similaire? Ou cela signifie-t-il simplement que le serveur a refusé une connexion?
Je ne trouve aucune explication à cela nulle part!
EDIT: Voici un exemple de code qui renvoie (parfois) des erreurs:
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
});
}
Il n'y a pas d'appel direct pour fermer la connexion, mais j'utilise Node Requestce qui (pour autant que je sache ) utilise http.getdonc ce n'est pas nécessaire, corrigez-moi si je me trompe!
EDIT 2: Voici un morceau de code en cours d'utilisation qui provoque des erreurs. prodURLet les autres variables sont principalement des sélecteurs jquery définis précédemment. Cela utilise la asyncbibliothèque de 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);
}
]);
});
}
requestservice de nœud , pas une http.requestdemande spécifique (je pense que je suis très nouveau sur le nœud!). C'est celui-ci: github.com/mikeal/request Il semble qu'il termine automatiquement la demande, non? EDIT: Selon les documents, http method, defaults to GETce n'est donc pas le problème.
cheerio.loadest asynchrone. Il ne peut donc pas se terminer avant de commencer à faire des choses avec $.
hang upsignifie mettre fin à une conversation électronique en coupant la connexion ; originaire de raccrocher le téléphone à l'ancienne.
endévénement de connexion dans le délai imparti. Si vous recevez la demande de cheerio viahttp.request(pashttp.get). Vous devez appelerrequest.end()pour terminer l'envoi de la demande.