1.添加了org.archive.crawler.frontier.ELFHashQueueAssignmentPolicy.java
引用
public class ELFHashQueueAssignmentPolicy extends QueueAssignmentPolicy {
private static final Logger logger = Logger
.getLogger(ELFHashQueueAssignmentPolicy.class.getName());
private static String DEFAULT_CLASS_KEY = "default...";
private static final String DNS = "dns";
/**
*
*/
@Override
public String getClassKey(CrawlController controller, CandidateURI cauri) {
String uri = cauri.getUURI().toString();
String scheme = cauri.getUURI().getScheme();
String candidate = null;
try {
if (scheme.equals(DNS)) {
if (cauri.getVia() != null) {
// Special handling for DNS: treat as being
// of the same class as the triggering URI.
// When a URI includes a port, this ensures
// the DNS lookup goes atop the host:port
// queue that triggered it, rather than
// some other host queue
UURI viaUuri = UURIFactory.getInstance(cauri.flattenVia());
candidate = viaUuri.getAuthorityMinusUserinfo();
// adopt scheme of triggering URI
scheme = viaUuri.getScheme();
} else {
candidate = cauri.getUURI().getReferencedHost();
}
} else {
// String uri = cauri.getUURI().toString();
long hash = ELFHash(uri);
candidate = Long.toString(hash % 100);
}
if (candidate == null || candidate.length() == 0) {
candidate = DEFAULT_CLASS_KEY;
}
} catch (URIException e) {
logger.log(Level.INFO,
"unable to extract class key; using default", e);
candidate = DEFAULT_CLASS_KEY;
}
return candidate.replace(':', '#');
}
public String getClassKey(String uri) {
// String uri = cauri.getUURI().toString();
long hash = ELFHash(uri);
String a = Long.toString(hash % 100);
return a;
}
public static 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);
}
public static void main(String args[]){
ELFHashQueueAssignmentPolicy el=new ELFHashQueueAssignmentPolicy();
String a=el.getClassKey("http://www.chinanews.com.cn/");
System.out.println(a);
}
}
2.修改了AbstractFrontier 类的AbstractFrontier方法
/**
* 自己添加修改的配置----------------------------
*/
String queueStr = System.getProperty(AbstractFrontier.class.getName() +
"." + ATTR_QUEUE_ASSIGNMENT_POLICY,
ELFHashQueueAssignmentPolicy.class.getName() + " " +
IPQueueAssignmentPolicy.class.getName() + " " +
BucketQueueAssignmentPolicy.class.getName() + " " +
SurtAuthorityQueueAssignmentPolicy.class.getName() + " " +
TopmostAssignedSurtQueueAssignmentPolicy.class.getName());
Pattern p = Pattern.compile("\\s*,\\s*|\\s+");
/**
* -----------------------------------------------
*/
3.修改了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.ELFHashQueueAssignmentPolicy 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
要新建一个job才有效,否则还是默认的HostnameQueueAssignmentPolicy
还有,有时候只是散列出30个DNS就关闭。
解决方法1,增加入口连接
2,对这个job重新建立以下with exist
因为heritrix1.14.4 默认认为你的站点是按每个域名来爬的, 修改成一个站点多个线程, 会有一定问题, 比如导致很多次执行同样的DNS。建议使用heritrix3, heritrix3能支持这个功能
分享到:
相关推荐
它的整体结构包括多个组件,协同工作以实现高效和可控的网页抓取。 配置和使用Heritrix主要包括以下几个步骤: 1. **安装与配置**:首先,从官方站点下载最新版本的Heritrix并解压缩。核心配置文件`heritrix....
3. **多线程与并发**:Heritrix 3.2 支持多线程和并发处理,可以同时处理多个HTTP请求,提高抓取效率。通过调整线程池参数,用户可以根据网络状况和服务器负载优化抓取速度。 4. **数据存储与处理**:Heritrix 内置...
Heritrix是按多线程方式抓取的爬虫,主线程把任务分配给Teo线程(处理线程),每个Teo线程每次处理一个URL。Teo线程对每个URL执行一遍URL处理器链。URL处理器链包括如下5个处理步骤。整个流程都在图2.1中。 (1)预取链...
3. **多线程处理**:Heritrix支持多线程爬取,能同时处理多个连接,提高了爬取效率,尤其是在处理大量网页时。 4. **元数据管理**:Heritrix能够收集并存储关于抓取内容的元数据,如HTTP响应头、网页编码、抓取时间...
5. **ToeThreads**:这是实际执行抓取工作的线程组,负责预处理、抓取、提取、写入/索引和后处理等步骤。每个抓取的URL都会经过这个处理链。 在抓取过程中,Frontier与Processor Chains形成了一个循环。Frontier将...
2. **线程模型**:Heritrix3使用多线程处理,每个线程负责处理一个URL,这样可以实现并行抓取,提高抓取效率。同时,它还具备自动调度功能,以防止对目标网站造成过大的压力。 3. **配置管理**:Heritrix3通过XML...
为了解决这个问题,可以使用如ELF哈希算法来平均分配URL到不同的队列,从而实现更有效的多线程同步。 在Heritrix系统中,爬取过程可以分为四个关键部分: 1. **Page Fetching**:这是从Frontier获取URI并处理的...
开发自己的搜索引擎是一项复杂且具有挑战性的任务,涉及信息检索、数据处理、网络爬虫等多个领域的知识。在这个过程中,Lucene 和 Heritrix 是两个非常关键的工具,它们分别在搜索引擎的构建中扮演着不同的角色。 ...
《Heritrix抓取指南》 Heritrix是一款强大的网络爬虫工具,广泛应用于数据采集和分析。本指南将详细介绍如何利用Heritrix抓取淘宝商城大家电分类下的空调商品信息。 首先,确定我们的目标:抓取淘宝商城空调商品...
2. **多线程处理**:Heritrix使用多线程来并行处理多个URL,提高了抓取效率。这使得它能够在短时间内处理大量网页。 3. **内容处理**:Heritrix不仅仅抓取HTML,还支持各种Web内容类型,如图片、PDF、XML等,并可以...
例如,Heritrix采用多线程设计,每个组件如fetcher、parser和archiver都在自己的线程中运行,以实现高并发性和高效能。此外,源码还可能包含详细的注释,解释了如何配置和扩展Heritrix。 在学习和使用Heritrix时,...
Mohr Gordon可能是一位专家或讲师,他分享了Heritrix如何通过多线程和并发处理来提高抓取效率,以及如何利用HTTP协议进行网页请求和响应。此外,这个PPT可能还讨论了Heritrix如何处理JavaScript、Cookie和Session等...
Heritrix是一款强大的开源网络爬虫工具,由互联网档案馆(Internet Archive)开发,主要用于抓取和保存网页内容。Heritrix 1.14.4是该软件的一个较早版本,但依然具有广泛的适用性,尤其对于学习和研究网络爬虫技术...
Heritrix 支持分布式部署模式,可以在多台机器上并行执行抓取任务,大大提高了抓取速度和效率。 #### 二十八、Heritrix 3.x API 指南 Heritrix 提供了一套丰富的 API 接口,用户可以利用这些接口开发定制化的应用...
Heritrix是一款强大的开源网络爬虫工具,专为大规模、深度网页抓取设计。这款工具由互联网档案馆(Internet Archive)开发,旨在提供灵活、可扩展的网页抓取框架,适用于学术研究、数据挖掘和历史记录保存等多种用途...
Heritrix 3.1.0 是一个强大的网络爬虫工具,主要用于抓取和存档互联网上的网页。这个最新版本的jar包包含了Heritrix的核心功能,为用户提供了一个高效的网页抓取框架。Heritrix的设计理念是模块化和可配置性,使得它...
5. **分布式爬取**:为了处理大规模的网页抓取任务,Heritrix支持多线程和分布式部署。通过集群化设置,可以在多台服务器上分散负载,提高抓取效率。 6. **存储与索引**:抓取的网页内容通常需要进一步处理和索引...