我正在阅读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);
如何解决此问题。提前谢谢。
答案 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);