Heritrix 初步优化
一. 应用ELFHash 算法优化开启线程策略
0. 在默认的情况下,Heritrix使用HostnameQueueAssignmentPolicy来产生key值,而这个策略是用hostname作为key值的,因此一个域名下的所有链接都会被放在同一个线程中去。如果对Heritrix分配URI时的策略进行改进,利用ELFHash“可执行链接格式”(Executable and Linking Format,即ELF)算法把url尽量平均分布到各个队列中去,就能用较多的线程同时抓取一个域名下的网页,速度将得到大大的提高。具体算法介绍请到算法分类查看。
1. 复制org.archive.crawler.frontier.HostnameQueueAssignmentPolicy 更名为org.archive.crawler.frontier.ELFHashQueueAssignmentPolicy。添加方法:
private long ELFHash(String str){
long hash=0;
long x=0;
for(inti=0;i hash = (hash <<4 )+str.charAt(i);
if((x= hash &0xF000000L) != 0){
hash ^= x>>24;
hash &= ~x;
}
}
return hash& 0x7FFFFFFFL;
}
然后在71行的else分支替换成:
String uri = cauri.getUURI().toString();
long key =ELFHash(uri);
candidate= String.valueOf(key%100); //控制好一百条以内的线程
2. 替换获取key的策略
在org.archive.crawler.frontier.AbstractFrontier293行 替换更改的类
在heritrix.properties 也替换更改的类,每次换行均要加“\”等号后面黑色字体是无效。
org.archive.crawler.frontier.AbstractFrontier.queue-assignment-policy= org.archive.crawler.frontier.ELFHashQueueAssignmentPolicy \
org.archive.crawler.frontier.IPQueueAssignmentPolicy \
org.archive.crawler.frontier.BucketQueueAssignmentPolicy \
org.archive.crawler.frontier.SurtAuthorityQueueAssignmentPolicy \
org.archive.crawler.frontier.TopmostAssignedSurtQueueAssignmentPolicy
3. 修改判断爬虫是否考虑robots协议的抓取
在org.archive.crawler.prefetch.PreconditionEnforcer的considerRobotsPreconditions方法,改为return false。
4. 重新建立job。不能用已经存在的job。因为之前当新建一个job 的时候会把相关的配置记录(不仅仅是前端显示的配置)在jobs的order.xml中。所以,当你用已经存在的job复制出新的job会出现异常:
2015-12-0910:46:46.024 警告 thread-10org.archive.crawler.settings.CrawlSettingsSAXHandler.handleValueError() Valuenot in legal values list
Attribute: 'frontier:queue-assignment-policy'
Value: 'org.archive.crawler.frontier.AbstractFrontier'
File: 'file:/F:/lucene/myheritrix/jobs/souhu2-20151209103025046/order.xml',line: 79, column: 100
5.效果展示:
前提:抓取同一个主题
---------------------------------------------------------------------------------优化前(针对同一个主题)------------------------------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------优化后----------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------优化后(针对同一个主题)--------------------------------------------------------------------------------------------------------