分享

网络爬虫系统Heritrix的结构分析 (个人读书报告)

 复杂网络621 2014-08-09

 

 

摘要

       随着网络时代的日新月异,人们对搜索引擎,网页的内容,大数据处理等问题有了更多的要求。如何从海量的互联网信息中选取最符合要求的信息成为了新的热点。在这种情况下,网络爬虫框架heritrix出现解决了这个问题。

       Heritrix是一个开源的、java开发的、可扩展的web爬虫项目。用户可以使用它来从网上抓取想要的资源。其最出色之处在于它良好的可扩展性,方便用户实现自己的抓取逻辑。

       本文首先介绍网络爬虫程序的概念和作用,分析了heritrix的工作流程,模块划分,然后对源码进行多层次详细的分析,最后通过heritrix进行面向特定主题的网页抓取试验并进行结果分析。

 

关键词:网络爬虫;网页搜集;heritrix;源码分析

 

Abstract

       With the development of network, user’s requirement for search engines, webpage content, large data processing problems increases all the time. How to select most valuable information from massive Internet information has become a new hotspot. In this case, a new web crawler frame-heritrix solved this problem.

       The heritrix web crawler is a java-developed, open-source, extensible project. Users can use it fetch resources from Internet. Its most outstanding feature lies in its good scalability, makes users can fetch information in their own logic.

       This paper firstly introduces the concept and function of network crawler, analyzes the work process, module division of heritrix. Then analyzes the source in detail, at last, uses heritrix to fetch the specific web pages and analyzes the result.

 

Key words: heritrix; web crawler; source code analysis; web page search.

一、引言

随着互联网中网页数量的急剧增长,面对如此庞大的网络资源,快速准确找到自己需要的信息变得越来越重要,而通用的搜索引擎已经不能满足不同用户对不同信息的需求。例如如今电子商务领域,如何快速、准确搜索用户所需求的信息,成为一个关键因素。搜索引擎是从各种网络资源中根据关键字搜索出特定的资源的一种工具,而网络爬虫技术是搜索引擎中的关键技术。目前的搜索引擎室面向互联网中所有信息的,但是人们往往需要更精确更具体的搜索引擎,在这种情况下,Heritrix项目应运而生。Heritrix是一个纯由Java开发的、开源的Web网络爬虫,用户可以使用它从网络上抓取想要的资源。Heritrix最出色的的特性是开发者可以在现有的框架基础上对各个组件进行扩展,实现自己所需要的抓取逻辑。

本文将从介绍Heritrix系统的框架和工作流程入手,继而深入分析核心的源码,然后在本地对该系统进行测试,实现自己定义的搜索逻辑,最后对整个结果进行测试分析。

二、网络爬虫Heritrix系统介绍

2.1Heritrix系统简介

       网络爬虫是一种按照一定的规则,自动抓取互联网信息的程序或脚本。从一个或若干初始网页的URL开始,利用HTTP等标准协议读取文档,将文档中所包括的URL放入URL队列中,然后从队列中新的URL处开始进行漫游,把爬过的网页搜集起来,直到没有满足条件的新的URL为止。

       网络爬虫工具Heritrix是由面向对象的程序设计语言java开发的,开源的网络爬虫工具包,它的程序执行速度之快是传统搜索引擎无法企及的。作为一个专为互联网网页进行存档而开发的网页检索器,开发者可利用其出色可扩展性来实现自己的抓取逻辑。

2.2Heritrix系统结构

       Heritrix是一个爬虫框架,其组织结构如图2.1所示,包含了整个组件和抓取流程:

      

 

图2.1 Heritrix系统架构

       Heritrix采用的是模块化的设计,各个模块由一个控制器类(CrawlController类)来协调,控制器是整体的核心。控制器结构图如图2.2所示:

 

图2.2 CrawlController类结构图

       CrawlController类是整个爬虫的总控制者,控制整个抓取工作的起点,决定整个抓取任务的开始和结束。CrawlController从Frontier获取URL,传递给线程池(ToePool)中的ToeThread处理。

Frontier(边界控制器)主要确定下一个将被处理的URL,负责访问的均衡处理,避免对某一Web服务器造成太大的压力。Frontier保存着爬虫的状态,包括已经找到的URI、正在处理中的URI和已经处理过的URI。

Heritrix是按多线程方式抓取的爬虫,主线程把任务分配给Teo线程(处理线程),每个Teo线程每次处理一个URL。Teo线程对每个URL执行一遍URL处理器链。URL处理器链包括如下5个处理步骤。整个流程都在图2.1中。

(1)预取链:主要是做一些准备工作,例如,对处理进行延迟和重新处理,否决随后的操作。

(2)提取链:主要是下载网页,进行DNS转换,填写请求和响应表单。

