我在几天的过程中(连续地)运行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()
答案 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"]