「request」と「cheerio」を使ってスクレイパーを書こうとしています。100 個の URL の配列があります。私は配列をループし、各 URL で「リクエスト」を使用してから、cheerio.load(body) を実行しています。i を 3 より大きくすると (つまり、テストのために i < 3 に変更すると)、var productNumber が定義されておらず、未定義の変数で split を呼び出すことができないため、スクレーパーが壊れます。Webページが応答し、本体をcheerioでロードする時間がある前にforループが進んでいると思います.nodeJS - Cheerioでコールバック関数を使用するという質問は同意するようです.
私の問題は、未定義の変数を取得しないように、ループの各反復でWebページが「ロード」または解析されたことを確認する方法がわからないことです。他の回答によると、コールバックは必要ありませんが、どうすればよいですか?
for (var i = 0; i < productLinks.length; i++) {
productUrl = productLinks[i];
request(productUrl, function(err, resp, body) {
if (err)
throw err;
$ = cheerio.load(body);
var imageUrl = $("#bigImage").attr('src'),
productNumber = $("#product").attr('class').split(/\s+/)[3].split("_")[1]
console.log(productNumber);
});
};
出力例:
1461536
1499543
TypeError: Cannot call method 'split' of undefined