4649


CasperJS であるサイトをクロールし、クロールした情報をデータベースに格納する処理を作成しましたが、クロール中にメモリが97%程度まで上がり、
`Killed` と表示され終了してしまいます。

メモリを大幅に使用してしまう原因は、以下のいずれかだと予想しています。

  1. クロールした情報を格納している配列が大きすぎる
  2. `eachThen` を使用しクロールするページが多すぎる

1.が原因の場合、ある程度の数になったら配列情報をデータベースに格納し、配列の中身をクリア。その後、クロールを継続する方法、または、参考になるサイト教えて頂けますでしょうか。

また、 2.が原因の場合を想定して、 `casper.page` オブジェクトの `close()` を使用したのですが、

[code]

    Error: cannot access member `customHeaders' of deleted QObject                  
    
[/code]

と表示されてしまいます。原因を教えて頂けますでしょうか。

上記のいずれでもない場合は、原因、または参考になるサイトを教えて頂けますでしょうか。

よろしくお願いします。

[code]

    'use strict';
    
    var i, e;
    var targets = new Array();
    var title = new Array();
    var page = new Array();
    var image = new Array();
    var duration = new Array();
    var video = new Array();
    var ua = ('Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_2_1 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8C148 Safari/6533.18.5');
    
    for (i=0; i<10; i++) {
      targets.push('http://example.com&page=' + i);
    }
    
    var casper = require('casper').create({
      exitOnError: true,
      verbose: true,
      logLevel: "debug",
      pageSettings: {
        loadImages: false,
        loadPlugins: false
      }
    }).userAgent(ua);
    
    casper.start().eachThen(targets, function(response){
      this.thenOpen(response.data, function(response){
    
        //タイトルを取得
        e = this.getElementsInfo('.thumbInside>p>a');
        for (i=0; i < e.length; i++) {
          title.push(e[i]['text']);
        }
    
        //時間を取得
        e = this.getElementsInfo('.duration');
        for (i=0; i < e.length; i++) {
          duration.push(e[i]['text'].replace(/min/, "分").replace(/()/, ""));
        }
    
        //画像ファイルを取得
        e = this.getElementsInfo('.thumb>a>img');
        for (i=0; i < e.length; i++) {
          image.push(e[i]['attributes']['src']);
        }
    
        //ページURLを取得
        e = this.getElementsInfo('.thumb>a');
        for (i=0; i < e.length; i++) {
          page.push('http://example.com' + e[i]['attributes']['href']);
        }
    
      });
    });
    
    //動画ファイルURLを所得
    casper.then(function(){
      this.eachThen(page, function(response){
        this.thenOpen(response.data, function(response){
          this.thenClick('#playbtn>a', function(){
            video.push(this.requestUrl);
          });
        });
      });
    });
    
    casper.thenOpen('http://localhost/add.php', {
      method: 'post',
      data: {
        'site': site,
        'title[]': title,
        'page[]': page,
        'image[]': image,
        'duration[]': duration,
        'video[]': video
      }
    });
    
    casper.run(function(){
      this.exit();
    });
    
[/code]


CC BY-SA 3.0
2015-01-14T06:13:07.297
4534
2015-01-16T00:43:19.037
2015-01-14T07:21:48.567
question
javascript casperjs
CasperJSでクロール中に、メモリ使用が 97% 程度まで上がり、 Killed と表示され終了してしまう


<https://github.com/n1k0/casperjs/pull/826>  
ここを参考にし、modules/casper.jsに`newPage()`を追記し、  
クロール処理に、以下のように、

[code]

    casper.page.close();
    casper.newPage();
    
[/code]

を追加することによって、処理が最後まで完了するようになりました。

[code]

    casper.start().eachThen(targets, function(response){
      this.thenOpen(response.data, function(response){
    
        //タイトルを取得
        e = this.getElementsInfo('.thumbInside>p>a');
        for (i=0; i < e.length; i++) {
          title.push(e[i]['text']);
        }
    
        //時間を取得
        e = this.getElementsInfo('.duration');
        for (i=0; i < e.length; i++) {
          duration.push(e[i]['text'].replace(/min/, "分").replace(/()/, ""));
        }
    
        //画像ファイルを取得
        e = this.getElementsInfo('.thumb>a>img');
        for (i=0; i < e.length; i++) {
          image.push(e[i]['attributes']['src']);
        }
    
        //ページURLを取得
        e = this.getElementsInfo('.thumb>a');
        for (i=0; i < e.length; i++) {
          page.push('http://example.com' + e[i]['attributes']['href']);
        }
    
        //処理を追加
        casper.page.close();
        casper.newPage();
    
      });
    });
    
    //動画ファイルURLを所得
    casper.then(function(){
      this.eachThen(page, function(response){
        this.thenOpen(response.data, function(response){
          this.thenClick('#playbtn>a', function(){
            video.push(this.requestUrl);
    
        　　//処理を追加
        　　casper.page.close();
        　　casper.newPage();
          });
        });
      });
    });
    
[/code]


CC BY-SA 3.0
2015-01-16T00:11:06.137
4649
2015-01-16T00:43:19.037
2015-01-16T00:43:19.037
4534
answer