0

すべてのタイトルを取得するためにブログをナビゲートするスクラップ スクリプトを作成しました。問題は、スクリプトの実行 (数千の URL) が 8 go (最大) になるまで Node がますます多くのメモリを使用し続け、その後スクリプトがクラッシュすることです。

私のスクリプトはループを使用しています。メモリをクリアする簡単な方法はありますか?

コード例を次に示します。

var request = require('request'),
httpAgent = require('http-agent'),
jsdom = require('jsdom').jsdom,
myWindow = jsdom().createWindow(),
$ = require('jquery'),
jq = require('jquery').create(),
jQuery = require('jquery').create(myWindow),
profiler = require('v8-profiler');

profiler.startProfiling();

request({ uri:'http://www.guylabbe.ca' }, function (error, response, body) {
  if (error && response.statusCode !== 200) {
    console.log('Error when contacting URL')
  }


        var last_page_lk = $(body).find('.pane-content .pager li:last-child a').attr('href');
        var nb_pages = last_page_lk.substring(last_page_lk.indexOf('=')+1);
        var page_lk_base = last_page_lk.substring(0,last_page_lk.indexOf('='));

        var pages = Array();
        pages.push(page_lk_base);
        for(var i=1;i<=nb_pages;i++) {
            pages.push(page_lk_base+'='+i);
        }


        // parser les pages

        var fiches = Array();
        var agent2 = httpAgent.create('www.guylabbe.ca', pages);

        agent2.addListener('next', function (err, agent2) {

            var snapshot = profiler.takeSnapshot();


            $(body).find('.view span.field-content span.views-field-title').each(function(){
                fiches.push($(body).find(this).parents('a').attr('href'));
                //console.log($(body).find(this).html());
            });


            agent2.next();

        });
        agent2.start();

        agent2.addListener('stop', function (agent) {
          console.log('-------------------------------- (fini de cumuler les URL fiches) --------------------------------');

            // Parser les fiches

            var agent_fiches = httpAgent.create('www.guylabbe.ca', fiches);

            agent_fiches.addListener('next', function (err, agent_fiches) {

                console.log('log info');


                agent_fiches.next();

            });
            agent_fiches.start();

            agent_fiches.addListener('stop', function (agent) {
              console.log('-------------------------------- Eh voilà! --------------------------------');
            });

            agent_fiches.addListener('start', function (agent) {
              console.log('-------------------------------- C est parti... --------------------------------');
            });

        });



});
4

2 に答える 2

1

jsdom がメモリをリークするという同様の問題がありました。私の場合、jsdomウィンドウを閉じて解決しました。myWindow.close()スクレイピングが完了したら、追加する必要があるかもしれません。関連する回答を参照してください https://stackoverflow.com/a/6891729/1824928

于 2013-01-28T21:26:59.013 に答える
1

もう必要ない場合は、変数を明示的に null にします。クロージャーの外側で変数を作成し、それをクロージャーの内側で使用する場合は、不要になったときに null にする必要があります。このスレッドを参照して、受け入れられた回答を読んでください: node.js でのメモリ リークを防ぐには?

于 2013-01-28T20:54:25.320 に答える