(3)抽取链:当提取完成时,抽取感兴趣的HTML和JavaScript,通常那里有新的要抓取的URL。

(4)写链:存储抓取结果,可以在这一步直接做全文索引。Heritrix提供了用ARC格式保存下载结果的ARCWriterProcessor实现。

(5)提交链:做和此URL相关操作的最后处理。检查哪些新提取出的URL在抓取范围内,然后把这些URL提交给Frontier。另外还会更新DNS缓存信息。

服务器缓存(Server cache)存放服务器的持久信息,能够被爬行部件随时查到,包括被抓取的Web服务器信息,例如DNS查询结果,也就是IP地址。

三、Heritrix核心源码分析

3.1核心包及类功能说明

  1. 包名:org.archive.crawler Heritrix 程序运行的入口包

1)        CommandLineParser类

可通过CMD命令在命令行对Heritrix进行操作,该类用于解析CMD命令。

2)        Heritrix类

Heritrix主类,通过该类启动Heritrix。

3)        SimpleHttpServer类

Web服务器,可以通过Web管理Heritrix。

4)        WebappLifecycle类

封装Servlet,可以通过Web启动Heritrix,里边装载Heritrix对象。

  1. 包名:org.archive.crawler.admin  Heritrix的管理包,比如CrawlJob表示一个抓取任务job,CrawlJobHandler管理JOB,以及日志统计等

1)        CrawlJob类

Heritrix的核心类,代表着一个抓取任务,order.xml大部分属性围绕其配置

2)        CrawlJobErrorHandler类

维护一个抓取任务(CrawlJob)的错误日志,在UI中显示JOB错误

3)        CrawlJobHandler类

抓取任务管理器,Heritrix可以有多个抓取任务,都由它进行管理

4)        SeedRecord类

记录种子的处理记录,如种子重定向到哪个URL,在seed.txt里有说明。

5)        StaticsticsTracker类

Heritrix核心类,统计追踪器,贯穿整个Heritrix的运行,如统计抓取了多少URL。

  1. 包名:org.archive.crawler.admin.ui 服务于UI管理界面

1)        CookieUtils类

Cookie工具类,主要用于访问Cookie。

2)        JobConfigureUtils类

CrawlJob配置管理工具类,通过WebUI配置CrawlJob时会使用该类

  1. 包名:org.archive.crawler,datamodel Heritrix的数据模型包,如在Heritrix中代表一个URL的CandidateURI

1)        CandidateURI类

核心类,代表一个URL,贯穿整个抓取工程,还没有通过调度器(Frontier)

2)        CheckPoint类

Heritrix会定期备份数据,如日志、正在获取的URL等,当异常中断时课利用它来恢复。

3)        CrawlHost类

核心类,代表一个Host,里边主要包含域名、IP。

4)        CrawlOrder类

核心类,基本上对应着配置文件order.xml的各个属性值。

5)        CrawlServer类

核心类,对应一个Host,里边装载着一个Host的各种Heritrix数据。

  1. 包名:org.archive,crawler.deciderules Heritrix的规则包,如决定哪些URL可以抓取可以调度。

1)        DecideRule类

URL规则的父类,审核一个URL是否接受、拒绝或放弃。

2)        DecidingScope类

验证一个URL是否在范围内来决定是否接受、拒绝或放弃。

  1. 包名:org.archive.crawler.event 事件管理,如Heritrix的暂停、重启、停止等

1)        CrawlStatusListner类

爬虫监听器,监听爬虫是否在运行,是否暂停等。

2)        CrawlURIDispositionListener类

URL监听器,监听URL是否失败,是否要重新抓取等。

  1. 包名:org.archive.crawler.extractor Heritrix的造血器,通过它抽取新的URL再次进行抓取

1)        Extractor类

所有抽取类的父类,用于从一个URL中抽取新的URL。

2)        ExtractorCSS类、ExtractorHTML类、ExtractorPDF类、ExtractorXML类等

从相应的格式总抽取新的URL。

  1. 包名:org.archive.crawler.framework Heritrix的框架包,存放一些核心类,一般是父类,如Heritrix控制类CrawlController;调度器类Frontier。

1)        CrawlController类

核心类。控制器,控制整个爬虫的启动,暂停、停止等。

2)        Filter类

过滤器,决定哪些URL可以抓取哪些不抓,父类,具体由子类实现

3)        Frontier类

调度器,对进来的URL进行调度。

4)        Processor类

处理器,一个URL由不同的处理器合作完成。该类作为父类。

5)        ToePool类

线程池,用于管理爬虫线程。

6)        WritePoolProcessor类

写处理器管理池,用于管理多个写处理器,可以在分布式中使用。

  1. 包名:org.archive.crawler.frontie Heritrix的调度器,决定抓取哪个URL

