我刚刚开始使用pjscrape并尝试运行http://nrabinowitz.github.io/pjscrape/#overview上提供的示例刮刀并在终端中调用以下命令,但它给了我错误:
$ phantomjs /Applications/nrabinowitz-pjscrape-600e20a/pjscrape.js my_config.js
TypeError:undefined不是对象(评估 'phantom.args.length')
/Applications/nrabinowitz-pjscrape-600e20a/pjscrape.js:834全球 代码^ Z
[6] +停止了幻影 /Applications/nrabinowitz-pjscrape-600e20a/pjscrape.js my_config.js
但后来我发现它可能是因为在pjscrape.js文件中,它使用的phantom.args.length
已经在较新的幻像中被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:超出最大调用堆栈大小。
undefined:在injectJs中为0 RangeError:最大调用堆栈大小 超出。
undefined:injectJs中的0 /Applications/nrabinowitz-pjscrape-600e20a/pjscrape.js:844:0 in forEach RangeError:超出最大调用堆栈大小。
undefined:injectJs中的0 /Applications/nrabinowitz-pjscrape-600e20a/pjscrape.js:844:0 in forEach RangeError:超出最大调用堆栈大小。
/Applications/nrabinowitz-pjscrape-600e20a/pjscrape.js:850全球 code:0 in injectJs
/Applications/nrabinowitz-pjscrape-600e20a/pjscrape.js:844:0 in forEach RangeError:超出最大调用堆栈大小。undefined:injectJs中的0 /Applications/nrabinowitz-pjscrape-600e20a/pjscrape.js:844:0 in forEach FATAL ERROR:没有配置套件
现在我真的不知道出了什么问题。我的my_config.js(我用pjscrape定义了我的刮刀)看起来像这样:
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计算器生成的,该计算器只接受一组输入并一次生成一个结果。但我也希望在计算器中输入数以千计的不同输入,并得到一个巨大的结果表。
答案 0 :(得分:3)
system.args
返回所有命令行参数,包括原始脚本,而phantom.args
仅返回脚本文件后的命令行参数。基本上,它会进入无限循环,因为它会一直注入pjscrape.js
文件,直到达到最大调用堆栈大小。
解决方案:拼掉第一个参数:system.args.splice(1).forEach...