关于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是否解析过。 |

