データベースにアクセスできないので、データを取り戻すために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日間のために働くためにループを微調整した場合。