网络爬虫heritrixWord文档格式.docx
- 文档编号:22224073
- 上传时间:2023-02-03
- 格式:DOCX
- 页数:15
- 大小:85.42KB
网络爬虫heritrixWord文档格式.docx
《网络爬虫heritrixWord文档格式.docx》由会员分享,可在线阅读,更多相关《网络爬虫heritrixWord文档格式.docx(15页珍藏版)》请在冰豆网上搜索。
为管理员密码。
如:
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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 网络 爬虫 heritrix