16

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

想法,帮助?

提前致谢!

4

3 回答 3

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

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

于 2011-12-06T20:28:35.457 回答
6

这是一个老问题,但要更新,一个很棒的现代答案http://www.nightmarejs.org/(github:https://github.com/segmentio/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();
        });
      });
    });
  });
});

与噩梦:

new Nightmare()
  .goto('http://yahoo.com')
  .type('input[title="Search"]', 'github nightmare')
  .click('.searchsubmit')
  .run();
于 2015-05-22T22:03:46.293 回答
3

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

于 2011-11-17T18:38:11.307 回答