最近作业中有个需要用Heritrix抓包的任务,不过抓起来,我真的崩溃了。用我的电脑抓了奖金20个小时,抓了50M。都哭了。不过发现那个active threads项最多只有一个,很多时候都是0。偶表示压力很大。。 怎么搞的??
听朋友说,加上网上搜资料,终于搞定,原来Heritrix采用HostnameQueueAssignmentPolicy来进行对URL处理。url队列以hostname为key,所有相同key的url放置在同一个队列里面,也就是说同一个host下面的所有url都放在一个队列里面,当线程获取url时候,会将该队列放置到同步池中,拒绝其他线程访问。觉得说的有道理,嘿嘿。按照如下步骤进行了尝试,果然,好使。
1. 添加一个新类ELFHashQueueAssignmentPolicy.java
package org.archive.crawler.frontier;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.apache.commons.httpclient.URIException;
import org.archive.crawler.datamodel.CandidateURI;
import org.archive.crawler.framework.CrawlController;
import org.archive.net.UURI;
import org.archive.net.UURIFactory;
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) {
UURI viaUuri = UURIFactory.getInstance(cauri.flattenVia());
candidate = viaUuri.getAuthorityMinusUserinfo();
scheme = viaUuri.getScheme();
} else {
candidate = cauri.getUURI().getReferencedHost();
}
} else {
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;
}
if (scheme != null && scheme.equals(UURIFactory.HTTPS)) {
if (!candidate.matches(".+:[0-9]+")) {
candidate += UURIFactory.HTTPS_PORT;
}
}
return candidate.replace(':', '#');
}
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);
}
}
2. 修改AbstractFrontier(跟ELFHashQueueAssignmentPolicy.java在同一个包下)
// Read the list of permissible choices from heritrix.properties.
// Its a list of space- or comma-separated values.
String queueStr = System.getProperty(AbstractFrontier.class.getName() +
"." + ATTR_QUEUE_ASSIGNMENT_POLICY,
ELFHashQueueAssignmentPolicy.class.getName() + " " +//修改之后ELFHash队列分配策略
IPQueueAssignmentPolicy.class.getName() + " " +
BucketQueueAssignmentPolicy.class.getName() + " " +
SurtAuthorityQueueAssignmentPolicy.class.getName() + " " +
TopmostAssignedSurtQueueAssignmentPolicy.class.getName());
Pattern p = Pattern.compile("\\s*,\\s*|\\s+");
3. 修改heritrix.properties属性(在conf包下)
#############################################################################
# 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
按照如上说明,搞定!!
通过以上配置,有时还是会出问题,虽然不知道为什么,但是还是试了很多方法,解决掉了。
(1) 配置下在Setting里的frontier项中的max retries,改成100(有可能是入口过少)
(2) 将url地址改成ip地址(看过log,有时候会有很多404error,那我直接换成ip地址试下,果然好使,哈哈)
不过有的还是不好使 唉 望有识之士帮忙确定下上面的修改是否能够100%成功!!
- 大小: 60.9 KB
分享到:
相关推荐
Heritrix 是一个由 java 开发的、开源的网络爬虫,用户可以使用它来从网上抓取想要的资源。官网下载好像要翻墙,我下下来方便大家使用,这是3.4版本,配合heritrix-3.4.0-SNAPSHOT-dist.zip使用
总的来说,Heritrix-1.14.4-src提供了深入了解网络爬虫工作原理的机会,同时也让用户有机会自定义和优化爬虫行为,以满足特定的业务需求。虽然这个版本可能没有最新版的特性,但对于学习和理解爬虫技术来说,仍然是...
- `heritrix-3.4.0-SNAPSHOT`目录:这是Heritrix的主目录,包含了所有运行所需的基本文件,如jar包、配置文件、文档等。 - `bin`子目录:存放启动和停止Heritrix的脚本,通常在Unix/Linux环境下使用`start.sh`和`...
`heritrix-1.14.4.zip` 包含了Heritrix的可执行版本,即已经编译好的二进制文件。这个压缩包解压后,用户可以直接运行程序,进行网页抓取工作。Heritrix提供了命令行界面,用户可以通过指定参数来配置爬虫的行为,如...
2. **多线程处理**:Heritrix使用多线程来并行处理多个URL,提高了抓取效率。这使得它能够在短时间内处理大量网页。 3. **内容处理**:Heritrix不仅仅抓取HTML,还支持各种Web内容类型,如图片、PDF、XML等,并可以...
接着,需要解压 heritrix-1.12.1.jar 文件,并将解压后的所有内容(除了 org、st、com、META-INF 和 effective_tld_names.dat 文件)复制到项目源代码目录下。这一步是为了合并必要的类和资源文件。 在配置阶段,你...
1. 解压heritrix-1.14.0-RC1.zip和heritrix-1.14.0-RC1-src.zip,将jar文件放在E:/MyWork/heritrix/heritrix-1.14-jar目录下,源码放在E:/MyWork/libs/heritrix/heritrix-1.14.0-RC1-src/heritrix-1.14.0-RC1目录下...
7. **数据存储**:Heritrix可以将抓取的数据存储在多种后端,如文件系统、数据库或分布式存储系统。这使得用户可以根据自身的需求选择合适的数据存储方式。 总的来说,Heritrix是一个功能强大的网络爬虫框架,适合...
heritrix-1.12.1-src.zip与heritrix 配置文档
这个名为"Heritrix-User-Manual.rar_heritrix"的压缩包包含了Heritrix用户手册的PDF版本,是学习和操作Heritrix的重要资源。下面将详细介绍Heritrix的基本概念、安装步骤、任务创建以及任务分析。 1. **Heritrix...
Heritrix是按多线程方式抓取的爬虫,主线程把任务分配给Teo线程(处理线程),每个Teo线程每次处理一个URL。Teo线程对每个URL执行一遍URL处理器链。URL处理器链包括如下5个处理步骤。整个流程都在图2.1中。 (1)预取链...
在解压后的`heritrix-1.14.0`目录中,通常会包含以下结构: - `src` 目录:存放源代码文件,包括主要的Java类和配置文件。 - `build.xml`:Ant构建文件,用于编译和打包项目。 - `README` 和 `LICENSE` 文件:提供...
- **高质量爬取**:Heritrix专为高质量的网站归档设计,能够准确地抓取和保存网页内容。 - **可扩展性**:采用模块化设计,支持各种插件扩展,方便根据需求定制功能。 - **聚焦爬取**:支持针对特定网站或主题的深度...
"heritrix-1.14.3-src.zip"是一个包含了Heritrix 1.14.3版本源代码的压缩文件,对于那些希望深入理解其工作原理或者想要自定义功能的开发者来说,这是一个宝贵的资源。 Heritrix的核心设计基于模块化架构,允许...
"heritrix-1.14.4-docs.rar"这个压缩包包含了该版本的文档,帮助用户理解和使用Heritrix。 文档通常包括用户手册、开发者指南、API参考等,这些内容对于熟悉Heritrix的架构、配置和编程接口至关重要。由于文件较大...
1. **heritrix-3.1.0-dist.zip**:这是Heritrix的发行版,包含运行所需的所有文件,如Java可执行文件(JARs)、配置文件和文档。用户可以直接下载并运行此版本来启动爬虫服务,无需构建源代码。其中,`heritrix-...
总的来说,Heritrix-1.4.4是用于构建自定义网络抓取应用的强大工具,结合MyEclipse可以提供一个便捷的开发和调试环境。对于想要了解网络爬虫技术或需要大量网页数据的人来说,这是一个值得学习和使用的平台。然而,...
- **多线程处理**:Heritrix支持并发抓取,能有效提高抓取效率。 - **内容处理**:除了抓取网页,Heritrix还可以处理各种类型的内容,如图片、视频、PDF等,且支持多种数据存储格式,如WARC(Web ARChive)。 - **...