关于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, 一个网站只会用一个线程去跑, 这样能降低服务器的消耗, 并能减少爬虫被封的危险
这样也太慢了啊,有没有人做过动态交换代理的方法啊? |