【问题标题】:How do you spider with PhantomJS你如何使用 PhantomJS 进行爬虫
【发布时间】:2011-11-16 04:16:45
【问题描述】:

我正在尝试利用 PhantomJS 和蜘蛛整个域。我想从根域开始,例如www.domain.com - 拉取所有链接(a.href),然后获取每个新链接,如果它们尚未被抓取或在队列中,则将新链接添加到队列中。

想法,帮助?

提前致谢!

【问题讨论】:

  • 向我们展示您已实现的一些代码,我们可以提供帮助。顺便说一句,我不确定只有 javascript 会帮助你。

标签: web-crawler phantomjs


【解决方案1】:

您可能有兴趣查看Pjscrape(免责声明:这是我的项目),这是一个基于 PhantomJS 构建的开源抓取库。它具有对蜘蛛页面的内置支持,并在其进展时从每个页面中抓取信息。你可以爬取整个网站,查看每个锚链接,使用如下短脚本:

pjs.addSuite({
    url: 'http://www.example.com/your_start_page.html',
    moreUrls: function() {
        // get all URLs from anchor links,
        // restricted to the current domain by default
        return _pjs.getAnchorUrls('a');
    },
    scraper: function() {
        // scrapers can use jQuery
        return $('h1').first().text();
    }
});

默认情况下,这将跳过已被爬取的页面,只关注当前域上的链接,尽管这些都可以在您的设置中进行更改。

【讨论】:

  • PhantomJS 如何匹配使用 Selenium 渲染页面?我们可以期待相同的渲染质量吗?
  • @KimJongWoo PhantomJS 使用 webkit 渲染引擎。我不认为它使用最新版本,因为它依赖于 Qt。然而,webkit 是支持 Safari 和 Chrome 之类的渲染引擎,所以它非常好。看看 Selenium,它似乎只是自动化浏览器而不是无头浏览器。
  • @nrabinowitz 有兴趣将其作为节点模块吗?
  • @morgs32 - 取决于您的意思,这可能会也可能不会。有关将 PhantomJS 与节点集成的节点模块,请参阅 phantomjs.org/related-projects.html。用 npm 打包 pjscrape 可能有用,但我现在没有时间这样做。
  • 项目看起来死了。示例页面已损坏。
【解决方案2】:

这是一个老问题,但要更新,一个很棒的现代答案是http://www.nightmarejs.org/(github:https://github.com/segmentio/nightmare

从他们的主页上引用一个引人注目的例子:

RAW PHANTOMJS:

phantom.create(function (ph) {
  ph.createPage(function (page) {
    page.open('http://yahoo.com', function (status) {
      page.evaluate(function () {
        var el =
          document.querySelector('input[title="Search"]');
        el.value = 'github nightmare';
      }, function (result) {
        page.evaluate(function () {
          var el = document.querySelector('.searchsubmit');
          var event = document.createEvent('MouseEvent');
          event.initEvent('click', true, false);
          el.dispatchEvent(event);
        }, function (result) {
          ph.exit();
        });
      });
    });
  });
});

噩梦:

new Nightmare()
  .goto('http://yahoo.com')
  .type('input[title="Search"]', 'github nightmare')
  .click('.searchsubmit')
  .run();

【讨论】:

    【解决方案3】:

    首先,选择索引页面上的所有锚点并列出 href 值。您可以使用 PhantomJS 的文档选择器或 jQuery 选择器来执行此操作。然后对于每个页面,做同样的事情,直到页面不再包含任何新链接。您应该拥有所有链接的主列表和每个页面的链接列表,以便能够确定链接是否已被处理。你可以把网络爬取想象成一棵树。树的根节点是索引页面,子节点是从索引页面链接的页面。每个子节点可以有一个或多个子节点,具体取决于子页面包含的链接。我希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-12
      • 2017-10-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多