Heritrix
Heritrix是一个爬虫框架,可加如入一些可互换的组件。
它的执行是递归进行的,主要有以下几步:
1。在预定的URI中选择一个。
2。获取URI
3。分析,归档结果
4。选择已经发现的感兴趣的URI。加入预定队列。
5。标记已经处理过的URI
Heritrix主要有三大部件:范围部件,边界部件,处理器链
范围部件:主要按照规则决定将哪个URI入队。
边界部件:跟踪哪个预定的URI将被收集,和已经被收集的URI,选择下一个 URI,剔除已经处理过的URI。
处理器链:包含若干处理器获取URI,分析结果,将它们传回给边界部件
Heritrix的其余部件有:
WEB管理控制台:大多数都是单机的WEB应用,内嵌JAVA HTTP 服务器。
操作者可以通过选择Crawler命令来操作控制台。
Crawler命令处理部件:包含足够的信息创建要爬的URI。
Servercache(处理器缓存):存放服务器的持久信息,能够被爬行部件随时查到,包括IP地址,历史记录,机器人策略。
处理器链:
预取链:主要是做一些准备工作,例如,对处理进行延迟和重新处理,否决随后的操作。
提取链:主要是获得资源,进行DNS转换,填写请求和响应表单
抽取链:当提取完成时,抽取感兴趣的HTML,JavaScript,通常那里有新的也适合的URI,此时URI仅仅被发现,不会被评估
写链:存储爬行结果,返回内容和抽取特性,过滤完存储。
提交链:做最后的维护,例如,测试那些不在范围内的,提交给边界部件
Heritrix 1.0.0包含以下关键特性:
1.用单个爬虫在多个独立的站点一直不断的进行递归的爬。
2。从一个提供的种子进行爬,收集站点内的精确URI,和精确主机。
3。主要是用广度优先算法进行处理。
4。主要部件都是高效的可扩展的
5。良好的配置,包括:
a。可设置输出日志,归档文件和临时文件的位置
b。可设置下载的最大字节,最大数量的下载文档,和最大的下载时间。
c。可设置工作线程数量。
d。可设置所利用的带宽的上界。
e。可在设置之后一定时间重新选择。
f。包含一些可设置的过滤机制,表达方式,URI路径深度选择等等。
Heritrix的局限:
1。单实例的爬虫,之间不能进行合作。
2。在有限的机器资源的情况下,却要复杂的操作。
3。只有官方支持,仅仅在Linux上进行了测试。
4。每个爬虫是单独进行工作的,没有对更新进行修订。
5。在硬件和系统失败时,恢复能力很差。
6。很少的时间用来优化性能。
在本地配好了一个heritrix,建了一个job爬了一个网站的URL,生成一个mirror文件夹,里面是爬到的镜像文件。然后我写了个lucence的demo,把目标文件夹定为那个mirror文件夹,然后开始递归地建立索引。可是效率MS不怎么高,有的一个子文件夹就要5 6分钟,请问heritrix爬下来的文件是不是要经过某些处理才开始建立索引啊?
heritrix是要优化和定制过的,具体的方法是重新一个方法,将抓取的网页按要求用正则表达式匹配好,然后再用lucence建立索引,那样效率就提高了
heritrix安装使用
1)下载heritrix-1.14.3-src.zip
2)解压,并在eclipse3.2中配置heritrix工程
3)jdk1.5及以上,compliance level 1.5及以上
4)文件配置如下,将src/conf和src/webapps目录放到工程目录下面
5)修改conf目录下面的heritrix.properties文件,两个地方:
@VERSION@ 改为 1.14.3
heritrix.cmdline.admin = 改为 heritrix.cmdline.admin = admin:xxm
heritrix.cmdline.port = 改为 heritrix.cmdline.port = 8080
6)将conf目录下面的modules目录放到src/java目录下面
7)运行heritrix.java文件即可运行heritrix
8)heritrix的最大特定就是,抓取内容可定制,所以主要是自编两个类
继承Extractor,实现extractor方法,对网页的特定内容进行抓取
继承 FrontierScheduler,复写 schedule方法,抓取到的链接等放入到抓取列表
9)特别注意,如果自己实现Extractor类,那么必须实现构造函数
构造函数(String name) {
this(name, "***");
}
如果不实现这个构造函数,那么就会报如下错误
java.lang.reflect.InvocationTargetException
到此heritrix已经可以启动,并且可以定制自己的抓取任务了。接下来就是找个项目来试验如何抓取网页内容,并且如果结合lucene来实现垂直搜索引擎。
heritrix详细配置
1 下载 和 解压
从http://crawler.archive.org/下载解压到本地 E:/heritrix-1.14.3
2 配置环境变量
HERITRIX_HOME=E:/heritrix-1.14.3
path后追加 ;%HERITRIX_HOME%/bin
3 配置 heritrix
拷贝E:/heritrix-1.14.3/conf/jmxremote.password.template到E:/heritrix-1.14.3下
并从命名为jmxremote.password
修改E:/heritrix-1.14.3/conf下的heritrix.properties 文件
用UrltraEditor或其他的文本编辑工具打开,找到 heritrix.cmdline.admin =
admin是空的 这是登陆heritrix UI的用户名和密码 格式为 username:password
heritrix.cmdline.admin = admin:admin
heritrix.cmdline.port = 8080 配置端口 为了不和tomcat的8080端口冲突我改为8888
用winrar 打开E:/heritrix-1.14.3下的heritrix-1.14.jar文件,将其目录中的profiles文件夹拷到
E:/heritrix-1.14.3/conf目录下即完成heritrix的配置
(用些网友说要将jmxremote.password文件的属性改为只读,我不知道为什么?,官方文档里也没说)
4 启动heritrix
开始 -》运行 -》cmd 打开cmd端口
输入heritrix --admin=admin:admin
--admin heritrix的启动参数 必须的*
弹出一个Heritrix窗口 打印。。。。。。。。。。。。。Heritrix version: 1.14.3
cmd窗口打印出
2009-04-15 星期三 10:42:03.04 Starting heritrix
Heritrix 1.14.3 is running.
Web console is at: http://127.0.0.1:8888
Web console login and password: admin/admin
表示启动完成
5 抓取任务
用浏览器打开http://127.0.0.1:8888 输入用户名和密码
选Jobs选项, 在Create New Job 下选择 With defaults 子项
Create new crawl job based on default profile
Name of new job 和Description 随便写
Seeds 填写要抓取的网站 http://www.verycd.com/ (必须以/结尾)
单击Modules 按钮
Select Modules and Add/Remove/Order Processors
从上而下,可以看到,需要配置的内容共有7项
1.CrawlScope
CrawlScope用于配置当前应该在什么范围内抓取网页链接。比如,如果选择BroadScope,则表示当前
抓 取的范围不受限制,但如果选择了HostScope,则表示抓取的范围在当前的Host内。
选择 org.archive.crawler.scope.BroadScope 单击change按钮即可
2.URI Frontier
URI Frontier是一个URL的处理器,它将决定下一个被处理的URL是什么。同时,它还会将经由处理器
链所解析出来的URL加入到等待处理的队列中去。在例子中,使用BdbFrontier类来做为处理器,全权
掌管URL的分配
选择 org.archive.crawler.frontier.BdbFrontier 单击change按钮即可
3.Pre Processors
这个队列中,所有的处理器都是用来对抓取时的一些先决条件做判断的。比如判断robot.txt的信息等
,它是整个处理器链的入口
选择org.archive.crawler.prefetch.Preselector 和
org.archive.crawler.prefetch.PreconditionEnforcer 两项 (在下拉列表中选择好,点击Add添加即可
)
4.Fetcher:从名称上看,它用于解析网络传输协议,比如解析DNS、HTTP或FTP等
选择org.archive.crawler.fetcher.FetchDNS
org.archive.crawler.fetcher.FetchHTTP 两个单击Add添加
5.Extractors
它主要用是于解析当前获取到的服务器返回内容,这些内容通常是以字符串形式缓存的。在这个队列中
,包括了一系列的工具,如解析HTML、CSS等。在解析完毕,取出页面中的URL后,将它们放入队列中,等
待下次继续抓取
org.archive.crawler.extractor.ExtractorHTTP
org.archive.crawler.extractor.ExtractorHTML
org.archive.crawler.extractor.ExtractorCSS
org.archive.crawler.extractor.ExtractorJS
org.archive.crawler.extractor.ExtractorSWF
6.Writers
Writers主要是用于将所抓取到的信息写入磁盘。通常写入磁盘时有两种形式,一种是采用压缩的方式写
入,在这里被称为Arc方式,另一种则采用镜象方式写入。当然处理起来,镜象方式要更为容易一些。
默认的是Arc方式 点击旁边的Remove 删除 在下拉框中选择
org.archive.crawler.writer.MirrorWriterProcessor 单击Add添加
7 Post Processors
在整个抓取解析过程结束后,进行一些扫尾的工作,比如将前面Extractor解析出来的URL有条件的加入
到待处理队列中去
org.archive.crawler.postprocessor.CrawlStateUpdater
org.archive.crawler.postprocessor.LinksScoper
org.archive.crawler.postprocessor.FrontierScheduler 单击Add添加
【在设置时,可以看见在队列的右侧总是有“Up”、“Down”和“Remove”这样的操作是因为在处理器链
的设置过程中,每一个队列中的处理器都是要分先后顺序的】
设置运行时的参数
在设置完处理链后,选择Jobs菜单的“Settings”项进入运行参数设置页面 . 进入运行参数设置页面
后,有很多可以设定的参数,对于需要了解详情的设置,请点击设置框左边的“?”号,可看到弹出的帮
助信息。这里只要更改 “HTTP-Header”项中的内容,更改其属性值user-agent和 from
其中user-agent中的 PROJECT_URL_HERE 对应自己的完整URL地址,(http://192.168.16.128)
from中设置自己的合法email地址 只需是格式正确的邮件地址就可以
@VERSION@是设置heritrix的版本 填上1.14.3
user-agent Mozilla/5.0 (compatible; heritrix/1.14.3 +http://192.168.16.128)
设置完成后单击“Submit job”链接 会回到Job是页面
显示了“Job created”,这表示刚才所设置的抓取任务已经被成功的建立。同时,在下面的“Pending
Jobs”一栏,可以清楚的看到刚刚被创建的Job,它的状态目前为“Pending”。
最后启动这个任务。回到“Console”界面上,可以看到刚刚创建的任务已经显示了出来,等待我们开始
它。
单击面版中的“Start”链接,就会将此时处于“Pending”状态的抓取任务激活,令其开始抓取
此时,面版中出现了一条抓取状态栏,它清楚的显示了当前已经被抓取的链接数量
抓取完毕后在E:/heritrix-1.14.3/目录下生成以个jobs目录
进入jobs 可以看到 verycd-20090415024225919 其中verycd就是job的名称
进去 里面有一个mirror目录 是因为在前面设置了Writer的类型为MirrorWriter
里面每一个站点的URL地址即为保存的目录名称
至此 heritrix抓取任务就到此结束...
heritrix的配置和抓取任务的创建
今天折腾了半天,终于把Heritrix配置好了,真是太不容易了,要把这个过程写下来。
配置:
1.下载heritrix-1.14.3: http://sourceforge.net/projects/archive-crawler/files/archive-crawler%20%28heritrix%201.x%29/1.14.3/heritrix-1.14.3.zip/download
2.解压到D:/dev/heritrix-1.14.3
3.把heritrix-1.14.3.jar解压并把里面的profiles文件夹拷到conf下
4.修改conf目录下的heritrix.properties为
heritrix.cmdline.admin = admin:admin(表示用户名和密码都是admin,用:分开)
heritrix.cmdline.port = 8080
4.把conf目录下的jmxremote.password.template另存为jmxremote.password并移动到D:/dev/heritrix-1.14.3目录下
5.设置环境变量:
在系统变量里新建 HERITRIX_HOME=D:/dev/heritrix-1.14.3
并在系统变量的path后添加;%HERITRIX_HOME%/bin
6.在命令行下输入heritrix --admin=admin:admin启动heritrix。
抓取任务的创建:
1.在地址栏输入http://localhost:8080出现heritrix,说明已经启动成功。输入用户名和密码并登陆。
2.点击“Jobs”标签页,会出现:
Create New Job
Based on existing job
Based on a recovery
Based on a profile
With defaults
第一次创建就选"With defaults",输入Name of new job, Description ,seeds的地址,seeds的地址要特别注意,比如http://news.sohu.com/(最后那个/是必须的),如果要输入多个url,可以用回车隔开,也就是每行一个url。
3.点下面的“modules"设置Writers,把默认的ARCWriterProcessor删除,添加MirrorWriterProcessor。
4.点“settings”设置 http-headers(这是非常非常重要的一点,当时折磨了我一个多小时,都快崩溃了,不过关键是我没好好利用起我那本书,要不然就不至于这么惨烈)
给个例子吧,就全明白了:
user-agent:IE/7.0 (compatible; heritrix/1.14.3 +http://10.2.21.240)
from:[email protected]
最重要的是user-agent中http前的那个+号,我就因为它一直没跑通,from中填写email地址,只要是email格式的就行
5.最后点击“submit job”就完成了job的创建
6.点“Console”中的start就能开始抓取任务,然后我们就可以在Job Status看到任务的执行情况。
Heritrix导入eclipse总结:
很长时间就想试试这个强大的爬虫了,但是经过多次在命令行里按照网上的各位大侠的方法都失败,不知道为什么,今天还试了一下1.12.1和1.14.1两个版本的,都是提示密码文件的要设成单用户并只读,我已经如此设置了安全标签,但仍不能解决问题,所以决定在Eclipse里面试一下,多次失败后,终于成功启动了Heritrix!
下面简要列一下,其实很简单:
1、在Eclipse下新建一个项目。(哪一个版本应该无所谓吧,JDK1.5);
2、将1.14.1版的Heritrix两个.zip文件下载并解压到临时目录(heritrix-1.14.1-src.zip和heritrix-1.14.1.zip);
3、从第一个zip文件解压目录下/src/java复制三个文件夹(包):org、com、st到项目中的src上;
4、从第一个zip文件解压目录下/src/conf复制所有文件夹及文件到项目根目录中(可能有不需要的文件);
5、从第一个zip文件解压目录下/src/resourses复制所有文件夹及文件到项目根目录中(可能有不需要的文件);
6、从第二个zip文件解压目录下复制webapps目录到项目根目录中;
7、把项目下Heritrix.properties文件复制到/src目录下(实践中发现);
8、在项目上鼠标右键->构建路径->添加外部归档 找到任意一个解压的目录下的lib文件夹,选中文件夹中的所有包;
9、从第一个zip文件解压目录下/src/conf/下的profiles文件夹复制到Eclipse工作空间所在分区的根目录;
10、配置Heritrix.properties,主要配置四项:如下红色部分所示
##############################################################################
# HERITRIX PROPERTIES
##############################################################################
# Properties with prefixes 'heritrix.', 'org.archive.', or 'system.' prefix
# get copied into System.properties on startup so available via
# System.getProperties. (For 'system.' properties, that prefix is stripped.
# (See Heritrix.loadProperties()).
# Version is filled in by the maven.xml pregoal. It copies here the project
# currentVersion property.
heritrix.version = 1.14.1
# Location of the heritrix jobs directory.
heritrix.jobsdir = jobs
# Default commandline startup values.
# Below values are used if unspecified on the command line.
heritrix.cmdline.admin = admin:admin
heritrix.cmdline.port = 8088
heritrix.cmdline.run = false
heritrix.cmdline.nowui = false
heritrix.cmdline.order =
heritrix.cmdline.jmxserver = false
heritrix.cmdline.jmxserver.port = 8081
##############################################################################
# LOGGING
##############################################################################
11、在Eclipse下启动Heritrix,找到项目src下的org.archive.crawler包下的主类Heritrix.java鼠标右键->运行方式->java项目,即可启动Heritrix!
启动后,Eclipse状态栏信息如下:
08:32:15.468 EVENT Starting Jetty/4.2.23
08:32:15.734 WARN!! Delete existing temp dir C:/DOCUME~1/ycf/LOCALS~1/Temp/Jetty_127_0_0_1_8088__ for WebApplicationContext[/,jar:file:/E:/projects/eclipse_workspace/Heritrix1.14.1/webapps/admin.war!/]
08:32:16.171 EVENT Started WebApplicationContext[/,Heritrix Console]
08:32:16.609 EVENT Started SocketListener on 127.0.0.1:8088
08:32:16.609 EVENT Started org.mortbay.jetty.Server@137c60d
Heritrix version: 1.14.1
上面的包的复制都在直接在Eclipse里面的项目上直接进行的,这样可以减少修改Eclipse的项目配置文件。
参考文献:
http://yeniu040209.javaeye.com/blog/356743
http://hi.baidu.com/z57354658/blog/item/32f936ea0d62d4d9d439c960.html
http://www.javaeye.com/topic/262753
http://daisy8564.javaeye.com/blog/473370