最近作业中有个需要用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,Mohr-et-al-2004.pdf,其作者谈其优劣 Heritrix Gordon Mohr-et-al-2004.pdf heritrix学习必读,谢谢
此文件中包括heritrix-1.14.4.zip和heritrix-1.14.4-src.zip 其中src是源码,已测试能够集成到eclipse中进行二次开发
Heritrix 是一个由 java 开发的、开源的网络爬虫,用户可以使用它来从网上抓取想要的资源。官网下载好像要翻墙,我下下来方便大家使用,这是3.4版本
一个java的网络爬虫程序。heritrix-1.14.0-src
heritrix-1.12.1-src.zip与heritrix 配置文档
Heritrix是按多线程方式抓取的爬虫,主线程把任务分配给Teo线程(处理线程),每个Teo线程每次处理一个URL。Teo线程对每个URL执行一遍URL处理器链。URL处理器链包括如下5个处理步骤。整个流程都在图2.1中。 (1)预取链...
heritrix-1.14.4-src.zip
自己学习网络爬虫时知识所学习的资料,希望可以和大家分享,并能对大家有所帮助,希望能共同进步。
heritrix 的详细配置 与 使用资料.里面对heritrix配置有详细的说明!
heritrix-3.1.0 最新官网jar包。包括heritrix-3.1.0-dist.zip包与heritrix-3.1.0-src.zip包。是爬虫神器
heritrix抓取指南heritrix抓取指南 heritrix抓取指南
27 April 2008 - heritrix Java 1.14.0 available src
包含: heritrix-3.1.0-dist.tar.gz heritrix-3.1.0-src.tar.gz 官方文档下载地址
最新的Heritrix用户文档,包括基本的Heritrix介绍、安装、创建任务、任务分析等,并给出了一个具体的实例
目前罪行的heritrix网络爬虫工具,是学习lucene的提高选择,可以大批量的抓取网上资源!
Heritrix是一个纯由Java开发的、开源的Web网络爬虫,用户可以使用它从网络上抓取想要的资源
对heritrix抓取的操作和扩展 里面有MirrorWriterProcessor扩展的类文件修改
包含: heritrix-3.1.0-dist.zip heritrix-3.1.0-src.zip 官网下载地址。