CasperJS崩溃 - 刷新或重新安装可以避免它们吗?

时间:2017-02-10 01:23:14

标签: javascript phantomjs casperjs

希望你度过一个美好的一天。

我在几天的过程中(连续地)运行CasperJS刮掉大约100,000个链接。

每500个左右,casperJS随机崩溃。然而,当从最后一个链接重新加载并启动时,它将继续另外500个。

我想知道是否有人知道我可以刷新或关闭的有效方式。重新安装casperjs,以避免这种倦怠?我在考虑退出()与等待,但非常热衷于思考!

该脚本类似于:

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()

1 个答案:

答案 0 :(得分:0)

有一个已知的PhantomJS内存问题。你应该开发一个&#34; runner&#34 ;,它运行你的CasperJS脚本,包含大约400个链接,收集结果,然后用另一部分链接运行另一个脚本实例,到目前为止。

如果你需要速度,也许你可以让一些CasperJS实例并行运行。

你可以使用 spawn 函数开发PhantomJS这样的跑步者。 该功能在PhantomJS文档中简要描述:http://phantomjs.org/api/child_process/

<强>更新

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

跑步者使用Q承诺,所以首先你必须使用以下内容制作文件 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();
});

您可以通过以下方式执行运行器,这意味着 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"]