`
qzxfl008
  • 浏览: 78478 次
  • 性别: Icon_minigender_1
  • 来自: 浙江
社区版块
存档分类
最新评论

heritrix文档上的一个例子,放这备用

 
阅读更多
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抓取的数据整合到Lucene的搜索框架中,从而实现对网络抓取内容的有效检索。 首先,Heritrix的工作流程包括配置爬虫策略、启动爬虫、抓取网页、存储和归档...

    Heritrix3手册翻译

    在Heritrix 3.0和3.1版本中,引入了一个基于Spring-container的配置系统,这使得设置管理更加灵活。此外,3.X版本的另一个显著改变是采用了一种新的模型,允许在同一个作业目录下重启作业,而无需每次都创建新的作业...

    Heritrix的使用入门

    Heritrix是一个强大的开源Web网络爬虫,由Java编写,主要功能是从互联网上抓取数据,为搜索引擎提供丰富的资源。它的可扩展性是其一大亮点,允许开发者自定义组件以适应不同的抓取需求。Heritrix最初来源于...

    heritrix-1.14.2.zip

    Heritrix 1.14.2 是一个开源的网络爬虫工具,它主要用于抓取互联网上的网页和其他在线资源。这个版本的Heritrix在2007年左右发布,虽然较旧,但它仍然是理解网络爬虫技术的一个重要参考。 Heritrix是一个由Internet...

    heritrix-1.12.1-src.zip与heritrix 配置文档

    heritrix-1.12.1-src.zip与heritrix 配置文档

    heritrix-3.1.0 最新jar包

    Heritrix 3.1.0 是一个强大的网络爬虫工具,主要用于抓取和存档互联网上的网页。这个最新版本的jar包包含了Heritrix的核心功能,为用户提供了一个高效的网页抓取框架。Heritrix的设计理念是模块化和可配置性,使得它...

    Heritrix(windows版)

    1. **heritrix-3.1.0-dist.zip**:这个文件包含了Heritrix的发行版,也就是预编译好的二进制版本。当你下载并解压这个文件后,你可以直接运行它而无需进行任何编译步骤。通常,它会包含启动脚本、配置文件以及必要的...

    heritrix1.14.0jar包

    在使用Heritrix时,"heritrix-1.14.0"这个压缩包文件包含了一系列必要的组件和库,包括核心爬虫引擎、解析器、存储模块以及各种配置文件。解压后,用户通常会找到以下几部分: 1. **bin**:存放可执行脚本,如启动...

    Heritrix的安装与配置

    在本文中,我们将深入探讨如何安装和配置Heritrix 1.14.4版本,这是一个基于Java的爬虫工具。 首先,我们需要从SourceForge网站下载Heritrix的源代码版本,文件名为`heritrix-1.14.4-src.zip`。选择源代码版本的...

    heritrix系统使用.ppt

    Heritrix是一个强大的开源网络爬虫工具,用于批量抓取互联网上的网页。它提供了一种高效、可配置的方式来收集和处理网页数据。本篇将详细解释Heritrix系统的使用、核心概念、工作原理以及关键组件。 首先,Heritrix...

    Heritrix-1.4.4.src.zip +Heritrix-1.4.4.zip

    Heritrix是一个开源的网络爬虫工具,专为大规模网页抓取设计。它是由Internet Archive开发的,允许用户系统地、可配置地抓取互联网上的信息。Heritrix的版本1.4.4是一个较旧但仍然有其价值的版本,因其稳定性而被...

    heritrix源码

    这个“Heritrix源码”压缩包可能包含了Heritrix项目的完整源代码,以及相关的学习资料,对于深入理解Heritrix的工作原理、定制爬虫功能以及进行二次开发非常有帮助。以下将详细介绍Heritrix的关键知识点。 1. **...

    网络爬虫Heritrix1.14.4可直接用

    Heritrix 1.14.4是该软件的一个较早版本,但依然具有广泛的适用性,尤其对于学习和研究网络爬虫技术的初学者而言。 在Heritrix 1.14.4中,主要涉及以下几个核心知识点: 1. **网络爬虫原理**:网络爬虫是自动化...

    Heritrix部署直接能运行的项目

    Heritrix工程始于2003年初,IA的目的是开发一个特殊的爬虫,对网上的 资源进行归档,建立网络数字图书馆,在过去的6年里,IA已经建立了400TB的数据。 IA期望他们的crawler包含以下几种: 宽带爬虫:能够以更高的...

    开发自己的搜索引擎 lucene + heritrix

    在这个过程中,Lucene 和 Heritrix 是两个非常关键的工具,它们分别在搜索引擎的构建中扮演着不同的角色。 首先,Lucene 是一个基于 Java 的开源信息检索库,它为开发者提供了一系列用于构建搜索引擎的工具和接口。...

    Heritrix使用详解与高级开发应用

    Heritrix是一个强大的Java开发的开源网络爬虫,主要用于从互联网上抓取各种资源。它由www.archive.org提供,以其高度的可扩展性而著称,允许开发者自定义抓取逻辑,通过扩展其内置组件来适应不同的抓取需求。本文将...

    开发自己的搜索引擎《lucene2.0+heritrix》一书对应的源码资料

    **Heritrix**: Heritrix是一个开放源代码的Web爬虫,用于抓取互联网上的网页。它具备以下特性: 1. **深度抓取**: 能够按照设定的规则持续深入地抓取网站内容。 2. **定制化**: 支持自定义策略和插件,以适应不同...

    很好的heritrix学习资料

    接下来是"Heritrix使用的初步总结 - 企业应用 - Java - ITeye论坛.mht",这个文件很可能是某个开发者在ITeye论坛上分享的Heritrix使用心得。ITeye论坛是一个中国程序员交流的平台,这类帖子通常包含了实践中的技巧、...

    Heritrix使用手册

    Heritrix 使用手册 全doc 文本

Global site tag (gtag.js) - Google Analytics