利用 Heritrix 构建特定站点爬虫

原文地址: http://www.ibm.com/developerworks/cn/opensource/os-cn-heritrix/

郭 艳芬, IBM 实习生, IBM

简介: Heritrix 是一个由 java 开发的、开源的网络爬虫,用户可以使用它来从网上抓取想要的资源。其最出色之处在于它良好的可扩展性,方便用户实现自己的抓取逻辑。本文详细介绍了 Heritrix 在 Eclipse 中的配置、运行,最后以抓取北京林业大学网站为例,介绍如何对其进行扩展,实现只抓取特定网站的页面。

本文由浅入深,详细介绍了 Heritrix 在 Eclipse 中的配置、运行。最后对其进行扩展,介绍如何实现只抓取特定网站的页面。

通过本文,读者可以了解 Heritrix 的相关特点以及在 Eclipse 中的配置运行,能够从零开始构建特定站点的专有爬虫,从而为网站增加全文检索服务。

背景

随着网站内容的增加,为其添加搜索功能是一个常见的需求,搜索引擎也已成为互联网最重要的应用之一。你是否觉得普通的数据库检索已经不能满足你的查询需求了呢?是否希望花最小的代价为你的网站建立一个像 Google、百度那样的全文搜索引擎?是否希望创建自己专有的搜索引擎而不是想尽办法 SEO(Search Engine Optimization,搜索引擎优化)来等着 Google、百度收录你的网站?借助于开源工具的力量,你将很容易实现上述目标。

搜索引擎的实现过程,可以看作三步:1. 从互联网上抓取网页 2. 对网页进行处理,建立索引数据库 3. 进行查询。因此无论什么样的搜索引擎,都必须要有一个设计良好的爬虫来支持。Heritrix 是 SourceForge 上基于 Java 的开源爬虫,它可以通过 Web 用户界面来启动、设置爬行参数并监控爬行,同时开发者可以随意地扩展它的各个组件,来实现自己的抓取逻辑,因其方便的可扩展性而深受广大搜索引擎爱好者的喜爱。

虽然 Heritrix 功能强大,但其配置复杂,而且官方只在 Linux 系统上测试通过,用户难以上手。本文由浅入深,详细介绍 Heritrix 在 windows 下 Eclipse 中的配置运行,并对其进行简单扩展,使其只针对某一特定网站进行抓取,为构建相应站点的全文搜索引擎打好基础。

回页首

Heritrix 下载

目前 Heritrix 的最新版本是 1.14.4(2010-5-10 发布),您可以从 SourceForge(http://sourceforge.net/projects/archive-crawler/files/)上下载。每个版本都有四个压缩包,两个 .tar.gz 包用于 Linux 下,.zip 用于 windows 下。其中 heritrix-1.14.4.zip 是源代码经过编译打包后的文件,而 heritrix-1.14.4-src.zip 中包含原始的源代码,方便进行二次开发。本文需要用到 heritrix-1.14.4-src.zip,将其下载并解压至 heritrix-1.14.4-src 文件夹。

回页首

在 Eclipse 中的配置

首先在 Eclipse 中新建 Java 工程 MyHeritrix。然后利用下载的源代码包根据以下步骤来配置这个工程。

1. 导入类库

Heritrix 所用到的工具类库都在 heritrix-1.14.4-src\lib 目录下,需要将其导入 MyHeritrix 工程。

1)将 heritrix-1.14.4-src 下的 lib 文件夹拷贝到 MyHeritrix 项目根目录;

2)在 MyHeritrix 工程上右键单击选择“Build PathConfigure Build Path …”,然后选择 Library 选项卡,单击“Add JARs …”,如图 1 所示。

图 1. 导入类库 - 导入前
 

3)在弹出的“JAR Selection”对话框中选择 MyHeritrix 工程 lib 文件夹下所有的 jar 文件,然后点击 OK 按钮。如图 2 所示。

图 2. 选择类库
 

设置完成后如图 3 所示:

图 3. 导入类库 - 导入后
 

2. 拷贝源代码

