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

摘要

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

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

本文在已经简单分析过heritrix的工作流程,模块划分的基础上,在本地主机搭建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 bases on analysis of work process, module division of heritrix. Then
build the environment of heritrix, at last uses heritrix to fetch the specific
web pages and analyzes the result.

Key words: heritrix; web crawler; source
code analysis; focused crawl

一、引言

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

网络爬虫工具Heritrix是由面向对象的程序设计语言java开发的,开源的网络爬虫工具包,它的程序执行速度之快是传统搜索引擎无法企及的。作为一个专为互联网网页进行存档而开发的网页检索器,开发者可利用其出色可扩展性来实现自己的抓取逻辑。虽然 Heritrix 功能强大,但其配置复杂,而且官方只在 Linux 系统上测试通过,用户难以上手。

本文在深入分析核心,然后在本地对该系统构建环境进行测试,详细介绍 Heritrix 在 windows 下 Eclipse 中的配置运行,并对其进行简单扩展,实现自己定义的搜索逻辑,最后对整个结果进行测试分析。

二、Window系统下Heritrix环境的搭建

2.1配置环境说明

  • 系统环境:Windows7
  • IDE工具:Eclipse
  • 本次用到的版本是Heritrix1.14.4,由于开源,可以从SourceForge(http://sourceforge.net/projects/archive-crawler/files/
    )上获取。下载zip文件来在windows平台使用

2.2在Eclipse中的配置

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

  • 导入类库

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 …”

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

设置完成后如图 2.1 所示:

图 2.1. 导入类库 - 导入后

  • 拷贝源代码

  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 工程目录层次如图 2.2所示。这里运行 Heritrix 所需的源代码等已经准备完备,下面需要修改配置文件并添加运行参数。

图 2.2 MyHeritrix 工程的目录层次

  • 修改配置文件

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

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

  • 配置运行文件

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

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

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

图 2.5. 添加配置文件

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

三、创建网页抓取任务

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

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

  在浏览器中输入 http://localhost:8080,会打开Web UI 登录界面。

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

图3.2.
Heritrix 控制台

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

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

图 3.3. 创建抓取任务

Based on existing job:以一个已经有的抓取任务为模板生成新的抓取任务。

Based on a recovery:在以前的某个任务中,可能设置过一些状态点,新的任务将从这个设置的状态点开始。

Based on a profile:专门为不同的任务设置了一些模板,新建的任务将按照模板来生成。

With defaults:这个最简单,表示按默认的配置来生成一个任务。

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

  首先点击“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 有条件地加入到待处理的队列中去。这里我们使用默认值。

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

“@VERSION@”字符串需要被替换成 Heritrix 的版本信息。

“PROJECT_URL_HERE”可以被替换成任何一个完整的 URL 地址。

“from”属性中不需要设置真实的 E-mail 地址,只要是格式正确的邮件地址就可以了。

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

图 3.4. 设置 Settings

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

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

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

图 3.5. 抓取到的网页

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

四、扩展Heritrix实现自定义抓取任务

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

  FrontierScheduler

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

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

  这里我们需要构造一个 FrontierScheduler 的派生类 FrontierSchedulerForZju,这个类重载了 schedule(CandidateURI caUri)
这个方法,限制抓取的 URI
必须包含“zju”,以保证抓取的链接都是浙江大学内部的地址。派生类
FrontierSchedulerForZju 具体代码如下:

package org.archive.crawler.postprocessor;

import org.archive.crawler.datamodel.CandidateURI;

public class FrontierSchedulerForZju extends FrontierScheduler {

    private static final long serialVersionUID = 1L;

    public FrontierSchedulerForZju(String name) {
super(name);
}
//重载schedule方法
protected void schedule(CandidateURI caUri) {
String uri = caUri.toString();
//设置抓取规则:URI中包含有zju的抓取
if (uri.contains("zju")) {
System.out.println(uri);
getController().getFrontier().schedule(caUri);
}
}
}

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

  最终的抓取页面如图4.1所示,可以看出,抓取到的页面都是zju内部的URI,与第一次的抓取结果相比,多余的无关的URI已经全部排除。这样简单的一个扩展类就实现了简单的抓取目标。当然还可以在扩展类里添加更多的抓取规则,获取更精确更有意义的抓取结果。

图4.1 第二次抓取任务结果

五、小结

  目前,搜索引擎技术越来越受关注,其应用领域也越来越广。在搜索引擎的开发过程中,使用一个优秀的爬虫来获得所需要的网页信息是第一步,也是整个系统成功的关键。本文首先详细介绍了在Windows环境用Eclipse配置Heritrix的方法,配置成功后,实现第一个抓取任务。然后对控制类进行扩展。实现一个面向特定主题的抓取任务。

  文中所设计的面向特定主题的网络爬虫的扩展应用,可针对某一特定主题快速搜集数据,并且该方法具有通用性,易于移植到其他网站上应用,例如可为电子商务的数据挖掘准备数据源。

参考文献

