php如何抓取网页数据(一下Nutch搜索引擎系统的特点及特点分析-乐题库)
优采云 发布时间: 2022-02-07 22:02php如何抓取网页数据(一下Nutch搜索引擎系统的特点及特点分析-乐题库)
代码:
2006-07-27 13:42 21世纪是信息时代,也是互联网时代。不断顺畅、进步的互联网给人们带来了浩瀚的网络信息海洋,但也容易让人在查询自己需要的有用相关信息时感到困惑。搜索引擎是为满足人们的网络信息搜索而应运而生的一种网络工具。是互联网信息查询的导航指针。现在有很多商业搜索引擎,但都是保密的,不方便研究。Nutch 是一个开源的 Java 实现的搜索引擎,它提供了我们运行自己的搜索引擎所需的所有工具。
Nutch 是开源的,所以任何人都可以看到他的排序算法是如何工作的。商业搜索引擎排名算法是保密的,我们无法知道为什么要计算排名结果。此外,一些搜索引擎允许PPC,例如百度,这样的索引结果与网站内容无关。所以 Nutch 是学术搜索和政府网站搜索的不错选择。因为公平的排序结果非常重要。
了解大型分布式搜索引擎的工作原理是一件很棒的事情,但是我们没有google的源代码,所以学习搜索引擎Nutch是一个不错的选择。Nutch 的核心部分已经用 Map Reduce 重新实现,这是一个最初由 Google Labs 提出的分布式处理模型。
Nutch 吸引了许多非常愿意尝试新的搜索算法的研究人员,因为 Nutch 非常容易扩展。Nutch 非常灵活,可以很好地定制和集成到应用程序中。利用插件机制,Nutch 可以作为搜索平台,搜索不同的信息载体。当然,最简单的方法是将 Nutch 集成到您的网站中,为用户提供搜索服务。
下面我们来分析一下Nutch搜索引擎系统的特点。
一、系统架构
一般来说,Nutch 可以分为 2 个部分:爬行部分和搜索部分。爬虫爬取页面并将检索到的数据做成反向索引,搜索程序响应用户的反向索引搜索请求。爬虫和搜索器之间的接口是索引,两者都使用索引中的字段。爬虫程序和搜索程序可以位于不同的机器上。下面详细介绍爬取部分。
抓取部分:
履带由 Nutch 的履带驱动。这是一组用于构建和维护几种不同数据结构的工具:Web 数据库、一组段和索引。下面一一解释这三种不同的数据结构:
1、Web 数据库或 WebDB。这是一种特殊的存储数据结构,用于映射被抓取数据的结构和属性集合网站。WebDB 用于存储从开始爬取(包括重新爬取)开始的所有 网站 结构化数据和属性。WebDB 仅供爬虫使用,搜索者不使用。WebDB 存储 2 种实体:页面和链接。页面代表网络上的一个网页,以网页的URL为指标进行索引,同时建立网页内容的MD5哈希签名。还存储了与页面相关的其他内容,包括:页面中的链接数(出站链接)、页面爬取信息(在页面被重复爬取的情况下)、表示页面级别的分数。链接表示从一个网页到其他网页的链接。所以WebDB可以说是一个网络图,节点是页面,链接是边。
2、段 . 这是网页的集合,并已编入索引。Segment的Fetchlist是爬虫使用的url列表,由WebDB生成。Fetcher 的输出数据是从 fetchlist 中获取的网页。Fetcher 的输出数据先进行反向索引,然后将索引结果存储到段中。一个segment的生命周期是有限的,下一轮抓取开始后就没用了。默认重新抓取间隔为 30 天。因此,可以删除超过此时间限制的段。它还可以节省大量磁盘空间。段以日期和时间命名,因此可以非常直观地看到它们的生命周期。
3、索引。索引库是系统中所有被爬取页面的反向索引。它不是直接从页面的反向索引生成的,而是通过组合许多小段的索引生成的。Nutch 使用 Lucene 进行索引,因此所有 Lucene 相关的工具 API 都用于构建索引库。需要注意的是,Lucene的段的概念和Nutch的完全不同,所以不要混淆。简而言之,Lucene 的段是 Lucene 的索引库的一部分,而 Nutch 的段是被爬取和索引的 WebDB 的一部分。
爬取过程详解:
爬取是一个循环过程:爬虫从WebDB生成一个fetchlist集合;提取工具根据fetchlist从互联网下载网页内容;工具程序根据提取工具找到的新链接更新WebDB;然后生成一个新的 fetchlist;一周一周。这个 fetch 循环在 nutch 中通常被称为:generate/fetch/update 循环。
一般来说,同域名下的url链接会被合成到同一个fetchlist中。这样做的原因是当使用多个工具同时抓取时,不会出现重复抓取的情况。Nutch 遵循机器人排除协议,并且可以使用 robots.txt 定义来保护私人网络数据不被捕获。
以上抓具组合是Nutch的最外层。也可以直接使用低级工具,结合这些低级工具的执行顺序,达到同样的效果。这就是 Nutch 吸引人的地方。下面详细介绍上述过程,括号中是底层工具的名称:
1、创建一个新的 WebDB (admin db -create)。
2、注入 URL 以开始爬入 WebDb(注入)。
3、从 WebDb 中的新段生成 fetchlist(生成)。
4、根据fetchlist列表获取网页内容(fetch)。
5、根据检索到的网页链接的url更新WebDB(updatedb)。
6、重复以上3-5个步骤,直到达到指定的抓取层数。
7、使用计算出的网页 url 权重分数更新段 (updatesegs)。
8、创建爬取网页的索引。
9、 消除索引中的重复内容和重复 url (dedup)。
10、将多个索引合并为一个大索引,提供一个索引库(合并)供搜索。
创建新的WebDB后,fetch周期generate/fetch/update会根据第一步和第二步指定的root url在一定的周期内自动循环。当 fetch 循环结束时,将生成最终索引(步骤 7 到 10)。需要注意的是,上述步骤8中的每个段的索引是单独建立的,然后消除重复(步骤9)。步骤 10 全部完成,将各个索引合并到一个大型索引存储库中。
Dedup 工具可以从段的索引中删除重复的 url。因为WebDB不允许重复url,也就是说fetchlist中不会有重复的url,所以不需要对fetchlist进行dedup操作。如上所述,默认提取周期为 30 天。如果已经生成的旧的 fetch 没有被删除,而重新生成了新的 fetch,仍然会有重复的 url。当只有一个刮板运行时,不会发生这种情况。
从上面的介绍可以看出,一般情况下,我们只需要从头开始执行程序,不需要接触底层工具。但是搜索引擎的“意外”很多,需要花费大量的时间在维护上,所以底层工具也需要掌握。