网络爬虫调研报告

网络爬虫调研报告

调研背景

       项目中要对指定的网络资源进行抓取、存储、分类、索引、并提供检索服务。充当全文检索数据库的是 Apache 组织下的开源项目 Lucene 检索工具,而 Lucene 只是个搜索引擎工具,它提供 API 接口,通过编写程序对信息进行索引和检索,在其后台需要网络爬虫程序的支持,其目的是通过 网络爬虫软件抓取网页,作为提供给 Lucene 搜索引擎的资源,进行索引和查询。

调研对象

Nutch  http://nutch.apache.org/

Heritrix   http://crawler.archive.org/

Nutch

Nutch Apache 基金会的一个开源项目,它原本是开源文件索引框架 Lucene 项目的一个子项目,后来渐渐发展成长为一个独立的开源项目。它基于 Java 开发,基于 Lucene 框架,提供 Web 网页爬虫和搜索引擎两部分功能。

Nutch 主要分为两个部分:网页爬虫( Crawler )和搜索引擎( Searcher )。 Crawler 主要用于从网络上抓取网页并为这些网页建立索引。 Searcher 主要利用这些索引检索用户的查找关键词来产生查找结果。另外很吸引人的一点在于,它提供了一种插件框架,使得其对各种网页内容的解析、各种数据的采集、查询、集群、过滤等功能能够方便的进行扩 展,正是由于有此框架,使得 Nutch 的插件开发非常容易,第三方的插件也层出不穷,极大的增强了 Nutch 的功能和声誉。

爬虫工作策略

Nutch 爬虫的工作策略一般则可以分为累积式抓取( cumulative crawling )和增量式抓取( incremental crawling )两种。

累积式抓取 是指从某一个时间点开始,通过遍历的方式抓取系统所能允许存储和处理的所有网页。在理想的软硬件环境 下,经过足够的运行时间,累积式抓取的策略可以保证抓取到相当规模的网页集合。但由于 Web 数据的动态特性,集合中网页的被抓取时间点是不同的,页面被更新的情况也不同,因此累积式抓取到的网页集合事实上并无法与真实环境中的网络数据保持一致。

增量式抓取 是指在具有一定量规模的网络页面集合的基础上,采用更新数据的方式选取已有集合中的过时网页进行抓取,以保证所抓取到的数据与真实网络数据足够接近。进行增量式抓取的前提是,系统已经抓取了足够数量的网络页面,并具有这些页面被抓取的时间信息。

面向实际应用环境的网络蜘蛛设计中,通常既包括累积式抓取,也包括增量式抓取的策略。累积式抓取一般用于数据集合的整体建立或大规模更新阶段;而增量式抓取则主要针对数据集合的日常维护与即时更新。

在确定了抓取策略之后,如何从充分利用网络带宽,合理确定网页数据更新的时间点就成了网络蜘蛛运行策略中的核心问题。

总体而言,在合理利用软硬件资源进行针对网络数据的即时抓取方面,已经形成了相对比较成熟的技术和实用性解决方案,这方面目前所需解决的主要问题,是如何更好的处理动态网络数据问题(如数量越来越庞大的 Web2.0 数据等),以及更好的根据网页质量修正抓取策略的问题。

工作流程


Nutch 架构图


Nutch 工作流程图

Nutch 工作流程:

建立初始 URL 集合分析

初始 URL 集的建立有两种方式:超链接和站长提交。

超链接 是指机器人程序根据网页链到其他网页中的超链接,就像日常生活中所说的 一传十,十传百 ……” 一样,从少数几个网页开始,连到数据库上所有到其他网页的链接。理论上,若网页上有适当的超连结,机器人便可以遍历绝大部分网页。

站长提交 是指在实际运行中,爬虫不可能抓取到所有站点,为此,网站站长可以向搜索引擎进行提交,要求收录,搜索引擎经过核查之后,便将该网站加入到 URL 集合中,进行抓取。

1.          inject 操作分析

inject 操作调用的是 Nutch 的核心包之一 crawl 包中的类 org.apache.nutch.crawl.Injector 。它执行的结果是: crawldb 数据库内容得到更新,包括 URL 及其状态。

inject 操作主要作用可以从下面 3 方面来说明:

(1) URL 集合进行格式化和过滤,消除其中的非法 URL ,并设定 URL 状态 (UNFETCHED), 按照一定方法进行初始化分值;

(2) URL 进行合并,消除重复的 URL 入口;

(3) URL 及其状态、分值存入 crawldb 数据库,与原数据库中重复的则删除旧的,更换新的。

2.          generate 操作分析

generate 操作调用的是 crawl 包中的类 org.apache.nutch.crawl.Generator 。它执行的结果是:创建了抓取 列表,存放于 segments 目录下,以时间为文件夹名称。循环抓取多少次, segments 文件夹下就会有多少个以时间为名称的文件夹。

generate 操作主要作用可以从下面 3 方面来说明:

(1) crawldb 数据库中将 URL 取出并进行过滤;

