2017-06-19 36 views
0

無法訪問數據庫,所以我不得不取消網站以取回他的數據。 該網站和服務器開發不良,所以一些頁面大於10s渲染。NodeJS鏈接方法來取消緩慢的網站的好方法

我使用Node和request-promise來獲取html和cheerio來構建一個我想要轉換爲JSON文件的JS對象。我必須在URL參數的整個一天中循環(在2016年1月進行首次測試)。

我的問題是節點使用異步事件。所以我所有的循環都會在所有的request被製造的同時被觸發(大約100ms,因此就像瞬間)。該網站無法處理這個,所以我開始得到第一個HTML,然後500 error

我打算做的是在調用下一個請求(讓窮人的服務器呼吸一下)之前等待迭代完全報廢。

像這樣:

輸入環路=>請求=>獲取HTML背部(10秒)=>報廢磁盤=> i ++在它=>寫;輸入循環=> ...

而不是做它的異步。

這裏一堆我的代碼:

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天只有一切都很順利。

回答