2010-12-04 64 views
2

我正在研究爬网程序,需要准确理解“链接深度”的含义。以Nutch的,例如:http://wiki.apache.org/nutch/NutchTutorialWeb Cralwer算法:深度?

深度表示从根页面应该是 抓取的链接深度。

所以,说我有域www.domain.com,并希望抓取的,比方说,3深度 - 什么,我需要做什么?如果一个网站可以表示为二叉树,那么我认为这不会是一个问题。

+2

你说一个网站可以表示为一个二叉树的深度,但我认为它可能是以图形表示,因为链接可以彼此链接超过一次而彼此交叉。你甚至可能有死链接,从来没有链接到任何其他页面,但只有它自己。所以我们可以将网站或互联网视为我认为的图表。 – themis 2012-11-28 09:34:26

回答

10

链接深度意味着‘跳’的数量的页面是远离“跳跃”意味着跟随页面上的链接。Nutch有这种限制的原因是,距离主页非常“远”的链接不太可能掌握很多信息(主页面会链接到最重要的信息,所以你会得到更远的信息,更详细的信息),虽然可能有很多,但它们会占用大量存储空间,计算排名时间和带宽。

Nutch因此使用称为depth-limited search的算法方案来限制其运行时间和空间使用率。如果它没有使用这种启发式方法,那么它将不得不抓取整个网站来对其中的所有页面进行排名,并找到顶部的N

要爬到深度3,请实现此算法并给它一个深度为3的边界。关于深度限制搜索的好处是,它是深度优先搜索(DFS)的一个变种,所以这是相当节省空间的:

function depth-limited-crawl(page p, int d) 
    if d == 0 
     return 
    /* do something with p, store it or so */ 
    foreach (page l in links(p)) 
     depth-limited-crawl(linked, d-1) 

不,一个网站不能在一般表示为二叉树;这是一个有向图。如果你以某种方式删除反向链接,那么它将成为一个多路树。无论哪种方式,许多网站都太大,无法存储您的抓取工具。

+0

我会尝试深度限制搜索。在你的伪代码中,3的边界是如何执行的? – StackOverflowNewbie 2010-12-05 22:19:22

+0

递归:你用第二个参数调用它。* d * = 0,基本大小写,立即返回;在递归调用中,* d *被递减。 – 2010-12-06 10:40:25

0

链接深度意味着您在到达给定链接之前必须遵循多少链接。

示例:example.com链接到example.com/foo.html,链接到google.com。因此,google.com的链接深度为2,相对于example.com,您可以通过2个链接访问它。

要将example.com抓取到3的深度,您需要遵循指向最大深度为3的链接,然后停止关注链接。没有这个限制,你可以轻松地继续下去。

示例:example.com链接到example.com/foo.html和example.com/bar.html。你遵循这两个链接,他们链接到的链接,并停在那里。

注:根页有0

0

深度Web站点的根是在深度0的文档,你可以通过使用根链路到达处于深度1.文档您可以依次地到达在深度为1的文档中的链接将在深度2处。依此类推。

根据您的履带,这可能仅适用于文件在同一个站点/域(通常)或文档在其他地方举行。

大多数网站不能用二叉树表示,因为“根”可能有两个以上的“节点”。

2

我猜“深度”是时代的履带式“跟随链接”的数量。

假设你从根页面开始。你跟每个此页面上的链接:这是深度1.对于每个目标页面,你按照链接:这是深度2等

注意,有可能是“循环”,而下面的链接。结构不是一棵树,而是一张图。

2
  1. 制作一个您用作队列的列表。
  2. 追加www.domain.com, depth 0到其关闭它
  3. 当前深度是元素深度+ 1个
  4. 抓取
  5. 拉出的第一个元素的网站
  6. 追加在网站上的每个链接到队列如果当前深度ISN “T比最大深度
  7. 如果该列表不为空,回去3时..
+0

你是指FIFO队列吗?这是深度限制搜索,因此可以使用堆栈更高效地完成搜索。 – 2010-12-05 00:08:14

0

那么在Nutch的情况下,深度参数是一个相当混乱的东西,它只是意味着爬网程序正在经历的循环次数。因此,你会到达距离你的种子网站3个链接的页面......在一个给定的网站上,它可能在深度3 ......也就是说,如果他们提出的是在最高N限制内。