Heritrix 初步优化(应用ELFHash优化线程数量)

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

5.效果展示:

前提:抓取同一个主题

---------------------------------------------------------------------------------优化前(针对同一个主题)------------------------------------------------------------------------------------------------------------------

 

Heritrix 初步优化(应用ELFHash优化线程数量)_第1张图片




-------------------------------------------------------------------------------------------优化后----------------------------------------------------------------------------------------------------------

Heritrix 初步优化(应用ELFHash优化线程数量)_第2张图片

Heritrix 初步优化(应用ELFHash优化线程数量)_第3张图片



 

 

 

 

 

 

 

 

 

 

 

 

 

 

---------------------------------------------------------------------------------------优化后(针对同一个主题)--------------------------------------------------------------------------------------------------------



 

你可能感兴趣的:(Heritrix 初步优化(应用ELFHash优化线程数量))