1)将 heritrix-1.14.4-src\src\java 下的 com、org 和 st 三个文件夹拷贝进 MyHeritrix 工程的 src 下。这三个文件夹包含了运行 Heritrix 所必须的核心源代码;

2)将 heritrix-1.14.4-src\src\resources\org\archive\util 下的文件 tlds-alpha-by-domain.txt 拷贝到 MyHeritrix\src\org\archive\util 中。该文件是一个顶级域名列表,在 Heritrix 启动时会被读取;

3)将 heritrix-1.14.4-src\src 下 conf 文件夹拷贝至 Heritrix 工程根目录。它包含了 Heritrix 运行所需的配置文件;

4)将 heritrix-1.14.4-src\src 中的 webapps 文件夹拷贝至 Heritrix 工程根目录。该文件夹是用来提供 servlet 引擎的,包含了 Heritrix 的 web UI 文件。需要注意的是它不包含帮助文档,如果想使用帮助,可以将 heritrix-1.14.4.zip\docs 中的 articles 文件夹拷贝到 MyHeritrix\webapps\admin\docs(需新建 docs 文件夹)下。或直接用 heritrix-1.14.4.zip 的 webapps 文件夹替换 heritrix-1.14.4-src\src 中的 webapps 文件夹,缺点是这个是打包好的 .war 文件,无法修改源代码。

拷贝完毕后的 MyHeritrix 工程目录层次如图 4 所示。这里运行 Heritrix 所需的源代码等已经准备完备,下面需要修改配置文件并添加运行参数。

图 4. MyHeritrix 工程的目录层次
 

3. 修改配置文件

conf 文件夹是用来提供配置文件的,里面包含了一个很重要的文件:heritrix.properties。heritrix.properties 中配置了大量与 Heritrix 运行息息相关的参数,这些参数的配置决定了 Heritrix 运行时的一些默认工具类、Web UI 的启动参数,以及 Heritrix 的日志格式等。当第一次运行 Heritrix 时,只需要修改该文件,为其加入 Web UI 的用户名和密码。如图 5 所示,设置 heritrix.cmdline.admin = admin:admin,“admin:admin”分别为用户名和密码。然后设置版本参数为 1.14.4。

图 5. 设置登陆用户名和密码
 

4. 配置运行文件

在 MyHeritrix 工程上右键单击选择“Run AsRun Configurations”,确保 Main 选项卡中的 Project 和 Main class 选项内容正确,如图 6 所示。其中的 Name 参数可以设置为任何方便识别的名字。

图 6. 配置运行文件—设置工程和类
 

然后在 Classpath 页选择 UserEntries 选项,此时右边的 Advanced 按钮处于激活状态,点击它,在弹出的对话框中选择“Add Folders”,然后选择 MyHeritrix 工程下的 conf 文件夹。如图 7 所示。

图 7. 添加配置文件
 

至此我们的 MyHeritrix 工程已经可以运行起来了。下面我们来看看如何启动 Heritrix 并设置一个具体的抓取任务。

回页首

创建网页抓取任务

找到 org.archive.crawler 包中的 Heritrix.java 文件,它是 Heritrix 爬虫启动的入口,右键单击选择“Run AsJava Application”,如果配置正确,会在控制台输出如图 8 所示的启动信息。

图 8. 运行成功时控制台输出
 

在浏览器中输入 http://localhost:8080,会打开如图 9 所示的 Web UI 登录界面。

图 9. Heritrix 登录界面
 

输入之前设置的用户名 / 密码:admin/admin,进入到 Heritrix 的管理界面,如图 10 所示。因为我们还没有创建抓取任务,所以 Jobs 显示为 0。

图 10. Heritrix 控制台
 

