网络爬虫heritrixWord文档格式.docx

上传人:b****8 文档编号:22224073 上传时间:2023-02-03 格式:DOCX 页数:15 大小:85.42KB
下载 相关 举报
网络爬虫heritrixWord文档格式.docx_第1页
第1页 / 共15页
网络爬虫heritrixWord文档格式.docx_第2页
第2页 / 共15页
网络爬虫heritrixWord文档格式.docx_第3页
第3页 / 共15页
网络爬虫heritrixWord文档格式.docx_第4页
第4页 / 共15页
网络爬虫heritrixWord文档格式.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

网络爬虫heritrixWord文档格式.docx

《网络爬虫heritrixWord文档格式.docx》由会员分享,可在线阅读,更多相关《网络爬虫heritrixWord文档格式.docx(15页珍藏版)》请在冰豆网上搜索。

网络爬虫heritrixWord文档格式.docx

为管理员密码。

如:

monitorRole 

controlRoleadmin

e、打开“运行”, 

将cmd定位到E:

\heritrix\bin下,执行"

heritrix--admin=admin:

admin"

命令,即可启动heritrix。

f、Heritrix默认端口是8080,需要保证系统端口没有冲突,然后可以访问 

http:

//127.0.0.1:

8080或http:

//localhost:

8080/ 

使用 

heritrix 

提供的WUI,即Web管理端。

并使用"

admin/admin"

登录。

可能会出现的异常:

在Dos下可能是这样显示:

JMXpasswordfileismissingorpermissionnotsetcorrectly.

原因是heritrix启动时找不到heritrix的.Jar包,即heritrix-1.14.4.jar。

你就要看你的E:

/Heritrix下有没有这个包,没有就加上,基本上是有的。

有的话,就看你的环境变量中是不是设置了HERITRIX_HOME环境变量,如果有,把它删除就解决了。

1.2在Eclipse中配置Heritrix

a、新建空的java项目(注意不是WEB项目),命名为heritrix;

b、把heritrix-1.14.4-src\src\java\目录下的org、st和com文件夹拷贝到heritrix/src目录下;

 

c、把heritrix-1.14.4-src下的wbapps文件夹拷贝到heritrix目录下;

d、右击heritrix项目,点击properties,通过JavaBuildPath,将heritrix-1.14.4-src下的lib目录下的所有包导入进来;

e、解压缩heritrix-1.14.4目录下的heritrix-1.14.4.jar文件,把解压后的所有文件和文件夹(除org、st、com文件夹和heritrix.properties文件外)拷贝到heritrix目录下;

f、将heritrix-1.14.4目录下的conf文件夹拷贝到heritrix目录下;

并将heritrix目录下的profiles文件夹移入conf文件夹中;

g、打开eclipse下的heritrix/conf/heritrix.properties文件,找到"

heritrix.cmdline.admin="

修改为“heritrix.cmdline.admin=admin:

admin”;

h、Conf/jmxremote.password.template拷贝到heritrix目录下。

改名为:

jmxremote.password,最后再行改成:

monitorRole 

admin

controlRole 

i、找到org.archive.crawler包,运行Heritrix.java中的main函数。

成功提示信息为:

09:

14:

07.406EVENT 

StartingJetty/4.2.23 

07.656EVENT 

StartedWebApplicationContext[/,HeritrixConsole] 

07.750EVENT 

StartedSocketListeneron127.0.0.1:

8082 

Started 

org.mortbay.jetty.Server@179c285 

Heritrixversion:

1.14.4

1、在Heritrix.java中出现FileURLConnection红叉;

解决办法:

将compiler属性中的Errors/warring中的Forbidden....选为warrning即可。

2、出现的异常:

......thread-10org.archive.util.ArchiveUtils.<

linit>

()TLDlist....

将\heritrix-1.14.4-src\heritrix-1.14.4\src\resources\org\archive\util下的文本文档拷贝到heritrix中的org\archive\util下;

3、在eclipse中可以启动heritrix,但在jobs->

modules.jsp页面中没有添加(“Add”)按扭,且再现以下异常。

致使错误:

“无法编译样式表”

严重 

thread-12org.archive'

crawler.framework.WriterPodProcessor.io.arc.......

将heritrix项目中的modulse的上一级目录文件添加到eclipse的classpath中。

