2016-10-29 6 views
-1

私は、一連のキーワードを読み込んでAmazonで検索するスクレーパーをコーディングしようとしています。私は、そのページのキーワードと検索を使用して、そこにいくつのインスタンスがあるかを確認する必要があります。Node.jsでリクエストを取得してループを外してデータを取得する

私は検索したことがあり、人々は非同期関数とコールバックという用語を使用していましたが、その意味が分かりません。私はそれらの用語をグーグルで試してみましたが、私はまだ理解していません。

ここに私のコードがありますが、明らかに動作しません。私の現在の知識を使ってやろうとしていることを達成するための簡単な方法があれば、それは素晴らしいことです。

// load modules 
var request = require('request'); 
var cheerio = require('cheerio'); 

//split into array 
keywords = ["books", "bags", "shoes"]; 

// loop task for every keyword 
global.i 
for (i = 0; i < keywords.length; i++) { 
console.log(keywords[i] + " was loaded."); 

// get request 
request('https://www.amazon.com/s/?url=field-keywords=' + keywords[i], function (error, response, html) { 
    if (!error && response.statusCode == 200) { 
    var $ = cheerio.load(html); 

    // try to use the keyword (doesn't work) 
    console.log(keywords[i]); 

    } // end get request 
}); // get request end 

// Try to use the html outside get request (doesn't work) 
console.log(html); 

} // loop end 
+0

なぜあなたは同じ時間にすべてのリクエストを行うためにループを使用しようとしていますか?間隔を置いて1つずつ。 –

+0

それ以外は何を使うべきですか?私が必要とする1000個以下のキーワードでこれを行うと、今のところうまくいくようです。 –

+0

私はアマゾンが許可しているとは思わない –

答えて

0

送信したリクエストから、サーバー(ここではAmazon)が応答に時間がかかります。一般的には600ms未満です。したがって、その時間を待つ代わりに、JavaScriptは次の行に実行を継続します。だから、あなたがループの中にいるときに、あなたはリクエストをします。スクリプトは実行を続けます。さらに2件のリクエストが行われます。 3つすべてのリクエストが作成され、応答を待っています。その間、実行は次の行に進みます。 この時点では、変数htmlはアプリケーションスコープのどこにも定義されていません。だからそれは誤りを投げた。 3つの応答が受け取られた後でさえ、変数htmlは応答関数内でスコープされているので定義されません。以下のようにrequestのコールバック関数内で変数htmlを使用することができます

// load modules 
var request = require('request'); 
var cheerio = require('cheerio'); 

//split into array 
keywords = ["books", "bags", "shoes"]; 

// loop task for every keyword 
for (i = 0; i < keywords.length; i++) { 
    console.log("loading", keywords[i]); 

    // get request 
    request('https://www.amazon.com/s/?url=field-keywords=' + keywords[i],  
     function (error, response, html) { 
      if (!error && response.statusCode == 200) { 
       var $ = cheerio.load(html); 
       console.log(keywords[i]); 
       console.log(html); 
      } 
     } 
    ); 
} 
関連する問題