0

「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
4

2 に答える 2

0

いくつかの外部サイトをスクレイピングしています。HTML がすべて正確に同じ構造に適合するかどうかを確認することはできないため、どのようにトラバースするかについて防御する必要があります。

var product = $('#product');
if (!product) return console.log('Cannot find a product element');
var productClass = product.attr('class');
if (!productClass) return console.log('Product element does not have a class defined');
var productNumber = productClass.split(/\s+/)[3].split("_")[1];
console.log(productNumber);

これは、問題が発生している場所をデバッグするのに役立ち、おそらく、期待したほど簡単にデータセットをスクレイピングできないことを示しています。

于 2013-09-29T09:33:32.637 に答える