0

nodejswithを使用しcheerioて Web サイトからデータをスクレイピングすると、そこからオブジェクトが作成されます。次に、そのオブジェクトを取得して関数で使用する必要があります。

問題は、オブジェクトが作成されているがcheerio、データを適切に解析してオブジェクトに入れる前に、次の関数が既に実行されていることです。これが私のコードです:

function getInfo(obj, link){
    request(link, function(err, resp, body) {
        if (err) {
            console.log("Uh-oh: " + err);
            throw err;
        }
        $ = cheerio.load(body);
        function createProduct(obj, callback){
            var product = {
                    name        : $('#name').text(),
                    gender      : obj.gender,
                    infoLink    : link,
                    designer    : $('.label').first().text(),
                    price       : $('#price').first().text(),
                    description : $('.description').text(),
                    date        : new Date()
            }
           product.systemName = (function(){
            return product.name.replace(/\s+/g, ' ');
           }());

            callback(product);
        }
        createProduct(obj, function(product){
            lookUp(product);
        });

ここではさまざまな結果が得られます。一部のproductオブジェクトは、すべての詳細が適切に入力された状態で関数に送信されています。説明が欠落しているものもあれば、入力されたすべてcheerioのコンテンツが欠落しているものもあります。他のものにはcheerioスクレイピングされたコンテンツがありますが、特定のビットが欠落しています. および属性は常に存在し、プロパティは存在しますが、それらは空白です (たとえばgender、未定義ではなく戻ります)。dateproduct.name""

問題のある各リンクを確認しましたが、すべてのページにスクレイピングする正しいセレクターが含まれています。

productオブジェクトが入力されたら、コールバックを ONLY 関数に設定するにはどうすればよいですか?

4

1 に答える 1

1

これらの結果を得ることができる 2 つの可能な非同期実行があります。

  1. cheerio.loadcreateProductが呼び出される前に終了していません。
  2. IncreateProduct productが読み込まれていないか、部分的に説明callbackが呼び出される前に似ています (不明)。

非同期ライブラリを使用して、関数を同期的に実行できます(を使用async.series)。も非同期の場合createProductは、同様の方法で同期にする必要があります。

async.series([
    function(callback){
        $ = cheerio.load(body);
        callback();
    },
    function(callback){
        createProduct(obj, function(product){
            lookUp(product);
        });
        callback();
    }
]);
于 2013-06-07T05:08:29.030 に答える