我刚开始使用pjscrape并尝试运行http://nrabinowitz.github.io/pjscrape/#overview上提供的示例刮板,并在终端中调用以下命令,但它给了我错误:
$ phantomjs /Applications/nrabinowitz-pjscrape-600e20a/pjscrape.js my_config.js
TypeError:未定义不是对象(正在评估
'phantom.args.length')
/Applications/nrabinowitz-pjscrape-600e20a/pjscrape.js:834在全球
代码^ Z
[6] +已停止的phantomjs
/Applications/nrabinowitz-pjscrape-600e20a/pjscrape.js my_config.js
但是后来我发现这可能是因为在pjscrape.js文件中,它使用了
phantom.args.length
,而在新的phantomJS中,该system.args
已被取代。所以我修改了原始的pjscrape.js:var system = require('system');
// make sure we have a config file
if (!system.args.length) {
// die
console.log('Usage: pjscrape.js <configfile.js> ...');
phantom.exit();
} else {
// load the config file(s)
system.args.forEach(function(configFile) {
if (!phantom.injectJs(configFile)) {
fail('Config file not found: ' + configFile);
}
});
}
然后我运行了相同的命令,但是它给了我以下错误:
RangeError:超出最大调用堆栈大小。
injectJs RangeError中的undefined:0:最大调用堆栈大小
超出。
在injectJs中未定义:0
/Applications/nrabinowitz-pjscrape-600e20a/pjscrape.js:844:0 in
forEach RangeError:超出最大调用堆栈大小。
在injectJs中未定义:0
/Applications/nrabinowitz-pjscrape-600e20a/pjscrape.js:844:0 in
forEach RangeError:超出最大调用堆栈大小。
/Applications/nrabinowitz-pjscrape-600e20a/pjscrape.js:850在全球
injectJs中的代码:0
/Applications/nrabinowitz-pjscrape-600e20a/pjscrape.js:844:0 in
forEach RangeError:超出最大调用堆栈大小。
在injectJs中未定义:0
/Applications/nrabinowitz-pjscrape-600e20a/pjscrape.js:844:0 in
每个致命错误:未配置套件
现在我真的不知道怎么了。我的my_config.js(我使用pjscrape定义了我的scraper)看起来像这样:
pjs.addSuite({
// url to scrape
url: 'http://en.wikipedia.org/wiki/List_of_towns_in_Vermont',
// selector to look for
scraper: '#sortable_table_id_0 tr td:nth-child(2)'
});
有人可以帮我弄清楚如何解决问题吗?
最终,我希望能够抓取一个网站,在该网站上,我需要的内容是由JavaScript计算器生成的,该JavaScript计算器仅接受一组输入并一次生成一个结果。但是我也想向计算器输入数千种不同的输入并获得庞大的结果表。
最佳答案
system.args
返回所有命令行参数,包括原始脚本,而phantom.args
仅返回脚本文件之后的命令行参数。基本上,它进入无限循环,因为它一直注入pjscrape.js
文件,直到达到最大调用堆栈大小为止。
解决方案:取消第一个参数:system.args.splice(1).forEach...