1

これは、 Crawler上で動作する web-crawler のショートカット コードであり、うまく機能します。問題は、クローラーが 0.5 秒間に 20 個の文字列を返し、MySQL への格納が新しいものよりもはるかに遅いことです。この両方のプロセスをどのように適切に同期するか。

function crawler(done) {
  for (i=0, ...) { 
    crawler.queue([{
      "uri": link,
      "callback": function (error, result, $) {
        var arr = $('.someclass');
        done(arr);  
      }
   }])
 };
};

crawler (function (arr) {
  savetosql(s, arr);
});

function savetosql (s, arr) {
  var query = connection.query('UPDATE ...');
};
4

1 に答える 1

1

これがあなたが探しているものかどうかはわかりませんが、私はクローラーを使用したことはありませんが、これは node.js でものをシリアル化する方法です。

function crawl_step(step,limit) {
  //for (i=0, ...) { no more for
    crawler.queue([{
      "uri": link,
      "callback": function (error, result, $) {
        var arr = $('.someclass');
        //done(arr);
        var query = connection.query('UPDATE ...',calbback(...){
            //this runs when the sql query is over
            if(step<limit) crawl_step(step+1,limit);
            else {....do something when all crawls are over ...}
        });
      }
   }])
 //};
};

crawl_step(0,100);

シリアル化プロセスを理解しやすくするために、いくつかの基本的な API に取り組みましょう。ファイルが存在する場合にのみ 100 個のファイルを読み取ります (非同期呼び出しを使用しますが、同期方式で行います)。

function step(step_nr){
    fs.exists( step_nr+'.txt' , function (exists) {
        fs.readFile( step_nr+'.txt' , function (err, data) {
           if (err) throw err;
           console.log(data);
           if(step_nr<100) step(step_nr+1);
        });
    });
}
step(0);
于 2013-06-25T14:00:05.060 に答える