2017-06-19 15 views
0

データベースにアクセスできないので、データを取り戻すためにWebサイトをスクラップする必要があります。 サイトとサーバーの開発がうまくいかないため、一部のページがレンダリングするのに10秒以上を要しました。NodeJS遅いWebサイトをスクラップする方法をチェーンする良い方法

Nodeを使用してrequest-promiseを取得し、cheerioを使用してJSONファイルに変換するJSオブジェクトを作成します。私はURLのparamsでserval年の終日をループする必要があります(最初にテストするために2016年1月にそれをやっています)。

私の問題はノード使用非同期イベントです。だから私のループはすべてrequestが作られたのと同時に(約100msのように瞬間的に)トリガーされます。ウェブサイトはこれを処理できないので、私は最初のhtmlを取得し始めました500 error

私がやってみたいのは、次のリクエストを呼び出す前に(貧弱なサーバーを少し呼吸させるために)、繰り返しを完全に止めるまで待つことです。

ので、同様:

がループを入力します=>ディスク=> I ++のそれは=>書き込みスクラップ> =を=> GET HTMLバック(10秒)を要求。ループを入力=> ...

と非同期にしないでください。ここで

私のコードの束:

var rp = require('request-promise') 
var cheerio = require('cheerio') 

[...] 

console.log('Start '); 

let array = [] 

for (var year = 2016; year < 2017; year++) { 

for (var month = 1; month <= 1; month++) { 

for (var day = 1; day <= 31; day++) { 

const options = { 
    url : 'http://myurl', 
    Cookie: cookie, 
    transform: function (body) { 
     return cheerio.load(body); 
    } 
} 

let data 

rp(options) 
    .then(function ($) { 
     => My Scrapping stuff return in data 
    }) 
    .catch(function (err) { 
     // Crawling failed or Cheerio choked... 
    }) 
    .pipe(fs.writeFile(`./data/${timestamp}.json`, JSON.stringify(data), function(err) { 
      if (err) { 
      console.log(err); 
      } 
      console.log(` File successfully written! - ${timestamp}`) 
     }) 

     } 
    } 
} 

私はすべてがうまくいっているような2または3日間のために働くためにループを微調整した場合。

答えて

関連する問題