(或者将modulse文件夹移到src文件夹中)

2、创建和终止一个新的抓取任务

2.1创建一个新任务

Heritrix成功运行后,输入账号密码登录,然后需要创建一个新的抓取任务,步骤如下:

a、进入Heritrix控制台页面后,选择Jobs选项卡,有四种选择方式,只试用了第4种方式,点击Withdefaults。

b、设置作业的名字,填写描述(随意填入字符),将种子设置为要抓取的网站主页,如:

用户在使用时,也可以同时输入多个种子,每个URL地址单独写在一行上。

c、单击Modules,定制为此次任务设置各个处理模块,其中需要配置的共有7项。

试用时大部分采用默认,主要修改 

SelectWriters项默认的是Arc方式点击旁边的Remove删除,在下拉框中选择:

org.archive.crawler.writer.MirrorWriterProcessor,并单击Add按钮。

d、单击Settings,这里只需要修改两个地方:

(1)user-agent:

改为Mozilla/5.0(compatible;

heritrix/1.14.3+http:

//116.56.142.15)

//116.56.142.15可以更换为任意的一个完整的url。

(2)from:

改为test@ 

test@可更换为任意的Email地址,不需要设置真实的,只需是格式正确的邮件地址就可以了。

e、单击Submitjob提交作业会回到Job页面,显示了“Jobcreated”,这表示刚才所设置的抓取任务已经被成功的建立。

同时,在下面的“PendingJobs”一栏,可以清楚的看到刚刚被创建的Job,它的状态目前为“Pending”。

f、单击Console,回到控制台页面,可以看到刚刚创建的任务。

g、单击Start即可开始抓取作业,刷新一下,即可看到运行状态。

h、Heritrix运行以后,可以在Heritrix项目文件夹下看到jobs文件夹,打开之后可以看到qq-20100920091730687,再进去有个mirror文件夹即可看到抓取的内容。

2.2终止抓取或终止Heritrix的运行 

当用户进行某个抓取任务时,有两种方法会让任务停止下来。

1)正常终止 

是任务的自然结束,其条件为所有队列中的URI都已经被处理过了。

此时,任务将自然终止。

在“Jobs”面版上会看到任务已经完成,被加入到“Completedjobs”列表中。

2)强行终止 

有时候对任务的控制不够,结果抓取了太多不相关的信息,进而造成URL队列无限制膨胀,无法终止。

在这种情况下,就需要强行将任务终止。

在Console面版上有一排链接,最后一个“Terminate”链接,就是用来终止当前运行的任务。

单击“Terminate”链接后,当前在运行的抓取任务就会立即终止,并同样将任务放置到“Jobs”面版上的“Completedjobs”列表中,只不过在“status”上,它会显示“Finished-Endedbyoperator”这样的提示。

如果用户希望关闭Heritrix,并终止所有正在运行的任务,也可以单击Console面版上的“ShutdownHeritrixsoftware”的链接,此时,Heritrix会弹出一个警告,告诉你如果关闭Heritrix,则当前一切正在运行的任务都将被终止。

如果选择“I’msure,shutitdown”,则Heritrix的WebUI将会终止,虚拟机进程结束。

3、Heritrix的架构

Heritrix采用了模块化的设计,它由一些核心类和可插件模块构成。

核心类可以配置,但不能被覆盖,插件模块可以被由第三方模块取代。

Heritrix自己的包有48个,还有它导入的第三方包也有30多个。

3.1heritrix的体系结构图:

3.2架构分析

1)CrawlController(中央控制器)

中央控制器是一次抓取任务中的核心组件。

它将决定整个抓取任务的开始和结束。

CrawlController位于org.archive.crawler.framework中。

在CrawlController类中,定义了以下几个组件:

CrawlOrder:

它是整个抓取工作的起点,因为一个抓取工作必须要有一个Order对象,它保存了对该次抓取任务中order.xml的属性配置。

CrawlScope:

这是决定当前的抓取范围的一个组件。

ProcessorChainList:

它表示了处理器链

Frontier:

一次抓取任务需要设定一个Frontier,以此来不断为其每个线程提供URI。

ToePool:

这是一个线程池,它管理了所有该抓取任务所创建的子线程。

ServerCache:

这是一个缓存,它保存了所有在当前任务中,抓取过的Host名称和Server名称。