(2) URL 进行排序,通过域名、链接数和一种 hash 算法综合进行降序排列;

(3) 将排列列表写入 segments 目录中。

3.          fetch 操作分析

fetch 操作调用的是 fetcher 包中的类 org.apache.nutch.fetcher.Fetcher 。它执行的结果是:将页面内容抓取下来,存于 segment 目录下。

fetch 操作主要作用可以从下面 4 方面来说明:

(1) 执行抓取,按照 segments 目录下的抓取列表进行;

(2) 抓取过程中,页面的 URL 地址可能因为链接发生改变,从而需要更新 URL 地址;

(3) 抓取采用多线程方式进行,以提高抓取速度;

(4) fetch 操作过程中调用了 parse 操作。

4.          parse 操作分析

parse 操作调用的是 parse 包中的类 org.apache.nutch.parse.ParseSegment 。它执行的结果是:将 fetch 得到的页面解析为 text data ,存于 segments 目录下。

parse 操作主要作用可以从下面 3 方面来说明:

(1) 解析 segment 中由 fetch 得到的页面,并进行整理,将页面分成为 parse-date parse-text

(2) parse-date 中保存的是页面的题名、作者、日期、链接等内容;

(3) parse-text 中保存的是页面的文本内容。

例如,我只执行一次抓取任务,就执行了上述的一些操作,操作的结果直接反映在 segments 目录中。可以看到在 home\SHIYANJUN \nutch-0.9\mydir\segments 目录下面创建了 20081004102407 这个目录,该目录中包含 6 个目录: content crawl_fetch crawl_generate crawl_parse parse_data parse_text ,从目录名称就可以大致知道该目录存取的相关内容信息。

5.          updatedb 操作分析

updatedb 操作调用的是 crawl 包中的类 org.apache.nutch.crawl.CrawlDb 。它执行的结果是:更新了 crawldb 数据库,为下一轮抓取做准备。

updatedb 操作主要作用如下:

根据 segments 目录下 fetch 目录和 parse 目录中的内容,对 crawldb 进行更新,增加新的 URL ,更换旧的 URL

6.          invertlinks 操作分析

invertlinks 操作用来更新 linkDB ,为建立索引的工作提供准备。

7.          index 过程分析

index 过程,即索引过程,包括:将数据转换成文本、分析文本、将分析过的文本保存到数据库中这三个操作。

(1) 转换成文本

在索引数据之前,首先必须将数据转换成 Nutch 能够处理的格式 ―― 纯文本字符流。但是,在现实世界中,信息多以富媒体 (rich media) 文档格式呈现: PDF WORD EXCEL HTML XML 等。为此, Nutch 采用了插件机制 (plugin) ,通过各种各样的文档解 析器,将富媒体转换成纯文字字符流。文档解析器种类繁多,开发人员可以根据需要进行选择,同时还可以自己修改或编写,非常灵活方便。

(2) 分析文本

在对数据进行索引前,还需要进行预处理,对数据进行分析使之更加适合被索引。分析数据时,先将文本数据切分成一些大块或者语汇单元 (tokens) ,然后对它们执行一些可选的操作,例如:在索引之前将这些语汇单元转换成小写,使得搜索对大小写不敏感;最有代表性的是要从输入中去掉一 些使用很频繁但却没有实际意义的词,比如英文文本中的一些停止词 (a an the in on ) 。同样的,我们也需要分析输入的语汇单元,以便从词语中去掉一些不必要的字母以找到它们的词干。这一处理过程称为分析 (analyze) 。分析技术在索引和搜索时都会用到,比较重要。

(3) 将分析过的文本保存到数据库中

对输入的数据分析处理完成之后,就可以将结果写入到索引文件中。 Nutch 采用的是 Lucene 的索引格式,可以参考关于 Lucene 的索引机制。 Lucene 采用 倒排索引 的数据结果来存储索引的。

8.          搜索程序分析

Nutch 的搜索程序执行过程,可以从下面的步骤了解:

(1) HTTP 服务器接收用户发送过来的请求。对应到 Nutch 的运行代码中就是一个 servlet ,称为查询处理器 (Query Handler) 。查询处理器负责响应用户的请求,并将相应的 HTML 结果页面返回给用户。

(2) 查询处理器对查询语句做一些微小的处理并将搜索的项 (terms) 转发到一组运行索引搜索器的机器上。 Nutch 的查询系统似乎比 lucene 简单的多, 这主要是因为搜索引擎的用户对他自己所要执行的查询内容有非常清晰的思路。然而, lucene 的系统结构非常灵活,且提供了多种不同的查询方式。看似简单的 Nutch 查询最终被转换为特定的 lucene 查询类型。每个索引搜索器并行工作且返回一组有序的文档 ID 列表。

(3) 现在存在这大量从查询处理器返回过来的搜索结果数据流。查询处理器对这些结果集进行比较,从所有的结果查找出匹配最好的那些。如果其中任何一个索引搜索器在 1~2 秒之后返回结果失败,该搜索器的结果将被忽略。因此,最后列表由操作成功的搜索器返回的结果组成。

