Nutch 分布式网络爬虫研究与优化

Wyh_D_Void

贡献于2013-08-04

字数:0 关键词: 网络爬虫

*The Natural Science Foundation of Hunan Province of China under Grant No. 07555084 (湖南省自然科学基金); the Science and Technology Projects of Guangdong Province under Grant No. 2009B080701031 (广东省科技计划项目). Received 2010-04, Accepted 2010-06. ISSN 1673-9418 CODEN JKYTA8 E-mail: fcst@vip.163.com Journal of Frontiers of Computer Science and Technology http://www.ceaj.org 1673-9418/2011/05(01)-0068-07 Tel: +86-10-51616056 DOI: 10.3778/j.issn.1673-9418.2011.01.007 Nutch 分布式网络爬虫研究与优化* 詹恒飞 1+, 杨岳湘 2, 方 宏 2 1. 国防科学技术大学 计算机学院, 长沙 410073 2. 国防科学技术大学 信息中心, 长沙 410073 Research and Optimization of Nutch Distributed Crawler* ZHAN Hengfei1+, YANG Yuexiang2, FANG Hong2 1. School of Computer Science, National University of Defense Technology, Changsha 410073, China 2. Information Center, National University of Defense Technology, Changsha 410073, China + Corresponding author: E-mail: zhf_a_b@163.com ZHAN Hengfei, YANG Yuexiang, FANG Hong. Research and optimization of Nutch distributed crawler. Journal of Frontiers of Computer Science and Technology, 2011, 5(1): 68-74. Abstract: As a good open-source search engine, Nutch kernel code uses a lot of MapReduce programming models, being used by more and more businesses and organizations to customize their needs in line with the distributed search engine product. As a good search engine, one of the important prerequisites is how to grab network data as much as possible to build indexes. This paper introduces Nutch’s working mechanism based on Hadoop distributed Web crawler, points out its shortcomings and proposes an improved program, which can make Web crawler using network resources more efficiently to capture network data. Experimental results show that it is indeed more effi- cient than the original programs. Key words: Nutch; Web crawler; flexible crawling 摘 要: Nutch 作为一个优秀的开源搜索引擎 , 其内核代码大量采用了 MapReduce 的编程模式 , 被越来越多 的企业和团体用来定制符合自身需求的分布式搜索引擎产品。作为优秀的搜索引擎, 其重要的前提是如何 詹恒飞 等:Nutch 分布式网络爬虫研究与优化 69 尽可能多地抓取到网页数据来建立索引。 介绍了 Nutch 基于 Hadoop 下的分布式网络爬虫工作机制 , 指出其 不足之处, 并提出了改进方案, 从而使网络爬虫能够更加高效地利用网络资源来抓取网络数据。经过实验 测试, 证明了此方案比原方案更加高效。 关键词: Nutch 搜索引擎; 网络爬虫; 弹性抓取机制 文献标识码:A 中图分类号:TP393 1 引言 网络爬虫是搜索引擎的一个重要组成部分, 一 个好的网络爬虫往往有爬行速度快、获取数据量大 和获取信息准确等优点。在目前因特网规模飞速膨 胀, 每天都会产生大量新网页的形势下, 如何令网 络爬虫更加高效, 可以在同样的时间里抓取到更多 的有效网页就变得十分重要了。 2 技术背景 Nutch是一个基于Lucene的优秀开源搜索引擎, 它是最早用到 MapReduce 的项目(Hadoop 原来是 Nutch 的一部分)。如今, MapReduce 编程方式占据 了 Nutch 核心结构的大部分, 它极大地方便了编程 人员在不会分布式并行编程的情况下, 将自己的程 序运行在分布式系统上。Nutch 主要分为两个部分: 网络爬虫和查询[1]。网络爬虫的主要作用是从网络 上抓取网页数据并建立索引; 查询则主要是利用这 些索引来检索用户所提交的关键词并产生和返回 查找结果。两大部分之间的交汇点是索引, 耦合度 相对较低。 2.1 MapReduce 介绍 MapReduce 是一种编程模型, 用于大规模数据 集(大于 1TB)的并行运算。概念“Map(映射)”和 “Reduce(化简)”, 以及他们的主要思想, 都是从函 数式编程语言和矢量编程语言里借来的特性[2]。该 模型的核心是 Map 和 Reduce 两个函数, 这两个函 数由用户实现, 功能是按一定的映射规则将输入的 对转换成另一个或一批对输 出[3]。 图 1 说明了用 MapReduce 来处理大数据集的过 程。简而言之, MapReduce 的计算过程就是将大数据 集分解为成百上千的小数据集, 经过任务分发器, 将每个(或若干个)数据集分别由集群中的一个结点 进行处理并生成中间结果, 然后这些中间结果又由 若干个结点进行并行的多次合并, 形成最终结果。 最简单的 MapReduce 应用程序只需包含三个部分: Map 函数、Reduce 函数和 Main 函数。主要是实现 Map和 Reduce函数, Main函数则将作业控制和文件 输入/输出结合起来。其他并行编程中的复杂问题, 均由 Hadoop 处理[4]。 Fig.1 MapReduce process 图 1 MapReduce 过程图 2.2 Nutch 网络爬虫工作过程 Nutch 基于 MapReduce 模式的分布式网络爬虫 工作过程, 如下所示[5]。 读取 URL 种子文件到 Crawl DB, 然后进行下 面的抓取程序。 (1) 循环①~④到指定的抓取深度: ① 从 Crawl DB 生成抓取列表; ② 根据抓取列表中的 URL 抓取网页; ③ 分析处理抓取的内容; ④ 更新 Crawl DB 库。 (2) 转化每个页面中外部对它的链接。 (3) 建立索引。 具体过程如图 2 所示。其中的各个模块分别为: 70 Journal of Frontiers of Computer Science and Technology 计算机科学与探索 2011, 5(1) Fig.2 Nutch crawler workflow 图 2 Nutch 网络爬虫工作流程图 插入 URL 列表(Inject) 1) (1) 将 URL 集合进行格式化、过滤和合并, 消除 其中的非法 URL, 并设定 URL 状态(unfetched)和初始 化分值; (2) 将 URL 及其状态、分值存入 Crawl DB 数 据库, 与原数据库中重复则更换成新的。 下面用 Inject 模块的例子说明 MapReduce 的工 作过程。 MapReduce 程序 1 目的: 将输入转换为 CrawlDatum 格式 输入: URL 文件 Map(line) → Reduce()合并多重的 URL 输出: 临时的 CrawlDatum 文件 MapReduce 程序 2 目的: 合并上一步产生的临时文件到新的 DB 输入: 上次 MapReduce 输出的 CrawlDatum Map()过滤重复的 URL Reduce()合并两个 CrawlDatum 到一个新的 DB 输出: CrawlDatum 生成抓取列表(Generate) (1) 从 Crawl DB 数据库中将 URL 取出并按预 设规则进行过滤; (2) 对 URL 进行降序排列; (3) 将排列列表写入 segments 目录中。 抓取内容(Fetch) (1) 对 segments 目录下的抓取列表执行依次 抓取; (2) 抓取过程中, 页面的 URL 地址可能会发生 跳转, 从而需要重定向 URL 地址; (3) 抓取过程采用多线程方式进行, Fetch 操作 过程中得到页面源文件后同时也调用 Parse 操作。 分析处理内容(Parse) 使用对应的插件解析 segments 目录中由 Fetch 得到的页面, 并进行整理, 将页面分解为 parse-date 和 parse-text。parse-date 中保存的是页面的题名、 作者、日期、链接等内容; parse-text 中保存的是页 面的文本内容。 1) http://blog.csdn.net/forwen/archive/2009/11/13/4804733.aspx. 詹恒飞 等:Nutch 分布式网络爬虫研究与优化 71 更新 Crawl DB 库(Update ) 根据 segments 目录下 crawl_fetch 目录和 crawl_ parse 目录中的内容, 对 Crawl DB 进行更新, 增加 新的 URL。 转化链接(Invert Links) Invert Links 操作用来更新 Link DB, 为建立索 引的工作提供准备。 建立索引(Index) 索引过程主要包括:将数据转换成文本、分析 文本和将分析过的文本保存到索引库中这三个 操作。 3 Nutch 爬虫存在问题 经过研究与测试, 发现 Nutch 网络爬虫存在以 下问题, 影响了其性能的进一步提高: (1) 等待时间僵化 Nutch 网络爬虫抓取数据主要是使用 protocol- http 插件来完成。protocol-http 就两个类:HttpRes- pose 类和 Http 类。其中 HttpRespose 主要是向 Web 服务器发请求来获取响应, 从而下载页面; Http 类 则非常简单, 主要是为 HttpResponse 设置配置信息, 然后创建 HttpRespose。其中对于每一个下载页面的 线程的等待时间都是 Nutch-default.xml 配置文件预 设的固定值:http.max.delays 和 fetcher. server.delay, 这对于不同的网站以及在不同的网络条件下是非 常僵化的, 往往会出现不必要的等待时间, 或者由 于等待时间不足而放弃了某些相对速度较慢的网 站的数据抓取。而且有些网站不使用 robots.txt 却布 置有其他反爬虫策略, 对单位时间内的访问数进行 限制, 这样一来 Nutch 的爬取数据完整性必定会受 到影响。 (2) 对抓取失败的链接缺乏管理 Nutch 对于抓取网页失败的链接没有详细的记 录和预测性的监管。有时某个网站整站关闭了, 或 者换域名了, 但依然在其他的站点留有大量的链接, 如果这样的链接被网络爬虫发现而且还一个一个 去试验可连接与否, 将会浪费大量的时间和网络 资源。 根据以上两点, 对 Nutch 网络爬虫进行改进是 很有必要的。 4 改进方案 针对 Nutch 网络爬虫的不足, 进行下列改进: (1) 在 Nutch-defau.xml 增加 4 个参数, 分别为 http.min.delays、http.delay.heighten、fetch.test.inter- val、fetch.success.scale, 并改写参数 http.max.delays 的应用, 功能如表 1。 Table 1 Comparison of Nutch-defau.xml parameter functions 表 1 Nutch-defau.xml 参数功能对照 参数 功能 http.min.delays 抓取页面的线程最小等待时间 http.max.delays 抓取页面的线程最大等待时间 http.delay.heighten抓取页面的线程等待时间增幅 fetch.test.interval 定时抽测失效链接 fetch.success.scale 网站有效链接的比例低于1/(1+ fetch.success.scale)会被放弃抓取 (2) 设定链接的路径和级别。例如“http:// www.aaa.com/bbb/ccc/*.*” 的路径可以是“http:// www.aaa.com/bbb/ccc/”, “http://www.aaa.com/bbb”和 “http://www.aaa.com” 。在这里, 定义路径“http:// www.aaa.com”和“http://www.aaa.com/”的区别是后 者不允许再接子路径。现对该链接的路径分解为 “http://www.aaa.com”, “/bbb”和“/bbb/ccc/”, 定义越 接近根的路径级别越高。 (3) 在 Hbase[6]上建立一个过滤列表, 将对失效 链接的本级路径进行失效次数记录。例如在抓取 “http://www.aaa.com/bbb/ccc/d.html”这个页面失败 后, 如果原先过滤列表里该链接的记录为空, 那将 会在过滤列表中对该链接做如图3 的记录, 要注意, “/bbb”和 “/bbb/”不是同一个列, “/bbb”表示的是 “http://www.aaa.com/bbb/*”, 而 “/bbb/” 表示的是 “http://www.aaa.com/bbb/*.*”。 (4) Fetchlist中增加一个键值来对即将抓取数据 的链接的失效次数进行记录, 该键值将会在链接 72 Journal of Frontiers of Computer Science and Technology 计算机科学与探索 2011, 5(1) Fig.3 Structure diagram of filtering list data 图 3 过滤列表数据结构图 加入 Fetchlist 前从过滤列表中读取。 (5) 对 Crawl DB 中的每一个链接, 在进行去重 操作的同时也访问过滤列表来读取该链接的路径 里所有级别路径的失效次数, 以保证失效次数查询 的并发性, 不额外占用时间。若链接的某级别路径 失效次数大于 http.delay.heighten, 则直接过滤, 否 则就将链接添加到 Fetchlist 中生成抓取作业, 并预 设该链接抓取数据的等待时间阀值为: () http.min.delays http.max.delays http.min.delays http.delay.heighten −失效次 + × 公式中的失效次数为该链接路径里最低级别路径 记录的失效次数, 一旦连接失败或者超过了这个阀 值则视为该链接失效而放弃抓取, 同时在过滤列表 记录对该链接的最低一级路径(如某级路径在Hbase 中没有时将给予添加)的失效次数做加 1 操作, 若该 值原来为 http.delay.heighten−1, 同时也对上级别路 径做加 1 操作; 如果链接在规定时间内成功抓取, 并且该链接最低一级路径失效次数不为 0, 对该失 效次数做减去 fetch.success.scale 操作, 若结果小于 等于 0, 把过滤列表中该列记录删除, 保证每 Hbase 中每行对应的列关键字不至于过多。 (6) 对在过滤列表中失效次数大于 http.delay. heighten 的路径所对应的没能抓取到页面的链接, 定期进行随机抽样爬行, 抽样数等于 http.delay. heighten, 先从最高一级路径中的链接开始抽查。如 果能有一个以上的链接可以正常爬行, 则将本级对 应于 Hbase 中的列删除, 并对下一级继续进行抽查; 否则对下一级抽样的数量以递减一个的方式进行 抽查。最后, 将抽测抓取成功且最近没有成功抓取 到页面的本级链接加入到 Fetchlist 中。 该算法增加了对每个失效 URL 的记录, 并对网 络等待时间进行了弹性优化, 以容忍度约为1/ (1+fetch.success.scale)的比例进行选择性抓取, 同 时对失效连接进行定期抽样检测, 较好克服了上文 提到的缺点。而且对 Hbase 读取的数据不要求严格 的一致性, 主要是为了降低算法的复杂性和适当放 宽抓取条件的限制度。失效记录的查询工作和 URL 去重工作并发进行, 过滤列表体积相对较小, 所以 时间复杂性相对于修改前不变。 5 测试与分析 5.1 测试环境 以校园网为基础, 分布式网络爬虫架设在 3 台计 算机上, 配置均为:Pentium 4 3.0 GHz 的处理器, 2 GB DDRⅡ667 的内存, 操作系统为 CentOS 5.4, 每台计 算机都有独立的互联网 IP 地址。3 个结点之间传输 速度为 100 MB/s, 它们通过学校的边界路由器接入 互联网, 公用带宽为 4 MB/s, 网络结构如图 4 所示。 Fig.4 Network of testing 图 4 测试网络环境 5.2 测试结果 因为所要爬取的网站与网络爬虫服务器之间的 网络路径质量的高低以及网站的繁忙程度不尽相 同, 所以采取相同的 20 个初始的 URL 对两种版本 网络爬虫进行深度为 3 的爬行测试, 然后取平均 值。在上述实验条件下, 对原始版本的网络爬虫在 初始默认参数下进行了 3 次爬行测试, 结果如表 2。 数 詹恒飞 等:Nutch 分布式网络爬虫研究与优化 73 Table 2 The test results of initial version 表 2 初始版本测试结果 测试序号 Crawl DB 链接数 抓取网页数 耗时/s 1 436 703 355 706 73 142 2 437 487 361 641 72 194 3 433 051 358 726 69 827 Table 3 The test results of improved version 表 3 改进版本测试结果 参数 1 2 3 http.min.delays/s 15 20 30 http.max.delays/s 80 100 120 http.delay.heighten/s 4 5 6 fetch.test.interval/s 7 200 3 600 1 800 fetch.success.scale 3 3 3 Crawl DB 链接数 441 373 440 516 437 091 抓取网页数 347 027 355 637 354 129 耗时/s 47 431 48 072 50 275 对改进版本新增的参数设置几组不同的参数, 进行 3 次爬行测试, 得到以下结果: 通过测试数据分析, 以及图 5、图 6 中两者数 据的对比, 可以看到:在改进版本的 3 种参数测试 中, 成功抓取的网页数量比原始版本少约 2.2%, 但 总体抓取耗时要比原始版本短约 32.2%, 原始版本 平均抓取网页速度是 5 个/s, 改进版本是 7.24 个/s。 这个算法改进的思想就是放弃少量的网页抓取而 大大提高抓取速度, 而且由于设计了定期检测制度, Fig.5 Comparison of Web crawl success rate 图 5 网页成功抓取率对比图 Fig.6 Comparison of crawl time 图 6 抓取耗时对比图 网络爬虫的工作时间越长, 成功抓取率将越接近原 始版本。在当今网络规模越来越大的情况下, 网络 爬虫是不可能把整个网络的数据都完全抓取的, 一 个是由于孤点的原因, 但更主要的是网页的数量大, 更新的速度快。而且在分布式网络架设范围加大到 全国甚至全球的情况下, 这些由于抓取速度过慢而 被放弃的网页, 往往也是由于响应速度慢而被网络 用户在经过漫长的等待后不得不放弃浏览的页面。 因此对于通用搜索引擎来说, 在 24 小时不停地抓 取数据的情况下, 可以将节省下来的时间用来抓取 更多的数据, 所以牺牲少量的查全率而大幅提高抓 取效率是值得的。 6 结束语 Nutch 作为一个优秀的分布式开源搜索引擎, 给搜索引擎的学习和研究提供了很大的便利。本文 对 Nutch 基于 Hadoop 下的分布式网络爬虫工作机 制进行了介绍, 指出它的不足之处, 并针对其缺点 提出了改进方案。该方案使网络爬虫能够更加高效 地利用网络资源来抓取网络数据, 并且增加了设置 的灵活度。在不同的网络环境下, 可以对各项参数 进行微调使网络爬虫工作性能达到最佳。实验测试 的结果说明, 该改进方案确实比原方案更加高效。 References: [1] Cafarella M, Cutting D. Building Nutch: Open source 74 Journal of Frontiers of Computer Science and Technology 计算机科学与探索 2011, 5(1) search[J]. ACM Queue, 2004, 2(2): 21−24. [2] Ghemawat S. MapReduce: Simplified data processing on large clusters[C]//Proceedings of Conference on Operat- ing Systems Design and Implementation, California, 2004: 137–150. [3] Yang Daiqing, Zhang Zhixiong. A method for generating co-occurrence matrix of mass data based on Hadoop[J]. New Technology of Library and Information Service, 2009(4): 23−26. [4] Hadoop MapReduce[EB/OL]. [2010-03-21]. http://wiki. apache.org/Hadoop/HadoopMapReduce. [5] Cutting D. MapReduce in Nutch[EB/OL]. [2010-03-21]. http://www.hadoop.org.cn/mapreduce/nutch-mapreduce. [6] Hbase. Bigtable-like structured storage for Hadoop HDFS[EB/OL]. [2010-03-21]. http://wiki.apache.org/hadoop/ Hbase. ZHAN Hengfei was born in 1984. He is a master candidate in Computer Science at National University of Defense Technology. His research interests include computer networks and security, etc. 詹恒飞(1984—), 男, 广东湛江人, 国防科学技术大学计算机学院计算机科学与技术专业硕士研究 生, 主要研究领域为计算机网络与安全等。 YANG Yuexiang was born in 1965. He is a professor and the deputy director at Information Center of National University of Defense Technology. His research interests include computer networks and secu- rity, etc. 杨岳湘(1965—), 男, 湖南岳阳人, 国防科学技术大学教授、信息中心副主任, 主要研究领域为计算 机网络与安全等。 FANG Hong was born in 1971. He is a senior engineer at Information Center of National University of Defense Technology. His research interests include computer networks and security, etc. 方宏(1971—), 男, 湖北武汉人, 国防科学技术大学信息中心高级工程师, 主要研究领域为计算机网 络与安全等。

下载文档,方便阅读与编辑

文档的实际排版效果,会与网站的显示效果略有不同!!

需要 5 金币 [ 分享文档获得金币 ] 5 人已下载

下载文档

相关文档