2017-04-21 4 views
1

だからこれは私が要求してチェリオモジュール使用しています(私のページをクロールするために使用するコードです:私はパースだと後遅らせる要求

for (let j = 1; j < nbRequest; j++) 
{ 
    const currentPromise = new Promise((resolve, reject) => { 
    request(
     `https://www.url${j}`, 
     (error, response, body) => { 
     if (error || !response) { 
      console.log("Error: " + error); 
     } 

    console.log("Status code: " + response.statusCode + ", Connected to the page"); 

    var $ = cheerio.load(body); 
    let output = { 
     ranks: [], 
     names: [], 
     numbers: [], 
    }; 

    $('td.rangCell').each(function(index) { 
     if ($(this).text().trim() != "Rang") 
     { 
     output.ranks.push($(this).text().trim().slice(0, -1)); 
     nbRanks = nb_ranks+1; 
     } 

    }); 

    $('td.nameCell:has(label)').each(function(index) { 
     output.names.push($(this).find('label.nameValue > a').text().trim()); 
    }); 

    $('td.numberCell').each(function(index) { 
     if ($(this).text().trim() != "Nombre") 
     { 
     output.numbers.push($(this).text().trim()); 
     } 
    }); 

    console.log("HERE 1"); 
    return resolve(output); 
    } 
); 


}); 
    promises.push(currentPromise); 
    } 

をして、結果を保存するにはcsvファイルをノードモジュールで使用 この時点では約100ページをクロールできましたが、それよりはるかに大きな数値(1000+)になると、私は500レスポンスを受け取っています。 。 だから私は最善の解決策が要求を遅らせることがあると思いますが、私は解決策を見つけることができませんでした。 君たちがどんな考えを持っていますし、どのようにコードがどのように見えるのでしょうか?

答えて

1

あなたが探しているものは「コントロールフロー」と呼ばれ、例えばasync.queueを使ってこれを達成できます。

あなたがキューにすべての要求を追加する場合は、労働者の量と並行要求の量を制御することができます。また、要求のコールバックの最後の部分にsetTimeoutsを追加して、要求の遅延を達成することもできます。

さらに私は、例えば(代わりにあなた自身を構築する)「クローラー」のパッケージを使用してお勧めしたいですnpm-crawlerは、レート制限のビルドとともに出荷されており、次回に直面する可能性のある他の事柄をすでに処理しています。ユーザー・エージェント・プール

更新:

const async = require("async"); 
const delayTime = 1500; //wait 1,5 seconds after every new request 

getRequestPromise(csvLine){ 
return new Promise(make you request here); 
} 

const asyncQueue = async.queue(function(task, callback) { 
getRequestPromise(task).then(_ => { 
    setTimeout(() => { 
    callback(null); 
    }, delayTime); 
}); 
}, 1); //1 one request at a time 

for(csv){ //pseudo 
asyncQueue.push(csv[i],() => {}); 
} 

asyncQueue.drain =() => { 
console.log("finished."); 
}; 
+0

私はすでに各要求に対して約束を作成することにより、「流れを制御する」と思います。私のCSVファイルで、私は希望の順序でデータを受け取ります。 私はそれぞれの間に遅延を追加しようとしています。 –

+0

さて、あなたは単に「制御命令」であり、あなたの約束は同時に解決されるでしょう。 –

+0

はasync.queueのために手に入れましたが、リクエストのコールバックの最後の部分にsetTimeoutを追加すると助けてくれますか? –

関連する問題