Heritrix 使用 Web 用户界面来启动、设置爬行参数并监控爬行,简单直观,易于管理。下面我们以北京林业大学首页 (http://www.bjfu.edu.cn/) 为种子站点来创建一个抓取实例。

在 Jobs 页面创建一个新的抓取任务,如图 11 所示,可以创建四种任务类型。

图 11. 创建抓取任务
 

  • Based on existing job:以一个已经有的抓取任务为模板生成新的抓取任务。
  • Based on a recovery:在以前的某个任务中,可能设置过一些状态点,新的任务将从这个设置的状态点开始。
  • Based on a profile:专门为不同的任务设置了一些模板,新建的任务将按照模板来生成。
  • With defaults:这个最简单,表示按默认的配置来生成一个任务。

这里我们选择“With defaults”,然后输入任务相关信息,如图 12 所示。

图 12. 创建抓取任务“BJFU”
 

注意图 11 中下方的按钮,通过这些按钮可以对抓取工作进行详细的设置,这里我们只做一些必须的设置。

首先点击“Modules”按钮,在相应的页面为此次任务设置各个处理模块,一共有七项可配置的内容,这里我们只设置 Crawl Scope 和 Writers 两项,下面简要介绍各项的意义。

1)Select Crawl Scope:Crawl Scope 用于配置当前应该在什么范围内抓取网页链接。例如选择 BroadScope 则表示当前的抓取范围不受限制,选择 HostScope 则表示抓取的范围在当前的 Host 范围内。在这里我们选择 org.archive.crawler.scope.BroadScope,并单击右边的 Change 按钮保存设置状态。

2)Select URI Frontier:Frontier 是一个 URL 的处理器,它决定下一个被处理的 URL 是什么。同时,它还会将经由处理器链解析出来的 URL 加入到等待处理的队列中去。这里我们使用默认值。

3)Select Pre Processors:这个队列的处理器是用来对抓取时的一些先决条件进行判断。比如判断 robot.txt 信息等,它是整个处理器链的入口。这里我们使用默认值。

4)Select Fetchers:这个参数用于解析网络传输协议,比如解析 DNS、HTTP 或 FTP 等。这里我们使用默认值。

5)Select Extractors:主要是用于解析当前服务器返回的内容,取出页面中的 URL,等待下次继续抓取。这里我们使用默认值。

6)Select Writers:它主要用于设定将所抓取到的信息以何种形式写入磁盘。一种是采用压缩的方式(Arc),还有一种是镜像方式(Mirror)。这里我们选择简单直观的镜像方式:org.archive.crawler.writer.MirrorWriterProcessor。

7)Select Post Processors:这个参数主要用于抓取解析过程结束后的扫尾工作,比如将 Extrator 解析出来的 URL 有条件地加入到待处理的队列中去。这里我们使用默认值。

设置完毕后的效果如图 13:

图 13. 设置 Modules
 

设置完“Modules”后,点击“Settings”按钮,这里只需要设置 user-agent 和 from,其中:

  • “@VERSION@”字符串需要被替换成 Heritrix 的版本信息。
  • “PROJECT_URL_HERE”可以被替换成任何一个完整的 URL 地址。
  • “from”属性中不需要设置真实的 E-mail 地址,只要是格式正确的邮件地址就可以了。

对于各项参数的解释,可以点击参数前的问号查看。本次任务设置如图 14 所示。

图 14. 设置 Settings
 

完成上述设置后点击“Submit job”链接,然后回到 console 控制台,可以看到我们刚刚创建的任务处于 pending 状态,如图 15 所示。

图 15. 启动任务
 

点击“Start”启动任务,刷新一下即可看到抓取进度以及相关参数。同时可以暂停或终止抓取过程,如图 16 所示。需要注意的是,进度条的百分比数量并不是准确的,这个百分比是实际上已经处理的链接数和总共分析出的链接数的比值。随着抓取工作不断进行,这个百分比的数字也在不断变化。

图 16. 开始抓取
 

同时,在 MyHeritrix 工程目录下自动生成“jobs”文件夹,包含本次抓取任务。抓取下来网页以镜像方式存放,也就是将 URL 地址按“/”进行切分,进而按切分出来的层次存储。如图 17 所示。

图 17. 抓取到的网页
 

