package mypackage;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.archive.crawler.datamodel.CandidateURI;
import org.archive.crawler.datamodel.CrawlURI;
import org.archive.crawler.datamodel.FetchStatusCodes;
import org.archive.crawler.datamodel.UURI;
import org.archive.crawler.framework.CrawlController;
import org.archive.crawler.framework.Frontier;
import org.archive.crawler.framework.FrontierMarker;
import org.archive.crawler.framework.exceptions.FatalConfigurationException;
import org.archive.crawler.framework.exceptions.InvalidFrontierMarkerException;
import org.archive.crawler.settings.ModuleType;
/**
* A simple Frontier implementation for tutorial purposes
*/
public class MyFrontier extends ModuleType implements Frontier,
FetchStatusCodes {
// A list of the discovered URIs that should be crawled.
List pendingURIs = new ArrayList();
// A list of prerequisites that needs to be met before any other URI is
// allowed to be crawled, e.g. DNS-lookups
List prerequisites = new ArrayList();
// A hash of already crawled URIs so that every URI is crawled only once.
Map alreadyIncluded = new HashMap();
// Reference to the CrawlController.
CrawlController controller;
// Flag to note if a URI is being processed.
boolean uriInProcess = false;
// top-level stats
long successCount = 0;
long failedCount = 0;
long disregardedCount = 0;
long totalProcessedBytes = 0;
public MyFrontier(String name) {
super(Frontier.ATTR_NAME, "A simple frontier.");
}
public void initialize(CrawlController controller)
throws FatalConfigurationException, IOException {
this.controller = controller;
// Initialize the pending queue with the seeds
this.controller.getScope().refreshSeeds();
List seeds = this.controller.getScope().getSeedlist();
synchronized(seeds) {
for (Iterator i = seeds.iterator(); i.hasNext();) {
UURI u = (UURI) i.next();
CandidateURI caUri = new CandidateURI(u);
caUri.setSeed();
schedule(caUri);
}
}
}
public synchronized CrawlURI next(int timeout) throws InterruptedException {
if (!uriInProcess && !isEmpty()) {
uriInProcess = true;
CrawlURI curi;
if (!prerequisites.isEmpty()) {
curi = CrawlURI.from((CandidateURI) prerequisites.remove(0));
} else {
curi = CrawlURI.from((CandidateURI) pendingURIs.remove(0));
}
curi.setServer(controller.getServerCache().getServerFor(curi));
return curi;
} else {
wait(timeout);
return null;
}
}
public boolean isEmpty() {
return pendingURIs.isEmpty() && prerequisites.isEmpty();
}
public synchronized void schedule(CandidateURI caURI) {
// Schedule a uri for crawling if it is not already crawled
if (!alreadyIncluded.containsKey(caURI.getURIString())) {
if(caURI.needsImmediateScheduling()) {
prerequisites.add(caURI);
} else {
pendingURIs.add(caURI);
}
alreadyIncluded.put(caURI.getURIString(), caURI);
}
}
public void batchSchedule(CandidateURI caURI) {
schedule(caURI);
}
public void batchFlush() {
}
public synchronized void finished(CrawlURI cURI) {
uriInProcess = false;
if (cURI.isSuccess()) {
successCount++;
totalProcessedBytes += cURI.getContentSize();
controller.fireCrawledURISuccessfulEvent(cURI);
cURI.stripToMinimal();
} else if (cURI.getFetchStatus() == S_DEFERRED) {
cURI.processingCleanup();
alreadyIncluded.remove(cURI.getURIString());
schedule(cURI);
} else if (cURI.getFetchStatus() == S_ROBOTS_PRECLUDED
|| cURI.getFetchStatus() == S_OUT_OF_SCOPE
|| cURI.getFetchStatus() == S_BLOCKED_BY_USER
|| cURI.getFetchStatus() == S_TOO_MANY_EMBED_HOPS
|| cURI.getFetchStatus() == S_TOO_MANY_LINK_HOPS
|| cURI.getFetchStatus() == S_DELETED_BY_USER) {
controller.fireCrawledURIDisregardEvent(cURI);
disregardedCount++;
cURI.stripToMinimal();
} else {
controller.fireCrawledURIFailureEvent(cURI);
failedCount++;
cURI.stripToMinimal();
}
cURI.processingCleanup();
}
public long discoveredUriCount() {
return alreadyIncluded.size();
}
public long queuedUriCount() {
return pendingURIs.size() + prerequisites.size();
}
public long finishedUriCount() {
return successCount + failedCount + disregardedCount;
}
public long successfullyFetchedCount() {
return successCount;
}
public long failedFetchCount() {
return failedCount;
}
public long disregardedFetchCount() {
return disregardedCount;
}
public long totalBytesWritten() {
return totalProcessedBytes;
}
public String report() {
return "This frontier does not return a report.";
}
public void importRecoverLog(String pathToLog) throws IOException {
throw new UnsupportedOperationException();
}
public FrontierMarker getInitialMarker(String regexpr,
boolean inCacheOnly) {
return null;
}
public ArrayList getURIsList(FrontierMarker marker, int numberOfMatches,
boolean verbose) throws InvalidFrontierMarkerException {
return null;
}
public long deleteURIs(String match) {
return 0;
}
}
分享到:
相关推荐
这个“Heritrix+Lucene搜索例子”可能涉及到如何将Heritrix抓取的数据整合到Lucene的搜索框架中,从而实现对网络抓取内容的有效检索。 首先,Heritrix的工作流程包括配置爬虫策略、启动爬虫、抓取网页、存储和归档...
在Heritrix 3.0和3.1版本中,引入了一个基于Spring-container的配置系统,这使得设置管理更加灵活。此外,3.X版本的另一个显著改变是采用了一种新的模型,允许在同一个作业目录下重启作业,而无需每次都创建新的作业...
Heritrix是一个强大的开源Web网络爬虫,由Java编写,主要功能是从互联网上抓取数据,为搜索引擎提供丰富的资源。它的可扩展性是其一大亮点,允许开发者自定义组件以适应不同的抓取需求。Heritrix最初来源于...
Heritrix 1.14.2 是一个开源的网络爬虫工具,它主要用于抓取互联网上的网页和其他在线资源。这个版本的Heritrix在2007年左右发布,虽然较旧,但它仍然是理解网络爬虫技术的一个重要参考。 Heritrix是一个由Internet...
heritrix-1.12.1-src.zip与heritrix 配置文档
Heritrix 3.1.0 是一个强大的网络爬虫工具,主要用于抓取和存档互联网上的网页。这个最新版本的jar包包含了Heritrix的核心功能,为用户提供了一个高效的网页抓取框架。Heritrix的设计理念是模块化和可配置性,使得它...
1. **heritrix-3.1.0-dist.zip**:这个文件包含了Heritrix的发行版,也就是预编译好的二进制版本。当你下载并解压这个文件后,你可以直接运行它而无需进行任何编译步骤。通常,它会包含启动脚本、配置文件以及必要的...
在使用Heritrix时,"heritrix-1.14.0"这个压缩包文件包含了一系列必要的组件和库,包括核心爬虫引擎、解析器、存储模块以及各种配置文件。解压后,用户通常会找到以下几部分: 1. **bin**:存放可执行脚本,如启动...
在本文中,我们将深入探讨如何安装和配置Heritrix 1.14.4版本,这是一个基于Java的爬虫工具。 首先,我们需要从SourceForge网站下载Heritrix的源代码版本,文件名为`heritrix-1.14.4-src.zip`。选择源代码版本的...
Heritrix是一个强大的开源网络爬虫工具,用于批量抓取互联网上的网页。它提供了一种高效、可配置的方式来收集和处理网页数据。本篇将详细解释Heritrix系统的使用、核心概念、工作原理以及关键组件。 首先,Heritrix...
Heritrix是一个开源的网络爬虫工具,专为大规模网页抓取设计。它是由Internet Archive开发的,允许用户系统地、可配置地抓取互联网上的信息。Heritrix的版本1.4.4是一个较旧但仍然有其价值的版本,因其稳定性而被...
这个“Heritrix源码”压缩包可能包含了Heritrix项目的完整源代码,以及相关的学习资料,对于深入理解Heritrix的工作原理、定制爬虫功能以及进行二次开发非常有帮助。以下将详细介绍Heritrix的关键知识点。 1. **...
Heritrix 1.14.4是该软件的一个较早版本,但依然具有广泛的适用性,尤其对于学习和研究网络爬虫技术的初学者而言。 在Heritrix 1.14.4中,主要涉及以下几个核心知识点: 1. **网络爬虫原理**:网络爬虫是自动化...
Heritrix工程始于2003年初,IA的目的是开发一个特殊的爬虫,对网上的 资源进行归档,建立网络数字图书馆,在过去的6年里,IA已经建立了400TB的数据。 IA期望他们的crawler包含以下几种: 宽带爬虫:能够以更高的...
在这个过程中,Lucene 和 Heritrix 是两个非常关键的工具,它们分别在搜索引擎的构建中扮演着不同的角色。 首先,Lucene 是一个基于 Java 的开源信息检索库,它为开发者提供了一系列用于构建搜索引擎的工具和接口。...
Heritrix是一个强大的Java开发的开源网络爬虫,主要用于从互联网上抓取各种资源。它由www.archive.org提供,以其高度的可扩展性而著称,允许开发者自定义抓取逻辑,通过扩展其内置组件来适应不同的抓取需求。本文将...
**Heritrix**: Heritrix是一个开放源代码的Web爬虫,用于抓取互联网上的网页。它具备以下特性: 1. **深度抓取**: 能够按照设定的规则持续深入地抓取网站内容。 2. **定制化**: 支持自定义策略和插件,以适应不同...
接下来是"Heritrix使用的初步总结 - 企业应用 - Java - ITeye论坛.mht",这个文件很可能是某个开发者在ITeye论坛上分享的Heritrix使用心得。ITeye论坛是一个中国程序员交流的平台,这类帖子通常包含了实践中的技巧、...
Heritrix 使用手册 全doc 文本