网络爬虫算法:深度?

时间:2010-12-04 23:54:04

标签: algorithm web-crawler nutch

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

  

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

所以,说我有域名www.domain.com,想要抓住一个深度,比如3 - 我需要做什么?如果一个站点可以表示为二叉树,那么我认为这不是问题。

7 个答案:

答案 0 :(得分:11)

链接深度表示页面远离根的“跳数”,其中“跳”表示跟随页面上的链接。 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)

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

答案 1 :(得分:2)

我猜“深度”是抓取工具“跟踪链接”的次数。

假设您从根页面开始。您可以按照此页面上的每个链接进行操作:这是深度1.对于每个目标页面,您都可以点击链接:这是深度2等。

请注意,链接后可能会出现“周期”。结构不是树,而是图形。

答案 2 :(得分:2)

  1. 制作一个用作队列的列表。
  2. www.domain.com, depth 0附加到
  3. 将第一个元素拉出来
  4. 当前深度是元素深度+ 1
  5. 抓取该网站
  6. 如果当前深度不大于最大深度,则将站点上的每个链接附加到队列
  7. 如果列表不为空,请返回3 ..

答案 3 :(得分: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。

答案 4 :(得分:0)

网站的根位于深度0.您可以通过使用根链接到达的文档深度为1.您可以从深度为1的文档中的链接到达的文档将位于深度2.依此类推。

根据您的抓取工具,这可能仅适用于同一网站/域中的文档(通常)或托管在其他位置的文档。

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

答案 5 :(得分:0)

在Nutch的情况下,深度参数是一个非常错误的,它只是意味着爬虫正在经历的循环次数。因此,您将访问与您的种子网址相距3个链接的页面...在给定的网站上,它可能会深入3 ...即如果它们提升到最高N限制范围内。

答案 6 :(得分:0)

深度是网址路径

的斜线数

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

def depth(self,link):
    return len(urlparse.urlparse(url).path.split("/")) -1