【问题标题】:Is it pjscrape that is slow, or is it PhantomJS? Alternative scraper?是 pjscrape 慢,还是 PhantomJS?替代刮刀?
【发布时间】:2013-06-26 07:35:15
【问题描述】:

我刚刚为 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 解决方案?

【问题讨论】:

  • 请显示 phantom.js 节点代码。因为问题可能存在。
  • @MaksimsMihejevs 我是 phantom.js 的新手,所以我不确定包含“节点代码”的内容。我已经编辑了我的问题以显示完整的脚本。对我来说真的没什么,所有的工作都是由 pjscrape 完成的。
  • 您是否衡量过执行所需时间最多的内容?由于 phantom.js 使用 QT 和 WebKit,因此您的节点将要求 phantom 运行单独的进程,该进程将启动和初始化所有复杂组件,以使“浏览器”工作。然后你可以加载东西并与之交互。初始化幻象 - 通常是一个瓶颈,因此您可以考虑将其初始化一次然后重用。请测量瓶颈区域,它可能是幻象的初始化,而不是您上面发布的脚本。
  • 我知道这不是主题,但你能分享一下你是如何在 chrome 中运行它的吗?管理图书馆不是几乎不可能吗?
  • @Shy:当我说“我在 Chrome 中运行相同的代码(只是刮板函数())并且它是即时的”时,我指的是检查 DOM 并抓取的代码价值观。我在 Chrome 中的测试涉及加载静态 HTML 并针对它运行我的 scraper 函数。我从不在 Chrome 中运行 phantom.js 或 pjscrape。

标签: javascript node.js screen-scraping phantomjs


【解决方案1】:

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

【讨论】:

  • 你说得对,我不需要客户端 JS,它只是静态 HTML。我会调查这条路线。
【解决方案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);
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-02
    相关资源
    最近更新 更多