从图 17 也可以看出,因为我们选择了 BroadScope 的抓取范围,爬虫会抓取所有遇到的 URL,这样会造成 URL 队列无限制膨胀,无法终止,只能强行终止任务。尽管 Heritrix 也提供了一些抓取范围控制的类,但是根据实际测试经验,如果想要完全实现自己的抓取逻辑,仅仅靠 Heritrix 提供的抓取控制是不够的,只能修改扩展源代码。

下面本文以实现抓取北京林业大学(www.bjfu.edu.cn)下相关页面为例说明如何扩展 Heritrix 实现自己的抓取逻辑。

回页首

扩展 Heritrix

我们先来分析一下 Heritrix 的总体结构和 URI 的处理链。

Heritrix 的总体结构

Heritrix 采用了模块化的设计,用户可以在运行时选择要用的模块。它由核心类(core classes)和插件模块(pluggable modules)构成。核心类可以配置,但不能被覆盖,插件模块可以由第三方模块取代。所以我们就可以用实现了特定抓取逻辑的第三方模块来取代默认的插件模块,从而满足自己的抓取需要。

Heritrix 的整体结构如图 18 所示。其中 CrawlController(下载控制器)整个下载过程的总控制者,整个抓取工作的起点,决定整个抓取任务的开始和结束。每个 URI 都有一个独立的线程,它从边界控制器(Frontier)获取新的 URI,然后传递给 Processor chains(处理链)经过一系列 Processor(处理器)处理。

图 18. Heritrix 整体结构
 

URI 处理流程

处理链由多个处理器组成,共同完成对 URI 的处理,如图 19 所示。

图 19. URI 处理链
 

1)Pre-fetch processing chain( 预处理链 ),用来判断抓取时的一些先决条件,如 robot 协议、DNS 等。

2)Fetch processing chain(抓取处理链),解析网络传输协议,从远程服务器获取数据。

3)Extractor processing chain(抽取处理链),从网页中抽取新的 URL。

4)Write/index processing chain(写处理链),负责把数据写入本地磁盘。

5)Post-processing chain(后置处理链),在整个抓取解析过程结束后,进行一些扫尾工作,比如将前面 Extractor 解析出来的 URL 有条件的加入到待处理队列中去。这里我们只需要控制加入到待处理队列中的 URL,就可以控制抓取的范围。

扩展 FrontierScheduler 来抓取特定网站内容

FrontierScheduler 是 org.archive.crawler.postprocessor 包中的一个类,它的作用是将在 Extractor 中所分析得出的链接加入到 Frontier 中,以待继续处理。在该类的 innerProcess(CrawlURI) 函数中,首先检查当前链接队列中是否有一些属于高优先级的链接。如果有,则立刻转走进行处理;如果没有,则对所有的链接进行遍历,然后调用 Frontier 中的 schedule() 方法加入队列进行处理。其代码如图 20 所示。

图 20. FrontierScheduler 类中的 innerProcess() 和 schedule() 函数
 

从上面的代码可以看出 innerProcess() 函数并未直接调用 Frontier 的 schedule() 方法,而是调用自己内部的 schedule() 方法,进而在这个方法中再调用 Frontier 的 schedule() 方法。而 FrontierScheduler 的 schedule() 方法实际上直接将当前的候选链接不加任何判断地直接加入到抓取队列当中了。这种方式为 FrontierScheduler 的扩展留出了很好的接口。

这里我们需要构造一个 FrontierScheduler 的派生类 FrontierSchedulerForBjfu,这个类重载了 schedule(CandidateURI caUri) 这个方法,限制抓取的 URI 必须包含“bjfu”,以保证抓取的链接都是北林内部的地址。派生类 FrontierSchedulerForBjfu 具体代码如图 21 所示。

图 21. 派生类 FrontierSchedulerForBjfu
 

然后,在 modules 文件夹中的 Processor.options 中添加一行“org.archive.crawler.postprocessor.FrontierSchedulerForBjfu|FrontierSchedulerForBjfu”,这样在爬虫的 WebUI 中就可以选择我们扩展的 org.archive.crawler.postprocessor.FrontierSchedulerForBjfu 选项。如图 22 所示。

图 22. 用 FrontierSchedulerForBjfu 代替 FrontierScheduler
 

