CasperJS 崩溃——可以通过刷新或重新实例化来避免吗?

CasperJS crashes - can they be avoided with refresh or reinstance?

祝您今天过得愉快。

我是 运行 一个 CasperJS,在几天的时间里(连续)抓取了大约 100,000 links。

每 500 次左右,casperJS 就会随机崩溃。然而,当重新加载并从最后一个 link 开始时,它会继续 500。

我想知道是否有人知道我可以刷新或关闭并重新实例化 casperjs 以避免这种倦怠的有效方法?我正在考虑将 exit() 与等待配对,但非常热衷于思考!

脚本类似于:

var casper = require('casper').create({
  verbose: true,
  logLevel: 'error',
  pageSettings: {
    loadImages: false,
    loadPlugins: true,
    userAgent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11'
  },
  clientScripts: ['vendor/jquery.min.js', 'vendor/lodash.js'],
 viewportSize: {
    width: 1600,
    height:1000
  }
});

var linkArray = [ // Includes 100,000 + links ]

function inspectUrl(url) {
    casper.thenOpen(url, function() {
        title = this.getPageTitle();
        bodyText = this.fetchText('body');

        // Includes a bunch of other tasks to do.
}


casper.start('https://www.google.com.au', function() {
    console.log('Booting up CasperJS...');
});

casper.then(function() {
    for (var i = 0; i < linkArray.length; i++) {
        inspectUrl(linkArray[i]);
    };
});

casper.run()

存在一个已知的 PhantomJS 内存问题。你应该开发一个 "runner",它 运行 是你的 CasperJS 脚本和大约 400 个链接,收集结果,然后 运行 是另一个脚本实例和另一部分链接,到目前为止。

如果您需要速度,也许您可​​以并行创建一些 CasperJS 实例 运行。

您可以使用 spawn 函数使用 PhantomJS 开发这样的 运行ner。 该函数在 PhantomJS 文档中有简要描述:http://phantomjs.org/api/child_process/

更新:

您可以在下面找到这样一个 运行ner 的工作示例。这个例子非常简单,只是为了演示如何 spawn CasperJS 实例并收集它们的结果。特别是,示例中根本没有错误处理。该示例已使用 PhantomJS 2.1.1 进行测试。

运行ner 使用 Q promises,所以首先你必须使用以下内容制作文件 package.json

{
    "dependencies": {
        "q": "1.4.1"
    }
}

和运行安装程序:

npm install

然后你必须创建runner.js

var Q = require('q');
var childProcess = require('child_process');

var parserTasks = [
    'http://phantomjs.org/',
    'http://casperjs.org/',
    'https://jquery.com/'
];

run(parserTasks).then(function(result) {
    console.log('Tasks result: ' + JSON.stringify(result));
    phantom.exit();
});

function run(tasks) {
    if (tasks.length) {
        var task = tasks.pop();
        return runTask(task).then(function(result) {
            console.log('result: ' + result);
            return run(tasks).then(function(results) {
                return([result].concat(results));
            });
        });
    } else {
        return Q([]);
    }
}

function runTask(task) {
    var defer = Q.defer();

    var spawn = childProcess.spawn;
    var result = '';
    var child = spawn('casperjs', ['parser.js', task]);
    console.log("spawn run: " + task);
    child.stdout.on("data", function(data) {
        result += data;
    });
    child.on("exit", function() {
        defer.resolve(result);
    });

    return defer.promise;
}

parser.js

var casper = require('casper').create();

var url = casper.cli.args[0];

var result;

casper.start();

casper.thenOpen(url, function() {
    result = this.getTitle();
});

casper.run(function() {
    this.echo(result).exit();
});

您可以按以下方式执行 运行ner,这意味着 phantomjs 可执行文件位于 PATH 中的某个位置。

phantomjs runner.js

输出应如下所示:

spawn run: https://jquery.com/
result: jQuery

spawn run: http://casperjs.org/
result: CasperJS, a navigation scripting and testing utility for PhantomJS and SlimerJS

spawn run: http://phantomjs.org/
result: PhantomJS | PhantomJS

Tasks result: ["jQuery\n","CasperJS, a navigation scripting and testing utility for PhantomJS and SlimerJS\n","PhantomJS | PhantomJS\n"]