1)        AbstractFrontier类

调度器基本实现类,非常复杂的实现。

2)        BdbWorkQueue类

抓取队列由BDB存储管理,相同classkey的URL为一个队列.classkey由用户配置决定,Heritrix默认是相同host的URL就为一个队列。

3)        RecoveryJournal类

管理着/logs/recover,该文件记录所有的URL抓取情况,如抓取成功、失败都有不同的对应格式。该文件主要用于下次Heritrix恢复,如Heritrix异常中断重新启动Heritrix的话又会重新抓取,而如果基于该文件启动的话则会避免这个问题,同时对于上次异常中断而来不及抓取的URL都会优先抓取。

4)        WorkQueueFrontier类

队列调度器,管理所有的队列,里面用不同类型管理不同队列。

3.2配置文件分析

       Heritrix系统的一个核心是order.xml配置文件,它里边的每一个配置都关系到整个系统的运行情况,例如可以控制抓取的速度,可以优化电脑行呢,可以在某一次的抓取上继续抓取。整个文件格式为标签语言xml,现将挑选核心的标签进行说明。

  1. <meta></meta>  代表着该抓取JOB的基本元素,包括的属性有:Job的名称name,抓取Job的描述description,抓取工作的操作者operator,抓取任务的时间date等元素。
  2.  <controller></controller> 里包括与抓取有关的所有参数,由于内容较多,并且Heritrix也已将他们分成不同模块。自己包括的基本属性有很多与path有关的字符串,用来保存与抓取工作相关的文件目录的各种路径。例如<string name="logs-path">logs</string>记录了日志的存放路径。
  3. <newObject name="scope" class="org.archive.crawler ">抓取范围,构建CrawlScope。通过多个参数来控制抓取过程中种子文件的处理和URL的放置。
  4. <map name="http-headers">HTTP协议,当处理爬虫HTTP协议时需要构造。利用string类型的“user-agent”字段来确保用户代理的可用性。该字段必须包含浏览器信息、有效的URL,如此爬虫来可以访问网站。
  5. <newObject name="frontier" class="org.archive.crawler.frontier.BdbFrontier">Frontier调度器。利用多个参数控制URL抓取的频率,时间,重试次数,URL的优先级等。可以通过修改本调度器的内容来实现抓取过程的优化。改进爬虫程序。
  6. <map name="fetch-processors"> 获取组件,通过本组件来获取整个网页的HTTP协议、DNS协议、IP地址、端口等信息,将抓取页面的内容按照相应的格式一一获取。
  7. <map name="write-processors"> 写组件,用来记录将抓取的内容写入本地存储中的各项选项,如写入的方式,存储的位置等。

 

四、小结

目前搜索引擎技术越来越受到关注,而网络爬虫作为其中至关重要的一环自然是需要更多地理解与深入地分析。Heritrix作为开源的扩展性优良的网络爬虫程序,有着很高的研究,使用价值。

本文通过对Heritrix系统的整体架构分析开始,理清整个系统的各个模块划分及各个模块的作用。整体抓取的流程为:在CrawlController的控制下,一次把URL一个一个抓取出来,利用调度器Frontier实现URL链的处理,再利用FetchProcessor获取网页中的URL信息,然后把网页内容写入本地磁盘,再按规则抓取下一个URL。分析了流程,对源码在本地测试,分析源码的核心实现,了解了重要的包和类的作用,并且分析了整体配置文件order.xml的核心内容。对以后利用Heritrix抓取URL工作做好了准备,可以在此基础上实现自己的抓取规则来设计新的爬虫程序。

 

 

参考文献

[1] Kristinn Siguresson. Incremental crawling with Heritrix. National and University Library of Iceland[M].2008

[2] 白万民,苏希乐.Heritrix在垂直搜索引擎中的应用[J].计算机时代,2011(9)

[3] 朱 敏,罗省贤.基于 Heritrix 的面向特定主题的聚焦爬虫研究[J]. 计算机技术与发展,2012 (2)

[4] 刘显一. 基于Lucene和Heritrix的主题搜索引擎的设计与实现[M].北京邮电大学.2012.8

[5] 张敏. 基于Heritrix 限定爬虫的设计与实现[J].计算机应用与软件.2013.4(4)

[6] 杨 颂,欧阳柳波.基于 Heritrix 的面向电子商务网站增量爬虫研究[J]. 软件导刊,2010,9( 7) : 38-39.

[7] 杨定中,赵 刚,王 泰.网络爬虫在 Web 信息搜索与数据挖掘中的应用[J].计算机工程与设计,2009,30( 24)

[8] 邱 哲,符滔滔. Lucene 2.0+Heritrix 开发自己的搜索引擎[M].北京: 人民邮电出版社,2007

 

 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多