最终抓取的页面如图 23 所示,全部都是 http://www.bjfu.edu.cn下的页面。是不是很简单呢?当然,如果只是想实现这个抓取目标,不用修改源代码,通过在 Web UI 中设置抓取规则也可以满足要求。本文只是以此为例说明 Heritrix 如何扩展 Heritrix。

图 23. 扩展后的抓取效果
 

回页首

常见问题

1. Access restriction 错误

错误信息:

Access restriction: The type FileURLConnection is not accessible due to restriction on required library C:\Program Files\Java\jdk1.6.0_20\jre\lib\rt.jar,如图 24 所示。

图 24. Access restriction 错误
 

解决方案:

这是 JRE 的访问限制导致报错,在 MyHeritrix 工程上右键单击选择“Build PathConfigure Build Path …”,然后选择 Library 选项卡,将“JRE System Library”删除然后重新导入一下即可修复。或者选择“WindowsPreferencesJavaCompilerErrors/Warnings”找到“Deprecated and restricted API”下的“Forbidden reference (access rules)”,将默认设置“Error”改为“Warning”或“Ignore”。

2. NullPointerException 的错误

错误信息如图 25 所示:

图 25. NullPointerException 错误
 

解决方案:

这个错误的原因是缺少了“tlds-alpha-by-domain.txt”文件,在 heritrix-1.14.4-src\src\resources\org\archive\util 下可以找到该文件,将其拷贝到 MyHeritrix\src\org\archive\util 中即可。

3. Modules 界面无法改变选择项

错误信息如图 26 所示。

图 26. Modules 界面无法改变选择项
 

解决方案:

这是因为没有添加运行时所需的配置文件,参照本文“4. 配置运行方式”为 Classpath 添加参数即可。

回页首

注意事项

Heritrix 属于多线程下载爬虫,在公司内网使用有抓取限制。

回页首

总结

在搜索引擎的开发过程中,使用一个优秀的爬虫来获得所需要的网页信息是第一步,也是整个系统成功的关键。Heritrix 是一个功能强大而且高效的爬虫,具有良好的可扩展性。本文介绍了它在 windows 下 Eclipse 中的配置运行以及扩展,使您可以以最快的速度上手使用 Heritrix,享受您的爬虫之旅。

参考资料

学习

讨论

关于作者

郭艳芬,北京林业大学信息学院硕士研究生,现在 IBM FileNet Records Manager 组实习,研究兴趣包括测试技术、搜索引擎等。

时间: 2024-10-26 12:17:39

利用 Heritrix 构建特定站点爬虫的相关文章

利用GoAhead构建嵌入式web应用

1 简介 廉价的硬件,功能强大的32操作系统,以及无处不在的因特网,它们一起促成了网络应用和设备的飞速增长.大量的设备连接到网络上,于是人们希望通过一种通用.熟悉.快捷的方式来访问和控制它们.嵌入式web服务器正好迎合了这种需求,它们嵌入在网络设备之中,使用标准的浏览器就可以远程访问和控制它们. 然而,并不是所有的web服务器都可以担当如此重任,我们需要的是一个强大,安全,标准的,而且最好是久经考验的嵌入式web服务器.这里将要介绍的GoAhead嵌入式web服务器能够满足所有这些需求,包括西门

在Eclipse下利用gradle构建系统

简介:构建系统时候常常要用到 Ant, Maven 等工具,对于初学者来说,它们还是过于复杂,上手还 是需要时间的.本文将向读者介绍一种全新的构建项目的方式 gradle,它简单.上手快,能大大节省项 目的时间和成本. 在 eclipse 下利用 gradle 构建系统 基本开发环境 操作系统:本教程使用的为 Windows Vista Enterprise, 如果您的系统是 Linux 的,请选择下载对 应版本的其他工具,包括开发工具.Java EE 服务器.Apache Ant.SoapUI

利用keepalived构建高可用MySQL-HA

