Buduję skrobak sieciowy z Node i Cheerio, a dla pewnej witryny pojawia się następujący błąd (zdarza się to tylko na tej jednej stronie, nie ma innych, które próbuję zeskrobać).
Zdarza się to za każdym razem w innym miejscu, więc czasami powoduje to url xbłąd, innym razem url xjest w porządku i jest to zupełnie inny adres 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)
Jest to bardzo trudne do debugowania, tak naprawdę nie wiem od czego zacząć. Na początek, czym jest błąd zawieszenia gniazda? Czy to błąd 404 lub podobny? Czy to tylko oznacza, że serwer odrzucił połączenie?
Nigdzie nie mogę tego wyjaśnić!
EDYCJA: Oto próbka kodu, który (czasami) zwraca błędy:
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
});
}
Nie ma bezpośredniego połączenia, aby zamknąć połączenie, ale używam Node Requesttego (o ile wiem), http.getwięc nie jest to wymagane, popraw mnie, jeśli się mylę!
EDYCJA 2: Oto rzeczywisty, używany fragment kodu, który powoduje błędy. prodURLa inne zmienne to głównie selektory jquery, które zostały wcześniej zdefiniowane. Używa asyncbiblioteki dla Węzła.
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);
}
]);
});
}
requestusługi węzła , a nie konkretnego http.requestżądania (myślę, że jestem nowy w węźle!). To jest ten: github.com/mikeal/request Wygląda na to, że automatycznie kończy żądanie, nie? EDYCJA: Według dokumentów, http method, defaults to GETwięc nie o to chodzi.
cheerio.loadjest asynchroniczny. Więc może się nie skończyć, zanim zaczniesz robić rzeczy za pomocą $.
hang upoznacza zakończenie elektronicznej rozmowy przez przerwanie połączenia ; powstało z odłożenia starego telefonu.
endzdarzenia połączenia w określonym czasie. Jeśli otrzymujesz prośbę o cheerio przezhttp.request(niehttp.get). Musisz zadzwonić,request.end()aby zakończyć wysyłanie żądania.