本博客属原创文章,欢迎转载!转载请务必注明出处:http://guoyunsky.iteye.com/blog/650694
欢迎加入Heritrix群(QQ):109148319
CrawlController的确是Heritrix的大脑,在Heritrix中拥有无上的权利!可以控制Heritrix的启动、暂停、停止,也定时进行数据统计、数据汇报和文件管理。同时CrawlController也基本上贯穿整个Heritrix代码,和CrawlURI一样。同时CrawlController纯代码页进2000行,下面就先介绍里面的属性和主要方法,同时对一些灵活用法也加以介绍:
1.属性:
//状态,Checkpoinging:表示正在备份 private static final Object CHECKPOINTING = "CHECKPOINTING".intern(); //状态,FINISHED:表示抓取结束 private static final Object FINISHED = "FINISHED".intern(); //状态,NASCENT:表示正在生成一个JOB private static final Object NASCENT = "NASCENT".intern(); //状态,PAUSED:表示暂停结束,该状态Heritrix正暂停任何抓取 private static final Object PAUSED = "PAUSED".intern(); //状态,PAUSING:表示正在暂停,传达一个暂停命令到每一个线程暂停中间需要时间 private static final Object PAUSING = "PAUSING".intern(); //状态,PREPARING:表示抓取结束 private static final Object PREPARING = "PREPARING".intern(); //状态,RUNNING:表示正在运行 private static final Object RUNNING = "RUNNING".intern(); //状态,STARTED:表示已经启动 private static final Object STARTED = "STARTED".intern(); //状态,STOPPING:表示正在停止,传达一个停止命令到每一个线程暂停中间需要时间 private static final Object STOPPING = "STOPPING".intern(); //当前类的日志管理器 private final static Logger LOGGER = Logger.getLogger(CrawlController.class .getName()); // 活动的日志文件名后缀 public static final String CURRENT_LOG_SUFFIX = ".log"; // 日志crawl.log.txt的文件名 private static final String LOGNAME_CRAWL = "crawl"; // 日志local-errors.log.txt的文件名 private static final String LOGNAME_LOCAL_ERRORS = "local-errors"; // 日志progress-statistics.log.txt的文件名 private static final String LOGNAME_PROGRESS_STATISTICS = "progress-statistics"; // runtime-errors.txt的文件名 private static final String LOGNAME_RUNTIME_ERRORS = "runtime-errors"; // 日志uri-errors.txt的文件名 private static final String LOGNAME_URI_ERRORS = "uri-errors"; // 日志manifest-report的文件名前缀 public final static String MANIFEST_REPORT = "manifest"; //processors-report.txt的文件名前缀 public final static String PROCESSORS_REPORT = "processors"; // crawl-manifest日志文件中中配置文件标签缩写 public static final char MANIFEST_CONFIG_FILE = 'C'; // crawl-manifest日志文件中中日志文件标签缩写 public static final char MANIFEST_LOG_FILE = 'L'; // crawl-manifest日志文件中中报告文件标签缩写 public static final char MANIFEST_REPORT_FILE = 'R'; //报告文件名数组 protected final static String[] REPORTS = { PROCESSORS_REPORT, MANIFEST_REPORT }; //应急内存,当内存不够时Heritrix会释放这个内存去做一些紧急动作如数据备份 private static final int RESERVE_BLOCK_SIZE = 6 * 2 ^ 20; // 6MB private static final int RESERVE_BLOCKS = 1; //BDB数据库,Heritrix自己封装 private transient EnhancedEnvironment bdbEnvironment = null; //用于Checkpoint备份,存储需要备份的数据 private transient Map<String, CachedBdbMap<?, ?>> bigmaps = null; //备份器 private Checkpointer checkpointer; //备份对象 private transient Checkpoint checkpointRecover = null; //备份目录 private transient File checkpointsDisk; //整个Heritrix目录 private transient File disk; //日志文件目录 private transient File logsDisk; //scratch文件 private transient File scratchDisk; //BDB数据库文件 private transient File stateDisk; //日志处理器跟文件处理器关联 transient private Map<Logger, FileHandler> fileHandlers; //调度器 private transient Frontier frontier; // 日志处理器,关联local-errors.log public transient Logger localErrors; // 日志处理器,关联 progress-statistics.log private transient Logger progressStats; //日志处理器,关联报告文件 public transient Logger reports; // 日志处理器,关联runtime-errors.log public transient Logger runtimeErrors; // 日志处理器,关联uri-Errors.log public transient Logger uriErrors; // 日志处理器,关联crawl.log public transient Logger uriProcessing; //记录Hertrix创建的日志文件名 private StringBuffer manifest; //最大字节数,来源于配置文件 private long maxBytes; // //抓取限制, 最大文档数,来源于配置文件 private long maxDocument; // 抓取限制,最大时间,来源于配置文件 private long maxTime; //管理order.xml private transient CrawlOrder order; //处理器链 private transient ProcessorChainList processorChains; //事件监听器,比如正在运行、停止 private transient List<CrawlStatusListener> registeredCrawlStatusListeners = Collections .synchronizedList(new ArrayList<CrawlStatusListener>()); //抓取状态监听器,这里监听哪些URl被忽略,哪些URL抓取失败等 private transient CrawlURIDispositionListener registeredCrawlURIDispositionListener; //抓取状态监听器数据 protected transient ArrayList<CrawlURIDispositionListener> registeredCrawlURIDispositionListeners; // 应急储备内存 private transient LinkedList<char[]> reserveMemory; //抓取范围管理 private transient CrawlScope scope; // CrawlServer和CrawlHost的缓存 private transient ServerCache serverCache; //配置文件,如order.xml private transient SettingsHandler settingsHandler; //Heritrix状态,表示已经存在 private transient String sExit; // 锁,控制同时只能一个线程运行使用本类 private transient ReentrantLock singleThreadLock = null; //是否是单线程模式 private volatile transient boolean singleThreadMode = false; // 表示当前爬虫状态,新生的 transient private Object state = NASCENT; // 统计跟踪器 protected StatisticsTracking statistics = null; //线程池 private transient ToePool toePool;
同时属性中有三个地方需要补充下:
1)"CHECKPOINTING".intern(); 为什么采用intern()方法?知道intern()方法的人都知道,intern在创建String对象时会先无内存里查看有没有该对象,有的话直接返回,没有则重新创建。而普通的new一般都是直接创建对象,如此在一定程序上可以节省开销
2)transient LinkedList<char[]> reserveMemory;应急内存。Heritrix在初始化的时候会先占用一部分内存,这里是6M。当发生内存溢出的时候则释放这部分内存,然后做一些日志、报告方面的操作
3)private transient ReentrantLock singleThreadLock,重入锁.大脑只能有一个,所以需要用这个来保证一个大脑的存在,而不是多个。这里为什么不用单例模式来取代,而采用这种方法?我这里没有用单例模式和这种方法进行实验比较,但直觉上告诉我,由于Heritrix是个多线程爬虫,并且可以同时有多个抓取Job,但同时只能有一个job运行。单例模式的synchronized不能保证当一个job发生线程中断时,其他job可以获得CrawlController的锁来运行他们的抓取,因为synchronized会一直锁住CrawlController对象.而使用ReentrantLock则可以做到这一点...我的想法,欢迎大家拍砖...
由于贴上方法介绍后本文章会太长,故方法介绍方法下一篇博客介绍,博客地址:http://guoyunsky.iteye.com/blog/650744
更多技术文章、感悟、分享、勾搭,请用微信扫描:
相关推荐
Heritrix是互联网档案(Internet Archive)开发的一款开源网络爬虫工具,用于系统地抓取、存储和归档网页。这个“Heritrix源码”压缩包可能包含了Heritrix项目的完整源代码,以及相关的学习资料,对于深入理解...
### Heritrix源码分析(十一):Heritrix中的URL——CandidateURI和CrawlURI #### 一、概述 Heritrix是一款开源的网络爬虫工具,它主要用于归档和备份网页数据。Heritrix的设计非常灵活且可扩展性强,能够支持多种...
11. `org.archive.crawler.framework`:Heritrix的框架包,定义了核心类如CrawlController(爬虫控制器)和Frontier(调度器),是整个系统架构的基础。 12. `org.archive.crawler.framework.exceptions`:框架异常...
**Lucene 和 Heritrix 源码分析** 在IT领域,搜索引擎的开发是一项复杂而重要的任务,它涉及到大量的文本处理、索引构建以及高效的查询算法。Lucene 和 Heritrix 是两个开源工具,分别专注于搜索的核心算法和网页...
Heritrix 1.14.4是该软件的一个较早版本,包含了完整的源码,因此用户可以对其进行深度定制和调试。 在开始使用Heritrix 1.14.4之前,你需要了解以下几个核心知识点: 1. **爬虫基础**:Heritrix是一个Web爬虫,其...
Heritrix是一款开源的网络爬虫工具,由Internet Archive开发并维护,用于抓取和保存互联网上的网页。这款工具的设计目标是提供一个可扩展、可配置的平台,以适应各种爬网需求。Heritrix的核心功能包括URL调度、网页...
### Heritrix源码分析知识点概述 #### 一、Heritrix简介 Heritrix是一款开源的网络爬虫工具,由Internet Archive开发并维护。它主要用于网页归档和大规模网络爬取任务。Heritrix的设计理念是高度可配置性和扩展性,...
Heritrix 3.2 源码的分析和理解有助于开发者深入掌握爬虫技术,定制自己的爬虫解决方案。 首先,让我们了解一下Heritrix 3.2 的核心特性: 1. **模块化设计**:Heritrix 3.2 采用组件化的架构,使得不同的爬取功能...
heritrix1.14.4的源码包,包含heritrix1.14.4.zip和heritrix1.14.4-src.zip。heritrix是一种开源的网络爬虫,用于爬去互联网中的网页。如何配置和使用heritrix爬虫,请移步:...
这个“Heritrix1.14.4源码+项目”压缩包提供了一个深入研究和学习Heritrix的好机会。你可以通过阅读源代码理解其内部机制,也可以通过修改配置和编写处理器来实现自己的Web爬虫项目。无论你是想进行学术研究,还是...
《开发自己的搜索引擎lucene+heritrix(第2版)》是一部深入探讨搜索引擎开发的专业书籍,主要聚焦于开源项目Lucene和Heritrix的使用。Lucene是Java编写的一个全文检索库,而Heritrix则是一个互联网档案爬虫,两者...
最后,"heritrixProject"很可能包含了Heritrix的配置和源码,用于自定义网络爬取的行为和范围。 总结起来,Lucene和Heritrix是构建高效网络搜索系统的关键组件。Lucene提供强大的全文索引和搜索能力,而Heritrix则...
Heritrix是一款开源的网络爬虫工具,由Internet Archive开发并维护,主要用于大规模网页抓取。Heritrix-1.14.4源代码的提供,对于那些希望深入理解网络爬虫工作原理、想要定制爬虫功能或者进行相关研究的开发者来说...
源码分析对于理解Heritrix的工作原理至关重要。通过对源码的阅读,我们可以了解其内部架构,包括线程模型、数据流控制和模块间的通信机制。例如,Heritrix采用多线程设计,每个组件如fetcher、parser和archiver都在...
相较于其他爬虫工具,Heritrix提供了更为精细的控制机制,能够帮助用户更高效地抓取所需的网页数据。 #### 二、Heritrix安装详细步骤 本节将详细介绍如何在Eclipse环境中搭建Heritrix,并进行必要的配置,以便能够...
Heritrix是一款强大的开源网络爬虫工具,由互联网档案馆(Internet Archive)开发,主要用于抓取和保存网页内容。Heritrix 1.14.4是该软件的一个较早版本,但依然具有广泛的适用性,尤其对于学习和研究网络爬虫技术...
从网上找得应该是中文Heritrix源码最详细的说明了。折腾了好久,没有把网页打成chm,只能打个exe用用。
Heritrix是一个强大的Java开发的开源网络爬虫,主要用于从互联网上抓取各种资源。它由www.archive.org提供,以其高度的可扩展性而著称,允许开发者自定义抓取逻辑,通过扩展其内置组件来适应不同的抓取需求。本文将...
Heritrix是一款强大的开源网络爬虫工具,由互联网档案馆(Internet Archive)开发,用于抓取和保存网页数据。在IT行业中,爬虫是获取...无论是用于学术研究、数据分析还是网站维护,Heritrix都是一个值得信赖的工具。