CasperJSでクロール中に、メモリ使用が 97% 程度まで上がり、 Killed と表示され終了してしまう
CasperJS であるサイトをクロールし、クロールした情報をデータベースに格納する処理を作成しましたが、クロール中にメモリが97%程度まで上がり、 Killed
と表示され終了してしまいます。
メモリを大幅に使用してしまう原因は、以下のいずれかだと予想しています。
- クロールした情報を格納している配列が大きすぎる
eachThen
を使用しクロールするページが多すぎる
1.が原因の場合、ある程度の数になったら配列情報をデータベースに格納し、配列の中身をクリア。その後、クロールを継続する方法、または、参考になるサイト教えて頂けますでしょうか。
また、 2.が原因の場合を想定して、 casper.page
オブジェクトの close()
を使用したのですが、
Error: cannot access member `customHeaders' of deleted QObject
と表示されてしまいます。原因を教えて頂けますでしょうか。
上記のいずれでもない場合は、原因、または参考になるサイトを教えて頂けますでしょうか。
よろしくお願いします。
'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();
});