Estou construindo um raspador de web com Node e Cheerio e, para um determinado site, estou recebendo o seguinte erro (isso acontece apenas neste site, não nos outros que eu tento raspar).
Isso acontece em um local diferente toda vez; portanto, às vezes é o url xque gera o erro, outras vezes url xé bom e é um URL totalmente diferente:
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)
Isso é muito difícil de depurar, eu realmente não sei por onde começar. Para começar, o que é um erro de desligamento do soquete? É um erro 404 ou semelhante? Ou isso significa apenas que o servidor recusou uma conexão?
Não consigo encontrar uma explicação disso em lugar nenhum!
EDIT: Aqui está um exemplo de código que está (às vezes) retornando erros:
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
});
}
Não há ligação direta para fechar a conexão, mas estou usando o Node Requestque (tanto quanto eu sei) usa, http.getpara que isso não seja necessário, corrija-me se estiver errado!
EDIT 2: Aqui está um código em uso real que está causando erros. prodURLe outras variáveis são principalmente seletores de jquery definidos anteriormente. Isso usa a asyncbiblioteca para Nó.
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);
}
]);
});
}
requestserviço do nó , não uma http.requestsolicitação específica (acho que sou muito nova no nó!). É esse: github.com/mikeal/request Parece que termina a solicitação automaticamente, não? EDIT: De acordo com os documentos, http method, defaults to GETesse não é o problema.
cheerio.loadé assíncrono. Portanto, pode não terminar antes de começar a fazer coisas com $.
hang upsignifica encerrar uma conversa eletrônica cortando a conexão ; originou de desligar o telefone antigo.
endevento de conexão dentro do período de tempo limite. Se você estiver recebendo o pedido de cheerio viahttp.request(nãohttp.get). Você precisa ligarrequest.end()para terminar de enviar a solicitação.