[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. 基于Nutch+Hadoop+Hbase+ElasticSearch的网络爬虫及搜索引擎

    基于Nutch+Hadoop+Hbase+ElasticSearch的网络爬虫及搜索引擎 网络爬虫架构在Nutch+Hadoop之上,是一个典型的分布式离线批量处理架构,有非常优异的吞吐量和抓取性能并 ...

  2. 一个大数据方案:基于Nutch+Hadoop+Hbase+ElasticSearch的网络爬虫及搜索引擎

    网络爬虫架构在Nutch+Hadoop之上,是一个典型的分布式离线批量处理架构,有非常优异的吞吐量和抓取性能并提供了大量的配置定制选项.由于网络爬虫只负责网络资源的抓取,所以,需要一个分布式搜索引擎, ...

  3. 【架构】基于Nutch+Hadoop+Hbase+ElasticSearch的网络爬虫及搜索引擎

    网络爬虫架构在Nutch+Hadoop之上,是一个典型的分布式离线批量处理架构,有非常优异的吞吐量和抓取性能并提供了大量的配置定制选项.由于网络爬虫只负责网络资源的抓取,所以,需要一个分布式搜索引擎, ...

  4. [原创]一款基于Reactor线程模型的java网络爬虫框架

    AJSprider 概述 AJSprider是笔者基于Reactor线程模式+Jsoup+HttpClient封装的一款轻量级java多线程网络爬虫框架,简单上手,小白也能玩爬虫, 使用本框架,只需要 ...

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

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

  6. Android网络爬虫程序(基于Jsoup)

    摘要:基于 Jsoup 实现一个 Android 的网络爬虫程序,抓取网页的内容并显示出来.写这个程序的主要目的是抓取海投网的宣讲会信息(公司.时间.地点)并在移动端显示,这样就可以随时随地的浏览在学 ...

  7. Heritrix工具实现网络爬虫

    上次用的java相关知识实现了一个简单的网络爬虫,现在存在许多开源免费的爬虫工具,相对来说,可以很简单的获取网页数据,并写入到本地. 下面我就阐述一下我用Heritrix爬虫工具实现网页数据爬取. - ...

  8. 网络爬虫——针对任意主题批量爬取PDF

    |本文为博主原创,转载请说明出处 任务需求:要求通过Google针对任意关键字爬取大量PDF文档,如K-means,KNN,SVM等. 环境:Anaconda3--Windows7-64位--Pyth ...

  9. 【java爬虫】---爬虫+基于接口的网络爬虫

    爬虫+基于接口的网络爬虫 上一篇讲了[java爬虫]---爬虫+jsoup轻松爬博客,该方式有个很大的局限性,就是你通过jsoup爬虫只适合爬静态网页,所以只能爬当前页面的所有新闻.如果需要爬一个网站 ...

随机推荐

  1. python列表推导式详解

    推导式是Python中很强大的.很受欢迎的特性,具有语言简洁,简化代码,速度快等优点.推导式包括:1.列表推导式2.字典推导式3.集合推导式4.嵌套列表推导式注意: 字典和集合推导是最近才加入到Pyt ...

  2. 英语学习APP—百词斩

    英语学习APP-百词斩 1.简介: 百词斩是由成都超有爱科技有限公司针对英语学习开发的一款"图背单词软件".软件为每一个单词提供了趣味的配图和例句,让记单词成为一种乐趣. 百词斩覆 ...

  3. Hook入门

    Hook入门 2014-07-24 基本概念 Windows消息机制 Hook(钩子) 运行机制 核心函数 C# hook示例 基本概念[1] Windows消息机制[5] Windows操作系统是建 ...

  4. zoj 3822 Domination (概率dp 天数期望)

    题目链接 参考博客:http://blog.csdn.net/napoleon_acm/article/details/40020297 题意:给定n*m的空棋盘 每一次在上面选择一个空的位置放置一枚 ...

  5. RIA技术

    Rich Internet Application(富互联网应用程序,简称RIA),一种全新的Web应用程序架构,它结合了桌面软件良好的用户体验和web应用程序易部署的优点,很快获得了企业的青睐. 近 ...

  6. 四、Emmet:快速编写HTML,CSS代码的有力工具

    介绍 Emmet是一个插件,在IDE中安装该插件后即可使用该功能. HTML代码写起来虽简单,但是重复代码很多,Emmet能够存在一种HTML代码简写法(比较类似CSS的选择器写法),比如 div.c ...

  7. BZOJ 4269 再见Xor

    线性基. 求次大值就是再异或一个线性基好了. #include<iostream> #include<cstdio> #include<cstring> #defi ...

  8. IOS中UICollectionView和UICollectionViewController的用法

    1.新建一个xib描述UICollectionViewCell(比如DealCell.xib),设置好resuse identifier(比如deal) 2.控制器继承UICollectionView ...

  9. 使用WINRAR来制作安装程序

    1. WINRAR版本 2. 将所有文件放在同一个文件夹下 3. 选中所有文件点击右键 -> Add to archive 4. General设置 5. Advanced 设置 6. 确定开始 ...

  10. rmmod 无法卸载模块问题

    用insmod加载驱动模块成功后,用rmmod无法卸载 解决方法:在板子上建立一个空目录:lib/modules/2.6.30.4/