在刮擦之间暂停节点渗透

时间:2017-07-04 16:35:38

标签: javascript node.js web-scraping

我正在阅读csv中的链接并使用它来刮擦。我希望节点渗透在刮擦之间等待刮擦10个站点之后。我尝试使用睡眠,但它似乎在错误的时间睡觉,而下一个网站被刮,导致它失败。

const osmosis = require('osmosis');
const fs = require('fs');
const stream = fs.createReadStream("data.csv");
const csv = require('fast-csv');

let ii = 0;

const scrapeData = (row) => {

  osmosis
    .get(row[0])
    .set({
      'data': '#data',
    })
    .data(function (listing) {
        fs.appendFileSync('out2.ssv',listing.data);

       if(ii%10 == 0 && ii!==0){
           console.log('ss',ii);
          sleep.sleep(1000);
     }


      }
    })
}

let csvStream = csv()
  .on("data", function (data) {
      scrapeData(data)
      ii++;
  });

  stream.pipe(csvStream);

如何解决此问题。提前谢谢。

1 个答案:

答案 0 :(得分:0)

您的问题是该节点是异步的。您的查询将并行运行所有内容并在完成后休眠。也许你想要做的是使用setInterval或setTimeout。像这样的东西?

 var shouldPauseForTenSeconds = false
var listOfDataItems = []
var numberOfProcessedItems = 0

function scrapeData (row) {
    if(shouldPauseForTenSeconds) {
        shouldPauseForTenSeconds = false;
        setTimeout(scrapeData.bind(null,row), 10000);
    }
    listOfDataItems.push(row)
    numberOfProcessedItems++;
    if(numberOfProcessedItems % 10 == 0 && numberOfProcessedItems > 0) {
        numberOfProcessedItems = 0;
        shouldPauseForTenSeconds = true;
    }

    osmosis
        .get(row[0])
        .set({
            'data': '#data',
        })
        .data(function (listing) {
            fs.appendFileSync('out2.ssv',listing.data);
        })
}

let csvStream = csv()
.on("data", function (data) {
    scrapeData(data)
    ii++;
});

stream.pipe(csvStream);