关于heritrix扩展QueueAssignmentPolicy产生的问题

sole 2008-05-25
一般来说,heritrix应用HostnameQueueAssignmentPolicy,一个host对应一个抓取队列。每个队列每时刻只产生一个抓取线程,以对网站文明的抓取。但是我们对少数几个网站采集时,这样做采集速度未免也太慢了。于是有人用ELF hash算法把url尽量平均分部到各个队列中去:
 
public class ELFHashQueueAssignmentPolicy extends 
 QueueAssignmentPolicy {
 private static final Logger logger = Logger
 .getLogger(ELFHashQueueAssignmentPolicy .class.getName());
 /**
 * 
 */
 public String getClassKey(CrawlController controller, 
 CandidateURI cauri) {
 String uri = cauri.getUURI().toString();
 long hash = ELFHash(uri);
 String a = Long.toString(hash % 100);
 return a;
 }
 public long ELFHash(String str)
 {
  long hash = 0;
  long x = 0;
  for(int i = 0; i < str.length(); i++)
  {
    hash = (hash << 4) + str.charAt(i);
    if((x = hash & 0xF0000000L) != 0)
    {
      hash ^= (x >> 24);
      hash &= ~x;
    }
  }
  return (hash & 0x7FFFFFFF);
 }
 
}


可是这样做又会产生几个问题:
1. 对采集网站同时发起几个连接,大大影响网站的性能,你的IP有可能会被封哦。
2. 对一个host抓取时,每个队列会预先进行DNS和robots解析,他们一般位于队列的最前面。如果同一个Host的url分布到多个队列,会产生多个相同的DNS或ROBOTS请求。
richiewlq 2008-08-04
很想知道这个问题有没有解决
同一网站的单线程也太慢了,
还有就是加入这个扩展 我的heritrix怎么老是出错,怎么配置的能否详细说明?

Exception:   org.archive.crawler.framework.exceptions.FatalConfigurationException: java.lang.ClassNotFoundException: org.archive.crawler.frontier.BigwroldQueueAssignmentPolicy
Cause: java.lang.RuntimeException: java.lang.ClassNotFoundException: org.archive.crawler.frontier.BigwroldQueueAssignmentPolicy
at org.archive.crawler.frontier.AbstractFrontier.getQueueAssignmentPolicy(AbstractFrontier.java:1077)
at org.archive.crawler.frontier.WorkQueueFrontier.initialize(WorkQueueFrontier.java:303)
at org.archive.crawler.frontier.BdbFrontier.initialize(BdbFrontier.java:409)
at org.archive.crawler.framework.CrawlController.setupCrawlModules(CrawlController.java:672)
at org.archive.crawler.framework.CrawlController.initialize(CrawlController.java:378)
at org.archive.crawler.admin.CrawlJob.setupForCrawlStart(CrawlJob.java:848)
at org.archive.crawler.admin.CrawlJobHandler.startNextJobInternal(CrawlJobHandler.java:1142)
at org.archive.crawler.admin.CrawlJobHandler$3.run(CrawlJobHandler.java:1125)
at java.lang.Thread.run(Unknown Source)

imjl 2008-08-04
引用

2. 对一个host抓取时,每个队列会预先进行DNS和robots解析,他们一般位于队列的最前面。如果同一个Host的url分布到多个队列,会产生多个相同的DNS或ROBOTS请求。


我想也许你可以,,,每个host都取一个队列,后面的判断该host是否解析过。
凤凰山 2009-04-21
大哥,该 问题搞定了么?
fffddgx 2009-04-27
这么久了,搞定了没,兄弟也遇到这个问题。。。
eimhee 2010-07-26
heritrix默认是用HOST当KEY, 一个网站只会用一个线程去跑, 这样能降低服务器的消耗, 并能减少爬虫被封的危险
java_wzf 2010-08-28
到底现在是怎么处理的呢?  
java_wzf 2010-08-28
到底现在是怎么处理的呢? 
geogre 2010-10-02
ELFHashQueueAssignmentPolicy extends   
QueueAssignmentPolicy
可以在代码中加入对robot的判断,我的扩展能实现1个host指定多少个线程去抓
lord_is_layuping 2011-07-17
eimhee 写道
heritrix默认是用HOST当KEY, 一个网站只会用一个线程去跑, 这样能降低服务器的消耗, 并能减少爬虫被封的危险


这样也太慢了啊,有没有人做过动态交换代理的方法啊?
Global site tag (gtag.js) - Google Analytics