NodeとCheerioを使用してWebスクレイパーを構築していますが、特定のWebサイトで次のエラーが発生します(このWebサイトでのみ発生し、他のWebサイトをスクレイプしようとすると発生しません)。
毎回異なる場所で発生するためurl x、エラーが発生する場合もあれば、url xまったく別の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)
これはデバッグが非常に難しいので、どこから始めればいいのか本当にわかりません。開始するには、どのようなISソケットがエラーをハングアップ?404エラーまたはそれと同様のものですか?それとも単にサーバーが接続を拒否したということですか?
これの説明はどこにもありません!
編集:これは、(時々)エラーを返すコードのサンプルです:
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
});
}
接続を閉じるための直接呼び出しはありませんが、私は使用しています Node Request、私が知る限りではhttp.get、これを使用しているため、これは必要ありません。間違っている場合は修正してください!
編集2:エラーの原因となっている実際の使用中のコードを以下に示します。prodURLその他の変数は、ほとんどが以前に定義されたjqueryセレクターです。これはasyncノードのライブラリを使用します。
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は、特定のhttp.requestリクエストではなくノードサービスを使用していることです(私はノードは非常に新しいので!)。これはgithub.com/mikeal/requestです。これは、リクエストを自動的に終了するようです。編集:ドキュメントによると、http method, defaults to GETそれは問題ではありません。
cheerio.loadは非同期です。したがって、$を使って作業を開始する前に終了しない場合があります。
endタイムアウト期間内に接続イベントを送信しないことを意味します。http.request(ではなくhttp.get)を介してcheerioのリクエストを受け取っている場合。request.end()リクエストの送信を完了するには、電話する必要があります。