Node と Cheerio を使用して Web スクレイパーを構築していますが、特定の Web サイトで次のエラーが発生します (これはこの 1 つの 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)
これはデバッグが非常に難しく、どこから始めればよいかわかりません。まず、ソケット ハングアップ エラーとは何ですか? 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
(私が知る限り) which を使用してhttp.get
いるので、これは必須ではありません。間違っている場合は修正してください!
編集 2: これは、エラーを引き起こしている実際の使用中のコードです。prodURL
その他の変数は、ほとんどが以前に定義された jquery セレクターです。これはasync
Node.js 用のライブラリを使用します。
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);
}
]);
});
}