使用PhantomJS和pjscrape来抓取动态生成的网页内容

时间:2015-11-03 19:40:00

标签: javascript web-scraping phantomjs dynamically-generated

我刚刚开始使用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计算器生成的,该计算器只接受一组输入并一次生成一个结果。但我也希望在计算器中输入数以千计的不同输入,并得到一个巨大的结果表。

1 个答案:

答案 0 :(得分:3)

system.args返回所有命令行参数,包括原始脚本,而phantom.args仅返回脚本文件后的命令行参数。基本上,它会进入无限循环,因为它会一直注入pjscrape.js文件,直到达到最大调用堆栈大小。

解决方案:拼掉第一个参数:system.args.splice(1).forEach...