这是慢的,还是PhantomJS? 替代刮刀?

我刚刚写了我的第一个脚本,但我发现它运行非常缓慢。 我对pjscrape和phantomjs都是新手,所以我不知道哪个是罪魁祸首。

我正在从本地主机加载文件,所以瓶颈绝对不在传输中。

我的config.js脚本如下所示:

pjs.addSuite({ url: 'http://localhost/file.html'. scraper: function() { var people = $('table.person'); var results = []; $.each(people, function() { var $this = $(this); results.push({ firstName: $this.find('.firstName').text(), lastName: $this.find('.lastName').text(), age: $this.find('.age').text() }); } return results; } } 

然后我使用这里的命令行指令来执行PhantomJS。

~> phantomjs pjscrape.js config.js

我在Chrome中运行相同的代码(只是刮板函数()),它是即时的。 在phantomjs / pjscrape中,需要30秒。

任何线索是什么造成缓慢?

有没有更好的方式来做这个DOM屏幕抓取? 也许一个nodejs解决scheme?

如果Node.JS是一个选项,我可以向你介绍cheerio吗? 这是一个伟大的库消耗可疑的HTML文件。 它为您提供了一个类似于jQuery的API,用于处理您正在抓取的页面的类似于DOM的表示。 配合请求 ,它使得一个非常容易的刮HTML的环境。

你的例子最终会看起来像这样(error handling留给读者的练习):

 var cheerio = require("cheerio"), request = require("request"); request("http://localhost/file.html", function(err, res, data) { var $ = cheerio.load(data); var people = $('table.person'); var results = []; $.each(people, function() { var $this = $(this); results.push({ firstName: $this.find('.firstName').text(), lastName: $this.find('.lastName').text(), age: $this.find('.age').text() }); } do_something_with(results); }); 

如果您正在使用的网页发送完整的HTML,并且不需要客户端JavaScript来操纵DOM到其最终forms,那么跳过phantomjs,并使用http客户端库(节点核心或请求或超合成或超级 请求 )使用cheerio从DOM中提取所需的数据。