摘要

随着网络时代的日新月异,人们对搜索引擎,网页的内容,大数据处理等问题有了更多的要求。如何从海量的互联网信息中选取最符合要求的信息成为了新的热点。在这种情况下,网络爬虫框架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
Sigurðsson. 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

网络爬虫系统Heritrix的结构分析 (个人读书报告)的更多相关文章

  1. python3网络爬虫系统学习:第一讲 基本库urllib

    在python3中爬虫常用基本库为urllib以及requests 本文主要描述urllib的相关内容 urllib包含四个模块:requests——模拟发送请求 error——异常处理模块 pars ...

  2. 网络爬虫框架Heritrix中Modules的各项说明

    1)Select Crawl Scope:Crawl Scope 用于配置当前应该在什么范围内抓取网页链接.例如选择 BroadScope 则表示当前的抓取范围不受限制,选择 HostScope 则表 ...

  3. python3网络爬虫系统学习:第二讲 基本库requests(一)

    之前,我们学习了基本库urllib的相关用法,但是在网页验证.Cookies处理等方面是比较繁琐的,需要用到Handler并且还需自己构建Opener.requests库的出现很好的解决了这个问题,下 ...

  4. 基于Heritrix的特定主题的网络爬虫配置与实现

    建议在了解了一定网络爬虫的基本原理和Heritrix的架构知识后进行配置和扩展.相关博文:http://www.cnblogs.com/hustfly/p/3441747.html 摘要 随着网络时代 ...

  5. 网络爬虫框架Scrapy简介

    作者: 黄进(QQ:7149101) 一. 网络爬虫 网络爬虫(又被称为网页蜘蛛,网络机器人),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本:它是一个自动提取网页的程序,它为搜索引擎从万维 ...

  6. hadoop中实现java网络爬虫

    这一篇网络爬虫的实现就要联系上大数据了.在前两篇java实现网络爬虫和heritrix实现网络爬虫的基础上,这一次是要完整的做一次数据的收集.数据上传.数据分析.数据结果读取.数据可视化. 需要用到 ...

  7. python3.4学习笔记(十三) 网络爬虫实例代码,使用pyspider抓取多牛投资吧里面的文章信息,抓取政府网新闻内容

    python3.4学习笔记(十三) 网络爬虫实例代码,使用pyspider抓取多牛投资吧里面的文章信息PySpider:一个国人编写的强大的网络爬虫系统并带有强大的WebUI,采用Python语言编写 ...

  8. crawler_网络爬虫中编码的正确处理与乱码的解决策略

    转载: http://hi.baidu.com/erliang20088/item/9156132bdaeae8949c63d134 最近一个月一直在对nutch1.6版进行中等层次的二次开发,本来是 ...

  9. python3编写网络爬虫20-pyspider框架的使用

    二.pyspider框架的使用 简介 pyspider是由国人binux 编写的强大的网络爬虫系统 github地址 : https://github.com/binux/pyspider 官方文档 ...

随机推荐

  1. js导出excel

    function inportEx() { $("#btnEx").text("导出中..."); var fugNumber = "";/ ...

  2. ajax请求获取的数据无法赋值给全局变量问题总结

    一.总结: 1.问题描述: 今天做项目遇到在用表单显示详细信息的过程中ajax请求获取的数据无法赋值给全局变量的情况,从列表页面进入详情页,在详情页面被渲染了之后就会调用js文件里的接口向服务器请求数 ...

  3. linux下挂在u盘,移动硬盘的方法,转移服务器资料的时候,使用移动硬盘什么最方便了

    本文章是在centos环境下操作的 最近linux服务器我不小心吧root下面的用户配置,不能远程登录,而且我对linux系统配置也不熟悉,最后的办法就是去了一趟机房,还好是在深圳南山科技园,不算太远 ...

  4. 用ASP实现简单的繁简转换

    用ASP实现简单的繁简转换 国际化似乎是一个很流行的口号了,一个站点没有英文版至少也要弄个繁体版,毕竟都是汉字,翻译起来不会那么麻烦:P 一般的繁简转换是使用字典,通过GB的内码算出BIG5字符在字典 ...

  5. [刷题codeforces]651B/651A

    651B Beautiful Paintings 651A Joysticks 点击可查看原题 651B是一个排序题,只不过多了一步去重然后记录个数.每次筛一层,直到全为0.从这个题里学到一个正确姿势 ...

  6. 【UNIX环境高级编程】文件I/O

    [UNIX环境高级编程]文件I/O大多数文件I/O只需要5个函数: open.read.write.lseek以及close 不带缓冲的I/O: 每个read和write都调用内核中的一个系统调用 1 ...

  7. Go学习笔记05-指针

    目录 参数传递 var a int = 2 var pa *int = &a *pa = 3 fmt.Println(a) Go语言中 指针不能运算 参数传递 不像C++.Java.Pytho ...

  8. POI 导出文档整理

    1 通过模板获取workbook public static Workbook getWorkBook(String templatePath) { try { InputStream in = ne ...

  9. Android Studio计时跳转或点击跳转至主页面

    这个总体来说是比较简单的,计时跳转一般调用Android Studio中的Handler方法. 一.发生点击事件跳转页面 mBtnTextView = (Button) findViewById(R. ...

  10. C#特性:ConditionalAttribute

    ConditionalAttribute类 msdn解释: 指示编译器应忽略方法调用或属性,除非已定义指定的条件编译符号. 命名空间: System.Diagnostics 语法: // // 摘要: ...