以上组件应该是一次正常的抓取过程中所必需的几项,它们各自的任务很独立,分工明确,但在后台中,它们之间却有着千丝万缕的联系,彼此互相做为构造函数或初始化的参数传入。

CrawlController有一个不带参数的构造函数,可以直接通过它的构造函数来构造一个CrawlController的实例。

在构造一个实例并进行抓取任务时,有几个步骤需要完成:

(1)首先构造一个XMLSettingsHandler对象,将order.xml内的属性信息装入。

(2)调用CrawlController的构造函数,构造一个CrawlController的实例。

(3)调用CrawlController的intialize(SettingsHandler)方法,初始化CrawlController实例。

其中,传入的参数是在第一步是构造的XMLSettingsHandler实例。

(4)当上述3步完成后,CrawlController就已经具备运行的条件,可以开始运行了。

此时,只需调用它的requestCrawlStart()方法,就可以启运线程池和Frontier,然后就可以开始不断的抓取网页了。

在CrawlController的initialize()方法中,Heritrix主要做了以下几件事:

(1)从XMLSettingsHandler中取出Order。

(2)检查了用户设定的UserAgent等信息,看是否符合格式。

(3)设定了开始抓取后保存文件信息的目录结构。

(4)初始化了日志信息的记录工具。

(5)初始化了使用BerkleyDB的一些工具。

(6)初始化了Scope、Frontier以及ProcessorChain。

(7)最后实例化了线程池。

在正常情况下,以上顺序不能够被随意变动,因为后一项功能的初始化很有可能需要前几项功能初始化的结果。

例如线程池的初始化,必须要在先有了Frontier的实例的基础上来进行。

最终启动抓取工作的是requestCrawlStart()方法

publicvoidrequestCrawlStart(){

//初始化处理器链

runProcessorInitialTasks();

//设置一下抓取状态的改变,以便能够激发一些Listeners

//来处理相应的事件

sendCrawlStateChangeEvent(STARTED,CrawlJob.STATUS_PENDING);

StringjobState;

state=RUNNING;

jobState=CrawlJob.STATUS_RUNNING;

sendCrawlStateChangeEvent(this.state,jobState);

//Aproperexitwillchangethisvalue.

this.sExit=CrawlJob.STATUS_FINISHED_ABNORMAL;

//开始日志线程

ThreadstatLogger=newThread(statistics);

statLogger.setName("

StatLogger"

);

statLogger.start();

//启运Frontier,抓取工作开始

frontier.start();

}

启动抓取工作的核心就是要启动Frontier(通过调用其start()方法),以便能够开始向线程池中的工作线程提供URI,供它们抓取。

2)Frontier链接制造工厂

在Heritrix中,它表示一种为线程提供链接的工具。

它通过一些特定的算法来决定哪个链接将接下来被送入处理器链中,负责访问的均衡处理,避免对某一web服务器造成太大的压力。

同时,它本身也负责一定的日志和状态报告功能。

它保存着crawl的状态:

(1)发现的URI(URIshavebeendiscovered)

(2)正在被处理的URI(URIsarebeingprocessed(fetched))

(3)已经处理的URI(URIshavebeenprocessed)

在Frontier代码中,使用了两个ArrayList来保存链接。

其中,第一个pendingURIs保存的是等待处理的链接,第二个prerequisites中保存的也是链接,只不过它里面的每个链接的优先级都要高于pendingURIs里的链接。

通常,在prerequisites中保存的都是如DNS之类的链接,只有当这些链接被首先解析后,其后续的链接才能够被解析。

除了这两个ArrayList外,Frontier还有一个名称为alreadyIncluded的HashMap。

它用于记录那些已经被处理过的链接。

每当调用Frontier的schedule()方法来加入一个新的链接时,Frontier总要先检查这个正要加入到队列中的链接是不是已经被处理过了。

很显然,在分析网页的时候,会出现大量相同的链接,如果没有这种检查,很有可能造成抓取任务永远无法完成的情况。

同时,在schedule()方法中还加入了一些逻辑,用于判断当前要进入队列的链接是否属于需要优先处理的,如果是,则置入prerequisites队列中,否则,就简单的加入pendingURIs中即可。

Frontier中还有两个关键的方法,next()和finished(),这两个方法都是要交由抓取的线程来完成的。

Next()方法的主要功能是:

从等待队列中取出一个链接并返回,然后抓取线程会在它自己的run()方法中完成对这个链接的处理。

而finished()方法则是在线程完成对链接的抓取和后续的一切动作后(如将链接传递经过处理器链)要执行的。

它把整个处理过程中解析出的新的链接加入队列中,并且在处理完当前链接后,将之加入alreadyIncluded这个HashMap中去。

3)TeoThread(处理线程)

想要更有效更快速的抓取网页内容,则必须采用多线程。

Heritrix中提供了一个标准的线程池ToePool,它用于管理所有的抓取线程。

每一个URI被一个ToeThread处理。

ToePool和ToeThread都位于org.archive.crawler.framework包中。

ToePool的初始化,是在CrawlController的initialize()方法中完成的。

它调用了父类java.lang.ThreadGroup的构造函数,同时,将注入的CrawlController赋给类变量,从而建立了一个线程池实例。

线程池本身在创建的时候,并没有任何活动的线程实例,只有当它的setSize方法被调用时,才有可能创建新线程;

如果当setSize方法被调用多次而传入不同的参数时,线程池会根据参数里所设定的值的大小,来决定池中所管理线程数量的增减。

当线程被启动后,所执行的是其run()方法中的片段。

该方法显示了工作线程是如何从Frontier中取得下一个待处理的链接,然后对链接进行处理,并调用Frontier的finished方法来收尾、释放链接,最后清理缓存、终止单步工作等。

另外,其中还有一些日志操作,主要是为了记录每次抓取的各种状态。

其中,通过processCrawlUri()方法,真正调用处理链来对链接进行处理的代码。

4)Processor(处理器)

许多Processor组成一个处理链(processorchains)中,每一个处理链对URI进行一系列的处理。

下图为处理器的整个结构图

aPre-fetchprocessingchain(预处理链)

主要根据robot协议,DNS以及下载范围控制信息判断当前URI是否应当处理。

bFetchprocessingchain(抓取处理链)

从远程服务器获取数据

cExtractorprocessingchain(抽取处理链)

从网页中抽取新的URI

dWrite/indexprocessingchain(写处理链)

负责把数据写入本地磁盘

ePost-processingchain(后置处理链)

由CrawlStateUpdater,LinksScoper,FrontierScheduler构成。

为了很好的表示整个处理器链的逻辑结构,以及它们之间的链式调用关系,Heritrix设计了几个API来表示这种逻辑结构。

org.archive.crawler.framework.Processor

org.archive.crawler.framework.ProcessorChain

org.archive.crawler.framework.ProcessorChainList

1.Processor类

该类代表着单个的处理器,所有的处理器都是它的子类。

在Processor类中有一个process()方法,它被标识为final类型的,也就是说,它不可以被它的子类所覆盖。

方法的含义很简单。

即首先检查是否允许这个处理器处理该链接,如果允许,则检查当前处理器所自带的过滤器是否能够接受这个链接。

当过滤器的检查也通过后,则调用innerProcess(curi)方法来处理,如果过滤器的检查没有通过,就使用innerRejectProcess(curi)方法处理。

其中innerProcess(curi)和innerRejectProcess(curi)方法都是protected类型的,且本身没有实现任何内容。

很明显它们是留在子类中,实现具体的处理逻辑。

不过大部分的子类都不会重写innerRejectProcess(curi)方法了,这是因为反正一个链接已经被当前处理器拒绝处理了,就不用再有什么逻辑了,直接跳到下一个处理器继续处理就行了。

2.ProcessorChain类

该类表示一个队列,里面包括了同种类型的几个Processor。

例如,可以将一组的Extractor加入到同一个ProcessorChain中去。

在一个ProcessorChain中,有3个private类型的类变量:

privatefinalMapTypeprocessorMap;

privateProcessorChainnextChain;

privateProcessorfirstProcessor;

其中,processorMap中存放的是当前这个ProcessorChain中所有的Processor。

nextChain的类型是ProcessorChain,它表示指向下一个处理器链的指针。

而firstProcessor则是指向当前队列中的第一个处理器的指针。

3.ProcessorChainList

从名称上看,它保存了Heritrix一次抓取任务中所设定的所有处理器链,将之做为一个列表。

正常情况下,一个ProcessorChainList中,应该包括有5个Pro

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 学习计划

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

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