由于下载速度太慢,打算重载QueueAssignmentPolicy这个类,并重写它的getClassKey()这个方法,网上的代码有:
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);
}
但是重写后怎么才能用呢?这个问题我研究了一上午。
这个类的作用是在Frontier为线程提供链接的时候提供链接队列的分配策略(默认是org.archive.crawler.frontier.HostnameQueueAssignmentPolicy这个类来提供)由于一般是选用BdbFrontier,(但是BdbFrontier中没有)-->查看父类WorkQueueFrontier(也没有)-->查看父类AbstractFrontier(发现了
public final static String ATTR_QUEUE_ASSIGNMENT_POLICY =
"queue-assignment-policy";
并在其构造方法中发现了对此变量引用的足迹
// Read the list of permissible choices from heritrix.properties.
// Its a list of space- or comma-separated values.
//通过“ ATTR_QUEUE_ASSIGNMENT_POLICY”(queue-assignment-policy)获得此键的属性
String queueStr = System.getProperty(AbstractFrontier.class.getName() +
"." + ATTR_QUEUE_ASSIGNMENT_POLICY,
HostnameQueueAssignmentPolicy.class.getName() + " " +
IPQueueAssignmentPolicy.class.getName() + " " +
BucketQueueAssignmentPolicy.class.getName() + " " +
SurtAuthorityQueueAssignmentPolicy.class.getName() + " " +
TopmostAssignedSurtQueueAssignmentPolicy.class.getName());
//
Pattern p = Pattern.compile("\\s*,\\s*|\\s+");
//通过正在表达式切分改String,返回一个String数组
String [] queues = p.split(queueStr);
if (queues.length <= 0) {
throw new RuntimeException("Failed parse of " +
" assignment queue policy string: " + queueStr);
}
//创建一个SimpleType加入到definitionMap中
/*具体方法体为:
public Type addElementToDefinition(Type type) {
if (isInitialized()) {
throw new IllegalStateException(
"Elements should only be added to definition in the " +
"constructor.");
}
if (definitionMap.containsKey(type.getName())) {
definition.remove(definitionMap.remove(type.getName()));
}
definition.add(type);
definitionMap.put(type.getName(), type);
return type;
}
*/
t = addElementToDefinition(new SimpleType(ATTR_QUEUE_ASSIGNMENT_POLICY,
"Defines how to assign URIs to queues. Can assign by host, " +
"by ip, and into one of a fixed set of buckets (1k).",
queues[0], queues));
其注释也清楚的说明了
//Read the list of permissible choices from heritrix.properties
查看heritrix.properties
#####################################################
# FRONTIER
#####################################################
# List here all queue assignment policies you'd have show as a
# queue-assignment-policy choice in AbstractFrontier derived Frontiers
# (e.g. BdbFrontier).
org.archive.crawler.frontier.AbstractFrontier.queue-assignment-policy =
org.archive.crawler.frontier.HostnameQueueAssignmentPolicy
org.archive.crawler.frontier.IPQueueAssignmentPolicy
org.archive.crawler.frontier.BucketQueueAssignmentPolicy
org.archive.crawler.frontier.SurtAuthorityQueueAssignmentPolicy
org.archive.crawler.frontier.TopmostAssignedSurtQueueAssignmentPolicy
org.archive.crawler.frontier.BdbFrontier.level = INFO
)进一步看
new SimpleType(ATTR_QUEUE_ASSIGNMENT_POLICY,
"Defines how to assign URIs to queues. Can assign by host, " +
"by ip, and into one of a fixed set of buckets (1k).",
queues[0], queues)
该方法最终继承至attribute并把
ATTR_QUEUE_ASSIGNMENT_POLICY,
queues[0]传入Attribute构造方法中。queues[0]即为org.archive.crawler.frontier.HostnameQueueAssignmentPolicy。
由以上论述分析可知:
如果想重写QueueAsignmentPolicy,yournameQueueAsignmentPolicy放到
String queueStr = System.getProperty(AbstractFrontier.class.getName() +
"." + ATTR_QUEUE_ASSIGNMENT_POLICY,
yourname
QueueAsignmentPolicy.class.getName(0+""+
HostnameQueueAssignmentPolicy.class.getName() + " " +
IPQueueAssignmentPolicy.class.getName() + " " +
BucketQueueAssignmentPolicy.class.getName() + " " +
SurtAuthorityQueueAssignmentPolicy.class.getName() + " " +
TopmostAssignedSurtQueueAssignmentPolicy.class.getName());
在heritrix.propertits中修改如下
#############################################################################
# FRONTIER
#############################################################################
# List here all queue assignment policies you'd have show as a
# queue-assignment-policy choice in AbstractFrontier derived Frontiers
# (e.g. BdbFrontier).
org.archive.crawler.frontier.AbstractFrontier.queue-assignment-policy = userP.myQueueAssignmentPolicy
org.archive.crawler.frontier.HostnameQueueAssignmentPolicy
org.archive.crawler.frontier.IPQueueAssignmentPolicy
org.archive.crawler.frontier.BucketQueueAssignmentPolicy
org.archive.crawler.frontier.SurtAuthorityQueueAssignmentPolicy
org.archive.crawler.frontier.TopmostAssignedSurtQueueAssignmentPolicy
org.archive.crawler.frontier.BdbFrontier.level = INFO
思路是这样...
分享到:
相关推荐
2. **线程模型**:Heritrix3使用多线程处理,每个线程负责处理一个URL,这样可以实现并行抓取,提高抓取效率。同时,它还具备自动调度功能,以防止对目标网站造成过大的压力。 3. **配置管理**:Heritrix3通过XML...
3. **多线程处理**:Heritrix支持多线程爬取,能同时处理多个连接,提高了爬取效率,尤其是在处理大量网页时。 4. **元数据管理**:Heritrix能够收集并存储关于抓取内容的元数据,如HTTP响应头、网页编码、抓取时间...
2. **多线程处理**:Heritrix使用多线程来并行处理多个URL,提高了抓取效率。这使得它能够在短时间内处理大量网页。 3. **内容处理**:Heritrix不仅仅抓取HTML,还支持各种Web内容类型,如图片、PDF、XML等,并可以...
例如,Heritrix采用多线程设计,每个组件如fetcher、parser和archiver都在自己的线程中运行,以实现高并发性和高效能。此外,源码还可能包含详细的注释,解释了如何配置和扩展Heritrix。 在学习和使用Heritrix时,...
Heritrix是一个强大的开源网络爬虫工具,专用于大规模网页抓取。它的设计目标是提供高度可配置性和扩展性,以适应各种复杂的抓取任务。本文将深入解析Heritrix的架构及其增量抓取的实现策略。 Heritrix的架构主要...
3. **多线程与并发**:Heritrix 3.2 支持多线程和并发处理,可以同时处理多个HTTP请求,提高抓取效率。通过调整线程池参数,用户可以根据网络状况和服务器负载优化抓取速度。 4. **数据存储与处理**:Heritrix 内置...
- **多线程处理**:Heritrix 使用多线程模型,高效地并发处理多个网页抓取任务。 - **内容解析**:Heritrix 支持多种网页格式,包括HTML、XML、PDF等,能解析并提取出有价值的信息。 - **存储与归档**:抓取的...
Heritrix的灵活性和可扩展性使其成为大规模网页抓取任务的理想选择。用户可以根据实际需求定制各种策略和模块,以满足不同的数据收集和分析目的。然而,理解和掌握Heritrix的内部机制,如线程管理、数据结构和算法,...
- **内容处理**:除了抓取网页,Heritrix还可以处理各种类型的内容,如图片、视频、PDF等,且支持多种数据存储格式,如WARC(Web ARChive)。 - **错误处理**:内置错误处理机制,可以记录并处理抓取过程中遇到的...
Heritrix是按多线程方式抓取的爬虫,主线程把任务分配给Teo线程(处理线程),每个Teo线程每次处理一个URL。Teo线程对每个URL执行一遍URL处理器链。URL处理器链包括如下5个处理步骤。整个流程都在图2.1中。 (1)预取链...
3. **多线程处理**:Heritrix采用多线程并行抓取,提高爬取效率。 4. **协议支持**:Heritrix支持HTTP、HTTPS等多种网络协议,以及FTP、RTSP等其他协议。 5. **内容处理**:Heritrix可以对抓取的网页进行预处理,...
3. **多线程处理**:Heritrix使用多线程技术并行处理任务,提高了爬取效率,能够快速抓取大量网页。 4. **支持多种格式**:Heritrix可以处理HTML、XML、PDF等多种格式的网页,同时支持对JavaScript渲染的内容进行...
8. **多线程和并发控制**:Heritrix支持多线程爬取,同时可以通过设置并发控制参数来避免对目标服务器造成过大的负担。 9. **国际化**:Heritrix支持多语言环境,能够处理不同语言的网页内容。 10. **社区支持**:...
2. **Heritrix**: Heritrix是互联网档案馆开发的一款可配置、可扩展的网络抓取工具,用于抓取网页并保存为离线副本。它具有强大的URL管理和处理机制,可以遵循robots.txt规则,支持深度优先和广度优先的抓取策略,...
1. **多线程机制**:Heritrix利用多线程技术提高网页抓取效率。其中,ToePool是一个标准的线程库,用于管理所有的工作线程,确保爬虫能够并行处理多个网页抓取任务。 2. **CrawlController**:这是Heritrix的核心...
3. **多线程处理**:Heritrix支持并行抓取,能充分利用多核处理器的性能,提高爬取效率。 4. **URL管理**:内置URL队列管理器,确保无重复抓取,同时支持URL去重和优先级设置。 5. **多种格式支持**:Heritrix不仅...
3. **多线程抓取**:利用多线程技术提高抓取效率。 4. **合规性**:遵循Robots协议,尊重网站的访问规则。 5. **可扩展性**:支持插件机制,方便用户添加自定义功能。 6. **强大的社区支持**:拥有活跃的开发者社区...