ImageVerifierCode 换一换
格式:DOCX , 页数:26 ,大小:79.49KB ,
资源ID:2290643      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/2290643.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(系统程序设计说明书.docx)为本站会员(b****3)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

系统程序设计说明书.docx

1、系统程序设计说明书系统程序设计说明书景德镇陶瓷学院1 Heritrix的架构 1.1 抓取任务CrawlOrder CrawlOrder是整个抓取工作的起点。在上一节中已经说过,一次抓取任务包括许多的属性,建立一个任务的方式有很多种,最简单的一种就是根据默认的order.xml来配置。在内存中,order使用CrawlOrder这个类来进行表示。看一下API文档中CrawlOrder的继承关系图。 CrawlOrder继承自一系列的与属性设置相关的基类,它的最顶层基类是javax.management.Attribute,这是一个JMX中的类,它可以动态的反映出Java容器内某个MBean的属

2、性变化。CrawlOrder中的属性,是需要被随时读取和监测的。 在org.archive.crawler.settings包下有一个XMLSettingsHandler类,它可以用来帮助读取order.xml。 public XMLSettingsHandler(File orderFile) throws InvalidAttributeValueException 在XMLSettingsHandler的构造函数中,其所传入的参数orderFile正是一个经过对象封装的order.xml的File。这样,就可以直接调用其构造函数,来创建一个XMLSettingsHandler的实例,以此

3、做为一个读取order.xml的工具。 当一个XMLSettingsHandler的实例被创建后,可以通过getOrder()方法来获取CrawlOrder的实例,这样也就可以进行下一步的工作了。 1.2 中央控制器CrawlController 中央控制器是一次抓取任务中的核心组件。它将决定整个抓取任务的开始和结束。CrawlController位于org.archive.crawler.framework中,在它的Field声明中,看到如下代码片段。 代码1 / key subcomponents which define and implement a crawl in progress

4、 private transient CrawlOrder order; private transient CrawlScope scope; private transient ProcessorChainList processorChains; private transient Frontier frontier; private transient ToePool toePool; private transient ServerCache serverCache; / This gets passed into the initialize method. private tra

5、nsient SettingsHandler settingsHandler; 可以看到,在CrawlController类中,定义了以下几个组件: CrawlOrder:这就不用说了,因为一个抓取工作必须要有一个Order对象,它保存了对该次抓取任务中,order.xml的属性配置。 CrawlScope:这是决定当前的抓取范围的一个组件。 ProcessorChainList:从名称上很明显就能看出,它表示了处理器链。 Frontier:很明显,一次抓取任务需要设定一个Frontier,以此来不断为其每个线程提供URI。 ToePool:这是一个线程池,它管理了所有该抓取任务所创建的子线程

6、。 ServerCache:这是一个缓存,它保存了所有在当前任务中,抓取过的Host名称和Server名称。 以上组件应该是一次正常的抓取过程中所必需的几项,它们各自的任务很独立,分工明确,但在后台中,它们之间却有着千丝万缕的联系,彼此互相做为构造函数或初始化的参数传入。 那么,究竟该如何获得CrawlController的实例,并且通过自主的编程来使用Heritrix提供的API进行一次抓任务呢? 事实上CrawlController有一个不带参数的构造函数,开发者可以直接通过它的构造函数来构造一个CrawlController的实例。但是值得注意的一点,在构造一个实例并进行抓取任务时,有几

7、个步骤需要完成: (1)首先构造一个XMLSettingsHandler对象,将order.xml内的属性信息装入。 (2)调用CrawlController的构造函数,构造一个CrawlController的实例。 (3)调用CrawlController的intialize(SettingsHandler)方法,初始化CrawlController实例。其中,传入的参数是在第一步是构造的XMLSettingsHandler实例。 (4)当上述3步完成后,CrawlController就已经具备运行的条件,可以开始运行了。此时,只需调用它的requestCrawlStart()方法,就可以启