介绍利用keepalived构建高可用MySQL-HA,保证两台MySQL数据的一致性,然后用keepalived实现虚拟IP,通过keepalived自带的服务监控功能来实现MySQL故障时自动切换. AD: 关于MySQL-HA,目前有多种解决方案,比如heartbeat.drbd.mmm.共享存储,但是它们各有优缺点.heartbeat.drbd配置较为复杂,需要自己写脚本才能实现MySQL自动切换,对于不会脚本语言的人来说,这无疑是一种脑裂问题:对于mmm,生产环境中很少有人用,且mmm

利用OpenVSwitch构建多主机Docker网络

本文讲的是利用OpenVSwitch构建多主机Docker网络,[编者的话]当你在一台主机上成功运行Docker容器后,信心满满地打算将其扩展到多台主机时,却发现前面的尝试只相当于写了个Hello World的入门程序,多主机的网络设置成了下一道门槛.在你尝试各种方案时不妨先看看本文,或许就会豁然开朗,发现原来也不复杂.嗯,是的,本文用到了OpenVSwitch. 运行Docker已经不是什么新鲜事,网上有很多入门教程来帮助你在一台主机上运行容器.这台主机可以是Linux服务器,也可以是Mac(

ASP.NET MVC3 SEO优化:利用Routing特性提高站点权重_实用技巧

简介 我们在开发互联网程序的时候,有个很重要的事情就是做搜索引擎优化(SEO),我们都知道ASP.NET MVC程序提供了友好的URL以及永久重定向的支持,这些友好的URL是利用Routing系统的特性来支持的,但是在这个Routing里有个问题,就是多个不同的地址和指向同一个action方法,那对于搜索引擎来说就意味着你的站点有很多地址的内容都是重复的. 本章内容将展示如果解决这一问题. 正文 对于SEO,一个地址对应一个唯一独立的内容是保证最好权重的一个重要步骤,所以我们需要确保每一个URL

利用VS2005构建针对DB2的应用程序和Web站点

在本文中,讲述利用 IBM tooling for Visual Studio 2005 构建针对 DB2的Windows 应用程序和Web 站点.本文讲述如何依照 Visual Studio 2005 中引入的最新的简单范型来构建此类应用程序和Web 站点. 前提条件 在开始构建应用程序和Web 站点之前,请确保已执行了以下步骤: 下载并安装 IBM Database Add-ins for Visual Studio 2005.有关下载和安装说明,请访问 developerWorks Inf

利用JSP建立Web站点

js|web|站点 JSP是由Sun微系统公司于1999年6月推出的一项技术,是基于JavaServlet以及整个java体系的Web开发技术,利用这一技术可以建立先进.安全和跨平台的动态网站. JSP 与ASP非常相似.两者都提供在HTML 代码中混合某种程序代码.由语言引擎解释执行程序代码的能力.在ASP或JSP 环境下,HTML代码主要负责描述信息的显示样式,而程序代码则用来描述处理逻辑.ASP下的编程语言是 VBScript 之类的脚本语言,而JSP 使用的是Java. TRS及其Jav

浅谈如何合理利用手头数据进行站点推广分析

笔者曾看过许多关于优化的速成秘籍文章,对此类文章笔者的感触也很深,笔者认为优化并不存在速成,而是一个循序渐进的过程.期间我们需要根据不同时期放映出来的数据进行网站的分析及调整我们优化的步伐.需要我们不停的分析和调整需要不断的进行观察和调整.以此来获得更好的发展.我们手中的数据其实很多,但是往往我们都不能合理的利用这一些数据.下文中笔者给大家分享如何合理利用手头数据进行网站优化分析. 一.从长尾关键词的排名情况分析网站结构 网站的SEO都离不开长尾关键词,长尾关键词的存在与排名表面上可以为网站带来

在windows下利用apache配置WEB站点

windows中利用IIS虽然可以建立WEB站点,也比较简单,但安全性是值得考虑的.对于一些对安全要求比较高的WEB站点,可以利用apache(windows环境下)软件来建立 .此文中以apache_2.2.4-win32-x86为例来安装.配置WEB站点. 一:安装apache ·首先打开安装文件apache_2.2.4-win32-x86-no_ssl.msi,按照一下步骤开始安装.