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"]
祝您今天过得愉快。
我是 运行 一个 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"]