我刚开始使用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...

10-06 08:05