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

时间:2013-06-28 13:49:14

标签: javascript node.js screen-scraping phantomjs

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

我从localhost加载文件,因此瓶颈肯定不在转移中。

我的 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;

    }
}

然后我使用命令行指令here执行PhantomJS。

~> phantomjs pjscrape.js config.js

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

任何导致缓慢的线索?

有没有更好的方法来进行DOM屏幕抓取?也许是nodejs解决方案?

2 个答案:

答案 0 :(得分:2)

如果Node.JS是一个选项,我可以向您介绍cheerio吗?它是一个很好的库,用于消费可疑形式的HTML文档。它为您提供了类似jQuery的API,用于处理您正在抓取的页面的类似DOM的表示。与request配对,可以轻松抓取HTML。

您的示例最终会看起来像这样(错误处理留给读者练习):

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);
});

答案 1 :(得分:1)

如果您使用的网页发送完整格式的HTML并且不需要客户端javascript将DOM操作为其最终形式,请跳过phantomjs并使用http客户端库(节点核心或{{3} }或requestsuperagent)并使用hyperquest从DOM中提取所需的数据。