4

我正在研究爬虫,需要准确理解“链接深度”的含义。以 nutch 为例:http ://wiki.apache.org/nutch/NutchTutorial

depth 表示应该爬取的根页面的链接深度。

所以,假设我有域www.domain.com并且想要爬到某个深度,比如说,3我需要做什么?如果一个站点可以表示为二叉树,那么我认为这不是问题。

4

7 回答 7

12

链接深度意味着页面远离根的“跳数”,其中“跃点”意味着跟随页面上的链接。Nutch 有这个限制的原因是离主页很“远”的链接不太可能包含很多信息(主页会链接到最重要的信息,所以你越远,你找到的信息就越详细),虽然它们可能有很多,所以它们占用了大量的存储空间、排名计算时间和带宽。

因此,Nutch 使用称为深度限制搜索的算法方案来限制其运行时间和空间使用。如果它不使用这种启发式算法,它就必须爬取整个站点以对其中的所有页面进行排名并找到前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)

不,一个站点通常不能表示为二叉树;这是一个有向图。如果您以某种方式删除反向链接,那么它就会变成多路树。无论哪种方式,许多网站都太大而无法为您的爬虫存储。

于 2010-12-05T00:02:24.490 回答
2

我猜“深度”是爬虫“跟随链接”的次数。

假设您从根页面开始。您点击此页面上的每个链接:这是深度 1。对于每个目标页面,您点击链接:这是深度 2,等等。

请注意,在关注链接时可能存在“循环”。结构不是树,而是图。

于 2010-12-04T23:58:41.573 回答
2
  1. 制作一个用作队列的列表。
  2. 附加www.domain.com, depth 0到它
  3. 拉出第一个元素
  4. 当前深度是元素深度+1
  5. 爬取那个网站
  6. 如果当前深度不大于最大深度,则将站点上的每个链接附加到队列中
  7. 如果列表不为空,请返回 3..
于 2010-12-04T23:59:10.123 回答
0

深度是 url 路径的斜线数

例如http://www.google.com/foo/bar/baz的深度为 3

def depth(self,link):
    return len(urlparse.urlparse(url).path.split("/")) -1
于 2014-04-08T05:54:31.657 回答
0

链接深度是指在到达给定链接之前必须遵循的链接数。

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

要将 example.com 抓取到 3 的深度,您需要将链接跟踪到最大深度 3,然后停止跟踪链接。没有这个限制,你可以很容易地永远继续下去。

示例:example.com 链接到 example.com/foo.html 和 example.com/bar.html。您跟随这两个链接,它们链接到的链接并停在那里。

注意:根页面的深度为 0。

于 2010-12-04T23:56:57.907 回答
0

网站的根位于深度 0。使用根中的链接可以访问的文档位于深度 1。反过来,您可以从深度 1 的文档中的链接访问的文档位于深度 2。依此类推。

根据您的爬虫,这可能仅适用于同一站点/域(通常)中的文档或托管在其他地方的文档。

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

于 2010-12-04T23:58:10.527 回答
0

好吧,在 Nutch 的例子中,depth 参数用词不当,它只是表示爬虫正在经历的循环数。因此,您将访问距种子网址 3 个链接的页面......在给定的网站上,它可能深度为 3......也就是说,如果它们在前 N 个限制内。

于 2010-12-05T19:50:10.057 回答