数据爬虫综述

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/leveretz/article/details/53303048

随着大数据时代的来临,互联网对人类的生活影响越来越深入,已经成为人类获取信息的主要来源之一。互联网为用户带来海量数据的同时也带来了困扰,如何及时获得有效信息成为研究重点。搜索引擎根据预定的策略从互联网上发现和抓取数据,存入本地;对数据进行去噪、抽取和生成索引等处理,最终为用户提供信息检索服务,将相关信息展示给用户的系统。

爬虫(Crawler)是搜索引擎架构中的最底层模块,以一定的策略从互联网上抓取数据,并对数据进行预处理,然后将处理后的数据提交给搜索引擎其他模块,数据的质量和数量直接影响用户的体验。但是,随着大数据时代互联网数据爆炸式增长,爬虫抓取数据的速度越来越不能满足实际应用的需要。解决这个问题主要从软硬件考虑:一是升级爬虫的硬件,使用性能更好的硬件设备,但性价比不高,且不易扩展;二是利用分布式方式提高爬虫的并行处理能力,但这种方法会增加爬虫系统设计的复杂度。

目前,大多数大型爬虫系统采用的是分布式方式,但仍然不能满足用户的实际需要。其次,爬虫系统还需解决网页动态变化导致本地副本过期的问题。网页随时都可能变化,有的几小时更新一次,爬虫系统必须及时的发现并更新本地的网页,但互联网海洋中网页数量多、分布广,爬虫系统更新一遍需要数周甚至更长的时间,使得本地库中网页副本时新性较低。因此,一个采集速度快,网页更新及时的高可靠爬虫系统,不仅仅为搜索引擎提供基础数据,也可以为数据分析、挖掘提供基础数据,从而获得信息、知识。

Nutch Apache 软件基金会的一个开源项目,由Java 编写的可扩展和可伸缩的搜索引擎,具有跨平台的优点,使用基于模块化的思想设计。它基于Hadoop的分布式处理模型保证了系统的性能,类似Eclipse 的插件机制有利于用户自定义扩展NutchNutch 为我们研究搜索引擎爬虫的原理及工作机制提供了一个很好的平台。

Nutch 有两种运行模式:分布式模式和单机模式。分布式模式采用HDFS 作为存储文件系统,并利用MapReduce 实现爬虫抓取网页的各个环节,从而使Nutch 能够抓取、存储海量网页。Nutch有两部分:爬虫和检索。爬虫负责从互联网抓取数据存储在本地,索引程序对抓取在本地的数据建立索引,然后存储在索引库。检索程序接收用户的查询请求,搜索索引库中的索引并返回结果。

Nutch 爬虫系统是由爬虫程序以及用于维护相关数据结构的程序组成,采用插件机制进行设计,因此可以很清晰地分离出爬虫运行各阶段的任务。Nutch 的爬虫通过累积式抓取和增量式抓取方式从互联网中将网页抓下来,分布式模式下将数据存储在HDFS 中,为其他模块提供基础数据。在 Hadoop 分布式平台下,Nutch 在抓取数据的各阶段都向Hadoop 提交MapReduce job,且这些job 都有严格的前后顺序关系。

Nutch 爬行工作流程如下:

1)建立初始种子URL 集:一般新建一个文件包含指定的网址,上传到HDFS上。非全网爬行时,还需在$NUTCH_HOME/conf/regex-urlfilter.txt 文件中设置超链接的过滤规则,过滤掉不合规则的URL

2Inject:该操作是由org.apache.nutch.crawl 包中的Injector 类完成,将URL集注入 CrawlDB 数据库。利用插件 URL Normalizers URL Filters URL 格式化、过滤,消去重复的URL,并设置URL 状态和初始化分值,再更新CrawlDB 数据库中相对应的内容,并标记已经爬行的URL

3Generate:该操作是由org.apache.nutch.crawl 包中的Generator 类完成,从CrawlDB 数据库中取出URL 创建抓取列表。当一次爬行完成后, Generate 阶段利用CrawlDB 库中的信息对已爬的URL进行过滤,之后运用Hash 算法对URL 进行降序排列,结果存入segments 目录下的一个目录,目录名是一个时间戳。循环爬行多少次,segments 目录下就有多少这样的文件;

4Fetch:该操作是由org.apache.nutch.fetcher 包中的Fetcher 类完成,执行抓取,获取网页信息。抓取按 segments 目录下的URL 列表进行,可以自定义爬行的深度(depth)及线程数,适度的增加线程数可以很好地提高Nutch 爬行的效率。网页结果存储在segments 相对应的目录下;

5Parse:该操作是由org.apache.nutch. parse 包中的ParseSegment 类完成。对 Fetch 抓到的网页进行解析,得到parse-data parse-text 两个目录。parse-text 目录存储的是网页的文本信息,parse-data 目录存储的是日期、超链接、题名等其他网页信息;

