【问题标题】:pausing node-osmosis between scrapes在刮擦之间暂停节点渗透
【发布时间】:2017-07-05 21:24:08
【问题描述】:

我正在从 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);

我该如何处理这个问题。提前致谢。

【问题讨论】:

  • 如果块在 readFileSync 之上,你应该尝试移动...
  • 我没有使用 readFileSync
  • 我只是使用阻塞写入来追加内容
  • 我的意思是,在 appendFileSync 上方移动 if 块

标签: javascript node.js web-scraping


【解决方案1】:

您的问题是节点是异步的。您的查询将并行运行所有内容并在完成后休眠。也许您想要做的是使用 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);

【讨论】:

    猜你喜欢
    • 2014-09-25
    • 2017-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-08
    • 2016-03-16
    相关资源
    最近更新 更多