你怎么用PhantomJS蜘蛛

时间:2011-11-16 04:16:45

标签: web-crawler phantomjs

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

想法,帮助?

提前致谢!

3 个答案:

答案 0 :(得分:20)

您可能有兴趣查看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();
    }
});

默认情况下,这会跳过已经抓取的网页,只会关注当前网域上的链接,但这些都可以在您的设置中更改。

答案 1 :(得分:5)

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

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

RAW PHANTOMJS:

snprintf

WITH NIGHTMARE:

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

答案 2 :(得分:3)

首先,选择索引页面上的所有锚点并列出href值。您可以使用PhantomJS的文档选择器或jQuery选择器执行此操作。然后对于每个页面,执行相同的操作,直到页面不再包含任何新链接。您应该拥有所有链接的主列表以及每个页面的链接列表,以便能够确定是否已经处理了链接。您可以将Web爬行视为树。树的根节点是索引页面,子节点是从索引页面链接的页面。每个子节点可以有一个或多个子节点,具体取决于子页面包含的链接。我希望这会有所帮助。