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<str.length();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
前提:抓取同一个主题
---------------------------------------------------------------------------------优化前(针对同一个主题)------------------------------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------优化后----------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------优化后(针对同一个主题)--------------------------------------------------------------------------------------------------------