- 浏览: 561456 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (478)
- lucene (45)
- oracle (19)
- nutch (2)
- blog (2)
- 垂直搜索 (19)
- java综合 (89)
- spring (15)
- Hibernate (9)
- Struts (9)
- Hadoop (16)
- Mysql (12)
- nosql (10)
- Linux (3)
- MyEclipse (4)
- Ant (1)
- 设计模式 (19)
- JBPM (1)
- JSP (1)
- HtmlParser (5)
- SVN (2)
- 插件 (2)
- 收藏 (7)
- Others (1)
- Heritrix (18)
- Solr (4)
- 主题爬虫 (31)
- 内存数据库 (24)
- 分布式与海量数据 (32)
- httpclient (14)
- Tomcat (1)
- 面试宝典 (6)
- Python (14)
- 数据挖掘 (1)
- 算法 (6)
- 其他 (4)
- JVM (12)
- Redis (18)
最新评论
-
hanjiyun:
本人水平还有待提高,进步空间很大,看这些文章给我有很大的指导作 ...
JVM的内存管理 Ⅲ -
liuxinglanyue:
四年后的自己:这种方法 不靠谱。 使用javaagent的方式 ...
计算Java对象占用内存空间的大小(对于32位虚拟机而言) -
jaysoncn:
附件在哪里啊test.NoCertificationHttps ...
使用HttpClient过程中常见的一些问题 -
231fuchenxi:
你好,有redis,memlink,mysql的测试代码吗?可 ...
MemLink 性能测试 -
guyue1015:
[color=orange][/color][size=lar ...
JAVA同步机制
http://guoyunsky.iteye.com/blog/649889
Url是爬虫的核心,因为爬虫就是依赖URL一层一层的抓取下去,最后完成整个抓取。Heritrix中的URL比较特殊,有以下继承关系(由于不对继承关系作介绍,所以这里就不画图了):
1)org.archive.crawler.datamodel.CrawlURI——>CandidateURI
2)org.archive.net.UURI——>org.archive.net.LaxURI
——>org.apache.commons.httpclient.URI——>java.net.URL
前面说过CrawlURI和CandidateURI的区别在于CrawlURI是由通过了调度器(Frontier)的CandidateURI转换而来的。下面就先介绍CnadidateURI(主要介绍相关属性):
public static final int HIGH = 1; //调度器调度等级:高 public static final int HIGHEST = 0; //调度器调度等级:最高 public static final int MEDIUM = 2; //调度器调度等级:中 public static final int NORMAL = 3; //调度器调度等级:普通 //URL字符串 private String cachedCandidateURIString = null; //队列Key,不同队列有不同的classKey.其中相同classKey的CandidateURI则属于相同的队列 private String classKey; //是否强制访问,强制访问的话会重复抓取 private boolean forceRevisit = false; // 是不是种子 private boolean isSeed = false; /** * 灵活的属性列表,Heritrix在运行过程中需要保存不固定的属性和属性值, *同时扩展Heritrix属性 也可以放在里面。不过需要特殊处理,等下单独介绍 */ private transient AList alist; /** * 该值代表当前CandidateURI是如何从种子那里生成的,有如下生成方式: * P:预先处理URL,一般是DNS,如DNS:www.baidu.com * R:重定向URL * E:嵌入式URL,如Frame、src等 * X:特殊嵌入式URL,如JS中的URL * L:一般意义上的URL,如<a href="www.baidu.com"> * 该属性除了可以记录从种子那来源方式的话同时还可以记录深度,因为 * 该值是一层一层传递,每传递一层则增加一个以上字符.如此通过长度 * 可以判断当前URL属于种子的第几层从而做到控制抓取深度, 如果当 * 前CandidateURI是种子,则该值为null */ private String pathFromSeed; private int schedulingDirective = NORMAL; // 调度等级,默认为普通 private transient UURI uuri; //URL private transient UURI via; //来源URL private CharSequence viaContext;//来源URL内容
下面再介绍一下CrawlURI相关属性,前面说过CrawlURI和CandidateURI最大区别就是CrawlURI通过了调度器,这也就意味着CrawlURI会进入队列抓取,如此CrawlURI就会相比CandidateURI对很多属性来记录抓取情况,如处理器,下面请看代码以及注释:
//数组用户保存alist成员的key,使得URI处理期间可以持久化访问.这个list中的所有的key在传递下去的处理链 后面都不会被清理掉 private static final List<Object> alistPersistentMember = new CopyOnWriteArrayList<Object>( new String[] { A_CREDENTIAL_AVATARS_KEY }); // 一个CrawlURI所允许的最大外链接数(就是该CrawlURI本身网页里所包含的链接数),默认为6000 public static final int MAX_OUTLINKS = Integer.parseInt(System.getProperty( CrawlURI.class.getName() + ".maxOutLinks", "6000")); // 放弃的外链接个数(当一个URL抽取出来的链接数超过MAX_OUTLINKS时就放弃,然后本变量累加) transient private int discardedOutlinks = 0; public static final int UNCALCULATED = -1; //网页内容长度,默认值 private String cachedCrawlURIString = null; //缓存的URL private byte[] contentDigest = null; //网页内容指纹,对内容进行MD5值,该对象可以用于对比该URL是否有更新 private String contentDigestScheme = null; // 记录网页内容所采用算法,从配置文件里配置 private long contentLength = UNCALCULATED; //相应内容长度 private long contentSize = UNCALCULATED; //网页内容大小 private String contentType = null; //网页内容类型 private int deferrals = 0; //从先决条件URL延迟数 private int fetchAttempts = 0; // 获取URL的个数 private int fetchStatus = 0; //获取URL内容状态,默认为0,表示没有尝试过 transient Object holder; // 所属的队列(WorkQueue) int holderCost = UNCALCULATED; //成本 transient Object holderKey; //所属队列的classkey private transient HttpRecorder httpRecorder = null; //记录网页内容 transient private boolean linkExtractorFinished = false; //抽取是否成功,如果成功则该URL不会再被抽取 transient private Processor nextProcessor; // 下一个处理器 transient private ProcessorChain nextProcessorChain;// 下一条处理链 protected long ordinal; //Crawl自增数目,用于广度优先抓取 transient Collection<Object> outLinks = new HashSet<Object>(); //该URL抽取到的所有的连接 private boolean post = false; // 提交url是否post,对应HttpClient的HttpPost private boolean prerequisite = false; //是否有优先URL要处理,一般是DNS transient private int threadNumber; //线程个数 private String userAgent = null; //用户代理,表名当前身份 @Deprecated private int embedHopCount = UNCALCULATED; @Deprecated private int linkHopCount = UNCALCULATED; // 跃点数,表示来自种子的第几层,该值可以控制抓取深度
同时很多人在使用Heritrix的时候需要增加自己的属性,我之前也有这样的需求。不过那时是直接修改源代码增加几个属性,然后在抽取的时候将新的属性赋给抽取出来的URL即可。后来才发现完全没有这个必要,Heritrix已经提供了这样一个功能,可以自定义放入各种属性和属性值。同时Heritrix自己在运行过程中也是如此,把一些会动态变化的属性放入其中,如HttpStatus Code。下面就介绍下其相关原理以及如何使用这个功能:
1)原理:
CandidateURI里面有一个属性private transient AList alist;该属性实际上是一个HashTable,其中Key为属性,Value为属性值。如此一致贯穿整个抓取,可以随时动态读写。但由于该属性是transient,也就意味着HashTable里面的值不会被持久化,所以Heritrix在CrawlURI里面引入一个个变量来记录HashTable中需要持久化的Key,也就是我们所要持久化的属性了:private static final List<Object> alistPersistentMember = new CopyOnWriteArrayList<Object>( new String[] { A_CREDENTIAL_AVATARS_KEY });该属性类型为CopyOnWriteArrayList,也就是专门用于复制写的List,里面存放需要持久化的Key。所以当你需要某个HashTable中的某个Key持久化的时候,只需要在该变量里添加即可。
2)使用方法:
1.存放属性和属性值,变量可以按多种类型存放:
//放入类型为Int的值 public void putInt(String key, int value) { getAList().putInt(key, value); } //放入类型为Long的属性值 public void putLong(String key, long value) { getAList().putLong(key, value); } //放入类型为Object的属性值 public void putObject(String key, Object value) { getAList().putObject(key, value); } //放入类型为String的属性值 public void putString(String key, String value) { getAList().putString(key, value); }
2.获得属性和属性值:
//获得属性的值,该值为Int类型 public int getInt(String key) { return getAList().getInt(key); } //获得属性的值,该值为Long类型 public long getLong(String key) { return getAList().getLong(key); } //获得属性的值,该值为Object类型 public Object getObject(String key) { return getAList().getObject(key); } //获得属性的值,该值为String类型 public String getString(String key) { return getAList().getString(key); }
3.查看是否包含某个属性:
//查看是否包含某个属性 public boolean containsKey(String key) { return getAList().containsKey(key); }
4.获得所有的属性:
//返回所有的属性值 public Iterator keys() { return getAList().getKeys(); }
5.让某个属性持久化:
public void makeHeritable(String key) { @SuppressWarnings("unchecked") List<String> heritableKeys = (List<String>) getObject(A_HERITABLE_KEYS); if (heritableKeys == null) { heritableKeys = new ArrayList<String>(); heritableKeys.add(A_HERITABLE_KEYS); putObject(A_HERITABLE_KEYS, heritableKeys); } heritableKeys.add(key); }
6.让某个属性不持久化:
public void makeNonHeritable(String key) { List heritableKeys = (List) getObject(A_HERITABLE_KEYS); if (heritableKeys == null) { return; } heritableKeys.remove(key); if (heritableKeys.size() == 1) { // only remaining heritable key is itself; disable completely remove(A_HERITABLE_KEYS); } }以上6个介绍完全可以让你扩展自己的属性以及让他们持久化。
发表评论
-
网络爬虫heritrix
2010-12-04 20:41 1336前段时间看了下关于网络爬虫的知识,其中的heritrix是 ... -
Heritrix使用的初步总结
2010-11-21 12:09 1058转:http://jason823.iteye.com/b ... -
Heritrix源码分析(十五) 各种问题总结
2010-11-21 11:11 920http://guoyunsky.iteye.com/bl ... -
Heritrix源码分析(十四) 如何让Heritrix不间断的抓取
2010-11-21 11:10 1037转:http://guoyunsky.iteye. ... -
Heritrix源码分析(十三) Heritrix的控制中心(大脑)CrawlController(二)
2010-11-21 11:07 1474http://guoyunsky.iteye.com/b ... -
Heritrix源码分析(十二) Heritrix的控制中心(大脑)CrawlController(一)
2010-11-21 11:05 942http://guoyunsky.iteye.com/ ... -
Heritrix源码分析(十) Heritrix中的Http Status Code(Http状态码)
2010-11-21 11:00 1214http://guoyunsky.iteye.com/bl ... -
Heritrix源码分析(九) Heritrix的二次抓取以及如何让Heritrix抓取你不想抓取的URL
2010-11-21 10:59 866http://guoyunsky.iteye.com/bl ... -
Heritrix源码分析(八) Heritrix8个处理器(Processor)介绍
2010-11-21 10:58 947http://guoyunsky.iteye.com/bl ... -
Heritrix源码分析(七) Heritrix总体介绍
2010-11-21 10:57 982http://guoyunsky.iteye.com/bl ... -
Heritrix源码分析(六) Heritrix的文件结构分析
2010-11-21 10:57 1013http://guoyunsky.iteye.com/bl ... -
Heritrix源码分析(五) 如何让Heritrix在Ecplise等IDE下编程启动
2010-11-21 10:56 1255http://guoyunsky.iteye.com/bl ... -
Heritrix源码分析(四) 各个类说明(二)
2010-11-21 10:55 1116http://guoyunsky.iteye.com/ ... -
Heritrix源码分析(四) 各个类说明(一)
2010-11-21 10:54 1000http://guoyunsky.iteye.com/ ... -
Heritrix源码分析(三) 修改配置文件order.xml加快你的抓取速度
2010-11-21 10:53 1253http://guoyunsky.iteye.co ... -
Heritrix源码分析(二) 配置文件order.xml介绍
2010-11-21 10:43 1235http://guoyunsky.iteye.com/ ... -
Heritrix源码分析(一) 包介绍
2010-11-21 10:42 1116http://guoyunsky.iteye.com/blog ...
相关推荐
### Heritrix源码分析知识点概述 #### 一、Heritrix简介 Heritrix是一款开源的网络爬虫工具,由Internet Archive开发并维护。它主要用于网页归档和大规模网络爬取任务。Heritrix的设计理念是高度可配置性和扩展性,...
9. **学习资源**:压缩包中的“Heritrix学习源码和资料”可能包含官方文档、教程、示例代码以及社区讨论等内容,这些资料可以帮助初学者快速上手并深入理解Heritrix的内部机制。 10. **实战应用**:Heritrix不仅...
Heritrix 是一个由 java 开发的、开源的网络爬虫,用户可以使用它来从网上抓取想要的资源。官网下载好像要翻墙,我下下来方便大家使用,这是3.4版本,配合heritrix-3.4.0-SNAPSHOT-dist.zip使用
6. `org.archive.crawler.datamodel`:包含Heritrix的数据模型,如`CandidateURI`表示待抓取的URL,`credential`子包则管理登录凭证,以处理需要身份验证的站点。 7. `org.archive.crawler.deciderules`:决策规则...
在"Heritrix 源码和Jar"这个主题中,我们可以深入探讨以下几个知识点: 1. **Heritrix的架构**: Heritrix采用模块化设计,由多个组件构成,包括URL队列管理器、下载器、解析器、存储模块等。用户可以根据需要定制...
在Eclipse中,用户可以利用Java的强类型系统和丰富的库来增强Heritrix的功能,或者根据项目需求调整其核心算法。 Heritrix的设计基于模块化和可扩展性,它的主要组件包括爬取管道(Crawler Pipelines)、策略...
**Lucene 和 Heritrix 源码分析** 在IT领域,搜索引擎的开发是一项复杂而重要的任务,它涉及到大量的文本处理、索引构建以及高效的查询算法。Lucene 和 Heritrix 是两个开源工具,分别专注于搜索的核心算法和网页...
在实际应用中,Heritrix常常被用于学术研究、数据分析、搜索引擎索引构建等领域。它的灵活性和可扩展性使其成为开发者和数据科学家的理想选择,特别是对于需要大规模、自定义爬取任务的场景。 总的来说,Heritrix-...
Heritrix是一款开源的互联网档案爬虫工具,由...在深入了解和实践Heritrix 1.14.4的过程中,你不仅会掌握网络爬虫的基本原理和技术,还能提升Java编程和项目管理能力,为更高级的Web数据挖掘和分析打下坚实的基础。
Heritrix是一款强大的开源网络爬虫工具,由互联网档案馆(Internet Archive)开发,主要用于抓取和保存网页内容。Heritrix 1.14.4是该软件的一个较早版本,但依然具有广泛的适用性,尤其对于学习和研究网络爬虫技术...
Heritrix 3.2 源码的分析和理解有助于开发者深入掌握爬虫技术,定制自己的爬虫解决方案。 首先,让我们了解一下Heritrix 3.2 的核心特性: 1. **模块化设计**:Heritrix 3.2 采用组件化的架构,使得不同的爬取功能...
Heritrix支持多种策略和模块,如深度优先和广度优先的爬行策略,以及基于正则表达式或DOM结构的URL过滤器。此外,它还提供了丰富的接口,允许开发者编写自定义的模块,如新的爬行策略、内容处理器或存储适配器。这...
源码中包含了完整的项目结构,如`src/main/java`存放Java源代码,`src/main/resources`存储资源配置,以及`pom.xml`,这是Maven的项目对象模型,用于构建和管理项目依赖。 Heritrix 的核心功能和知识点: - **模块...
heritrix1.14.4的源码包,包含heritrix1.14.4.zip和heritrix1.14.4-src.zip。heritrix是一种开源的网络爬虫,用于爬去互联网中的网页。如何配置和使用heritrix爬虫,请移步:...
用户需要下载Heritrix源码,然后按照提供的指南进行编译和安装。配置主要包括设定爬取范围,这可以通过修改`Modules`、`Submodules`和`Settings`来完成。例如,你可以使用正则表达式来限定抓取的URL模式,确保只抓取...
Heritrix的这些链结构使得开发者可以根据需要定制复杂的爬虫策略,通过调整和扩展各个链中的处理器,实现对网络内容的精确抓取和处理。无论是处理DNS解析、HTTP请求,还是从各种格式的文档中提取链接,Heritrix的...
这个“Heritrix1.14.4源码+项目”压缩包包含的是Heritrix 1.14.4版本的源代码和相关项目文件,对于学习和理解Web爬虫的工作原理,以及进行自定义开发是非常有价值的。 Heritrix的核心功能是通过模拟浏览器行为来...
同时,Heritrix可以与其他工具(如Solr或Elasticsearch)集成,为数据建立索引,便于后续分析和检索。 6. **扩展性**:Heritrix拥有丰富的插件体系,允许开发者添加自定义组件,以满足特定的抓取需求。 在使用...
综上所述,"开发自己的搜索引擎lucene+heritrix(第2版)"的源码涵盖了从网络数据抓取到全文检索的全过程,适合开发者深入学习和实践搜索引擎技术。通过研究ch13至ch16的源代码,可以更深入地理解这两个工具的交互和...