关于查询处理器

查询处理器对查询作了一些细微的处理,例如删除停止词 ( 例如 the of ) 。接着 Nutch 需要执行一些操作以便于它在大规模的数据环境下能更好的工作。一个索引搜索器涉及搜索的文档集数目非常庞大,所以 Nutch 需 要同时与很多索引搜索器交互来提高搜索速率。实际运行环境中,为了保证系统级别的稳定性,文档集的段文件会被复制到多个不同主机上。因为对于文档集中的每 个段,查询处理器会随机的与其中一个可搜索到自身的索引搜索器相交互。如果发现一个索引搜索器不能交互,查询处理器会通知之后的搜索操作不使用该搜索器, 但是查询处理器每隔一段时间会回头检查一次搜索器的状态,以防该主机上的搜索器再次可用。

关于分析器

Nutch 使用自己的分析器,对应于 analysis 包。 Nutch 把索引时进行分析所使用的二元语法技术 (bigram) 与查询过程中对短语的优化技术结合在一起,通过二元语法技术可以把两个连续的词组合成一个语汇单元。这就可以大大减少搜索时需要考虑的文档范围,例如,包含词组 the quick 的文档比包含 the 的文档要少的多。

分析器对分析操作进行了封装。分析器通过执行若干操作,将文本语汇单元化,这些操作可能包括提取单词、去除标点符号、去掉语汇单元上的音调符号、将字母转化为小写 ( 也称为规格化 ) 、移除常用词、将单词转换为词干形式 ( 词干还原 ) ,或者将单词转换为基本形等。这个过程也称为语汇单元化过程。分析操作发生在两个阶段:建立索引和进行查询时。

Nutch 的其他一些特性

为了获取小数量的文档 ( 通常是 10 个左右 ) ,查询处理器会对每个索引搜索器进行查询。因为最后的结果是从多个索引搜索器中合并得到的,所以就没有必要从一个数据源中获取过多的文档结果,尤其是在用户很少去查看第一页之后的结果的情况下。

实际上,在每个用户查询被处理之前,它会被扩展为十分复杂的 lucene 查询。每个索引过的文档都包含了三个域:网页自身的内容,网页的 URL 文本值,以及由所有关键 (anchor) 文本所组成的合成文档,这些关键文本可在导航网页的超链接中找到。每个域对应一个不同的权重值。 Nutch 的查询处理器生成一个 lucene 布尔查询,其中在三个域中都包含了搜索引擎用户所输入的文本。

● Nutch 也会特别的把那些在 web 上出现的非常频繁的关键字组作为一个整体来索引 ( 其中的许多关键字是与 HTTP 相关的词组 ) 。这些关键字序列出现的非常频繁,所以无需花费精力去对这些词序中的每个组成部分单独搜索,也不必查找出这些搜索结果中是否有交集的部分。我们不用把这些项划分为单独的单词对来搜索文档,而是把它们作为一个单元,当然前提是 Nutch 在索引期间必须检测到它们是作为一个整体而存在的。另外,在与索引搜索器交互之前,查询处理器会查找出用户输入的字符串中单词的任意组合。如果这样一个词序确实存在,它的单词成员就会整合成一个特殊的搜索项。

在使用 lucene 执行索引操作之前, Nutch 的内容获取器 / 索引器需要预处理 HTML 文档。它使用 NekoHTML 解析器剥离 HTML 中的内容,并索引其中的非标记文本。对于从 HTML 文档提取标题文本, NekoHTML 是很有建树的。

● Nutch 进程间通信层 (IPC) 保持了查询处理器与索引搜索器间长时间的连接。查询处理器端可能存在多个并发的线程,对于给定的地址,任一线程都可以向远程服务器发送调用请求。服务器每接受一个请求之后,就会根据给定字符串尝试去查找对应的注册服务 ( 运行在自己线程上 ) 。客户端的请求线程会一直阻塞其他事件,直到服务器端响应的 IPC 代码到达后,消息通知请求线程为止。如果服务器的响应花费的时间超过了 IPC 规定的时限, IPC 的代码就会宣布此服务器不可用,并抛出一个异常。

另外, Nutch 的排序算法是仿照 Google PageRank 算法,关于 PageRank 算法的资料有很多,推荐《 Google 的秘密 PageRank 彻底解说中文版》。

优点

Nutch 支持分布式抓取,并有 Hadoop 支持,可以进行多机分布抓取,存储和索引。另外很吸引人的一点在于,它提供了一种插件框架,使得其对各种网页内容的解析、各种数据的采集、查询、集群、过滤等功能能够方便的进行扩展,正是由于有此框架,使得 Nutch 的插件开发非常容易,第三方的插件也层出不穷,极大的增强了 Nutch 的功能和声誉。

缺点

Nutch 的爬虫定制能力比较弱

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值