6Update CrawlDB:该操作是由org.apache.nutch.crawl 包中的CrawlDb 类完成。根据抓取下来的 segments 目录下的内容更新CrawlDB数据库,更新包括URL爬行周期、爬行间隔、网页指纹等,还要将Parse 阶段解析出的新的URL 加入到CrawlDB,为新的抓取提供URL 列表;

7)循环执行36 的步骤,直到depth 的值。以上循环过程可以总结为“产生/抓取/更新”循环;

8Update LinkDBNutch 爬行结束后,更新LinkDB 并建立索引。

Nutch 网页更新机制采用的是邻比法。对第一次采集的网页,邻比法设置其更新时间为初始值。如果该网页在这个时间内更新了,则更新时间缩小一定值;如果没有更新,则更新时间增加一定值。Nutch 网页更新机制我们称为Recrawl 机制,它提供Adaptive FetchSchedule class 来管理爬虫的重新抓取。

Nutch作为开源的搜索引擎框架,能够得到极速的发展使用,不仅是因为Nutch具有以上的功能,还有一项重要的机制促使了Nutch的快速发展,那便是Nutch的插件机制,这种机制极大地方便了研究工作,通过这个扩展机制,能满足了个性化需求。Nutch的插件机制的基本思想是借鉴了Eclipse软件对插件的使用。其优点主要体现为以下几点:

1.可扩展性。插件机制的使用,极大地提高了Nutch对于不同应用的扩展,在实际开发中只需要对特定的接口进行简单的实现,便能够生成具有特定功能的搜索引擎,满足了各种特色的搜索服务。

2.灵活性。插件拥有着强大的资源库,这些插件都在Nutchplugins中,开发者在使用Nutch框架定制符合自己需求的插件,,比如:开发者可以选择不同的实现算法,寻找满足自己需要的最优解,也可以增加对不同格式文档的分析解压。

3.可维护性。每个开发者只需要关注自己需要关注的问题,如内核的开发者为引擎内核扩展时,只需添加一个描述它的接口;plugin的开发者只需关注这个plugin所要实现的功能,不需要完全了解整个系统工作的工作流程。仅仅需要知道pluginplug之间交换的数据类型。这使得内核更加简单,也更容易维护。

插件机制在Nutch中的实现,是由Nutch框架提供的扩展点,为其增加一系列的扩展项,从而实现复杂的业务功能。

Nutch的爬虫属于普通的爬虫,这样的爬虫在工作的时候,首先要选好一定的URL集合作为一个起始队列。爬虫通过爬取、解析等过程,获取到网页上新的URL,并且把这些URL添加到队列之中,当第一轮抓取完成之后,就会继续以这些获取到的新的URL为起始地址,继续向深层次抓取,如此循环抓取,直到满足抓取停止的条件或者队列为空,爬虫才会停止工作。普通的爬虫一般会包括待爬行队列模块,获取网页模块,页面解析模块等。

与普通爬虫相比,主题爬虫一般会增加一个主题相关度判断的模块,也是主题爬虫的核心模块。该模块负责爬虫在抓取到网页之后,对网页的内容进行一次主题判断,如果判断结果为与主题相关或者相近,则该页面可以保留;若判断结果为该页面与主题无直接关系,则可以认为这个页面对于抓取后的操作意义不大,可以直接舍弃。由此可以推断出,抓取页面质量的优劣直接有主题爬虫设计的好坏决定,而主题爬虫好坏又直接受到主题相关度判断模块影响。

目前,主要的主题爬虫爬行策略有两种:一是广度优先搜索策略,二是最佳优先搜索策略。二者各有优点和缺点,很多时候都是结合着使用的。

广度优先搜索策略是一种图形搜索算法,在互联网上,网页与网页之间相联系是靠URL,假设通过页面A上的某一URL可以跳转到页面B,则可以认为页面A为上层,页面B为下层。广度优先搜索策略都是按照层次搜索的,总是优先搜索上层的结点,从根节点出发,逐层向下搜索新的与上层邻近的节点,网页的存在基本上就是被URL分成了层。

最佳优先搜索策略的实施与网页评分相关联。进行最佳优先搜索,要给每一个页面进行一个打分,分数的高低也直接决定了网页的优劣。网页抓取到之后,也会根据网页的分数的高低将网页放入队列,便于下一轮的抓取操作。该算法相较于广度优先搜索策略有一定的优势,但是也存在自身的缺点,就是网页的主题性往往是不连贯的,需要经过多层的网页也许才会到达另一个与主题相关的网页,这就产生了“隧道”现象。

猜你喜欢

转载自blog.csdn.net/leveretz/article/details/53303048