8、运线程池和Frontier,然后就可以开始不断的抓取网页了。 使用CrawlController启动抓取任务 在CrawlController的initialize()方法中,Heritrix主要做了以下几件事: (1)从XMLSettingsHandler中取出Order。 (2)检查了用户设定的UserAgent等信息,看是否符合格式。 (3)设定了开始抓取后保存文件信息的目录结构。 (4)初始化了日志信息的记录工具。 (5)初始化了使用Berkley DB的一些工具。 (6)初始化了Scope、Frontier以及ProcessorChain。 (7)最后实例化了线程池。 在正常情况下,

9、以上顺序不能够被随意变动,因为后一项功能的初始化很有可能需要前几项功能初始化的结果。例如线程池的初始化,必须要在先有了Frontier的实例的基础上来进行。读者可能对其中的Berkeley DB感到费解,在后面的小节将详细说明。 最终启动抓取工作的是requestCrawlStart()方法。其代码如下。 代码2 public void requestCrawlStart() / 初始化处理器链 runProcessorInitialTasks(); / 设置一下抓取状态的改变,以便能够激发一些Listeners / 来处理相应的事件 sendCrawlStateChangeEvent(STA

10、RTED, CrawlJob.STATUS_PENDING); String jobState; state = RUNNING; jobState = CrawlJob.STATUS_RUNNING; sendCrawlStateChangeEvent(this.state, jobState); / A proper exit will change this value. this.sExit = CrawlJob.STATUS_FINISHED_ABNORMAL; / 开始日志线程 Thread statLogger = new Thread(statistics); statLogg

11、er.setName(StatLogger); statLogger.start(); / 启运Frontier,抓取工作开始 frontier.start(); 可以看到,启动抓取工作的核心就是要启动Frontier(通过调用其start()方法),以便能够开始向线程池中的工作线程提供URI,供它们抓取。 下面的代码就是BdbFrontier的父类AbstractFrontier中的start()方法和unpause()方法: 代码3 public void start() if (Boolean)getUncheckedAttribute(null, ATTR_PAUSE_AT_START

12、) .booleanValue() / 若配置文件中不允许该次抓取开始 / 则停止 controller.requestCrawlPause(); else / 若允许开始,则开始 unpause(); synchronized public void unpause() / 去除当前阻塞变量 shouldPause = false; / 唤醒所有阻塞线程,开始抓取任务 notifyAll(); 在start()方法中,首先判断配置中的属性是否允许当前线程开始。若不允许,则令controller停止抓取。若允许开始,则简单的调用unpause()方法。unpause()方法更为简单,它首先将阻

13、塞线程的信号量设为false,即允许线程开始活动,然后通过notifyAll()方法,唤醒线程池中所有被阻塞的线程,开始抓取。Frontier链接制造工厂 Frontier在英文中的意思是“前线,领域”,在Heritrix中,它表示一种为线程提供链接的工具。它通过一些特定的算法来决定哪个链接将接下来被送入处理器链中,同时,它本身也负责一定的日志和状态报告功能。 事实上,要写出一个合格并且真正能够使用的Frontier绝非一件简单的事情,尽管有了Frontier接口,其中的方法约束了Frontier的行为,也给编码带来了一定的指示。但是其中还存在着很多问题,需要很好的设计和处理才可以解决。 在H

14、eritrix的官方文档上,有一个Frontier的例子,在此拿出来进行一下讲解,以此来向读者说明一个最简单的Frontier都能够做什么事。以下就是这个Frontier的代码。 代码4 public class MyFrontier extends ModuleType implements Frontier, FetchStatusCodes / 列表中保存了还未被抓取的链接 List pendingURIs = new ArrayList(); / 这个列表中保存了一系列的链接,它们的优先级 / 要高于pendingURIs那个List中的任何一个链接 / 表中的链接表示一些需要被满足的

15、先决条件 List prerequisites = new ArrayList(); / 一个HashMap,用于存储那些已经抓取过的链接 Map alreadyIncluded = new HashMap(); / CrawlController对象 CrawlController controller; / 用于标识是否一个链接正在被处理 boolean uriInProcess = false; / 成功下载的数量 long successCount = 0; / 失败的数量 long failedCount = 0; / 抛弃掉链接的数量 long disregardedCount = 0; / 总共下载的字节数 long totalProcessedBytes = 0; / 构造函数 public MyFrontier(String name) super(Frontier.ATTR_NAME, A simple frontier.);

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1