Heritrix3.3.0源码阅读 动态加载种子

原创 2015年11月18日 16:38:23

Heritrix3.3.0有一个很实用的功能,就是在抓取开始之后,依然可以通过在指定目录里放入种子文件的方式向爬虫添加新的种子。接下来,我们就来看看这个功能是怎样实现的。

这个功能是在org.archive.crawler.framework包下的ActionDirectory类实现的,这个类去掉内容后是这个样子的:

public class ActionDirectory implements ApplicationContextAware, Lifecycle, Runnable 

可以看到,它实现了Runnable接口,那么,我们就来看看它的run方法:

    /** 
     * Action taken at scheduled intervals
     * @see java.lang.Runnable#run()
     */
    public void run() {
        scanActionDirectory();
    }

run方法又直接调用了scanActionDirectory方法:

    /**
     * Find any new files in the 'action' directory; process each in
     * order. 
     * 
     * 在action目录下寻找新文件
     */
    protected void scanActionDirectory() {
        File dir = actionDir.getFile();
        File[] files = dir.listFiles((FileFilter)FileFilterUtils.fileFileFilter());
        Arrays.sort(files); 
        for(File f : files) {
            try {
                actOn(f);
            } catch (Throwable e) {
                LOGGER.log(Level.SEVERE,"unhandled exception from actifile: "+f,e);
            }
        }
    }

这个方法在action目录下寻找新的文件,并把发现的文件交给了actOn方法处理。这里有两个问题需要注意:(1)action目录(2)actOn方法。

首先看看存放新文件的目录action的声明:

    protected ConfigPath actionDir = 
        new ConfigPath("ActionDirectory source directory","action");

不要ConfigPath类的具体内容困扰,我们只需要从字面意思来理解就够了,它表示了一个配置路径。这里它定义了我们关注的action目录,该目录默认被设置为action。如果大家曾经用过Heritrix3.3.0(版本3都一样),而且没有去设置过这个值,你会在你的项目录下的jobs目录下的具体job目录下发现名为action的目录,那个目录就是这里所讲的action目录。也就是说,Heritrix默认情况下是去那个action目录下发现新文件的。

从scanActionDirectory方法中可以看到,发现的新文件交给了actOn方法。这个方法在Heritrix3.3.0源码阅读 种子模块(观察者模式实践)一文中已经讲过,它用于从种子文件中读取种子,并发布给观察者。

到此,我们已经清楚了ActionDirectory类加载种子文件和发布种子的流程。接下来,就来看看ActionDirectory如何利用这个流程来实现“动态”载入种子的。其实我们自己就能猜出来,应该是用定时任务,事实也是这样的。

ActionDirectory类里有这个方法:

    public void start() {
        if (isRunning()) {
            return;
        }
        try {
            // create directories
            org.archive.util.FileUtils.ensureWriteableDirectory(getActionDir().getFile());
            org.archive.util.FileUtils.ensureWriteableDirectory(getDoneDir().getFile());
        } catch (IOException e) {
            throw new IllegalStateException(e);
        }
        // start background executor
        executor = Executors.newSingleThreadScheduledExecutor();
        executor.scheduleWithFixedDelay(this, getInitialDelaySeconds(), getDelaySeconds(), TimeUnit.SECONDS);
    }

这个方法被调用来启动定时任务。定时任务是通过执行器实现的,而不是Timer。如果大家不知道执行器,可以百度一下,或者看看《java核心技术卷一》十三章关于执行器那一节。

到此,我们搞清楚了Heritrix3.3.0是如何实现动态载入种子的了:用一个定时任务从指定目录加载种子文件,发布文件里的种子。


版权声明:本文为博主原创文章,未经博主允许不得转载。

在Eclipse下运行Heritrix3.2.0(环境windows10 64位)

在Eclipse下运行Heritrix3.2.0(环境windows10 64位)
  • tdtcn
  • tdtcn
  • 2016年04月14日 18:00
  • 1310

Heritrix3.3.0-环境搭建(maven项目)

Heritrix3.3.0是maven项目,但是当我们把它导入eclipse里后,总是有一些jar包不能下载下来,导致项目无法正常。网上有介绍把它改为普通java项目并利用发布版lib目录下的jar包...
  • l294265421
  • l294265421
  • 2015年11月09日 13:15
  • 2339

Heritrix3.3.0源码阅读 让爬虫停不下来

在文章Heritrix3.3.0源码阅读 动态加载种子中说过,Heritrix3.3.0有一个很实用的功能,就是在抓取开始之后,依然可以通过在指定目录里放入种子文件的方式向爬虫添加新的种子,这是通过定...
  • l294265421
  • l294265421
  • 2015年12月31日 13:29
  • 801

Heritrix3.x蜘蛛配置&使用

网络爬虫是一个自动提取网页的程序,它为搜索引擎从万维网上下载网页,是搜索引擎的重要组成。 传统爬虫从一个或若干初始网页的URL开始,获得初始网页上的URL,在抓取网页的过程中,不断从当前页面上抽取新的...
  • yx511500623
  • yx511500623
  • 2013年09月11日 15:22
  • 2418

Heritrix3.3.0源码阅读 允许重复下载

Heritrix3.3.0的org.archive.crawler.datamodel.UriUniqFilter接口提供对下载的uri的唯一性保证,它的子类org.archive.crawler.u...
  • l294265421
  • l294265421
  • 2016年01月21日 14:43
  • 551

Heritrix3.3.0源码阅读 crawler-beans.cxml中URI过滤规则的配置

--> -->
  • l294265421
  • l294265421
  • 2015年11月09日 12:43
  • 1059

网络爬虫系统Heritrix的结构分析 (个人读书报告)

摘要        随着网络时代的日新月异,人们对搜索引擎,网页的内容,大数据处理等问题有了更多的要求。如何从海量的互联网信息中选取最符合要求的信息成为了新的热点。在这种情况下,网络爬虫框架heri...
  • smith789
  • smith789
  • 2014年04月22日 16:14
  • 3690

Heritrix源码分析(一)——包介绍

想了很久,还是先从Heritrix的包开始说起,然后再说类,最后讲下如何加工Heritrix,也就是将其打造成自己想要的爬虫,这里补充下,我用的版本是1.14.3.     同时欢迎加入我建的Her...
  • tian447922873053
  • tian447922873053
  • 2014年05月01日 16:13
  • 401

开源爬虫: Heritrix 3.1 Windows 上安装/使用

目前 Heritrix 的最新版本是 3.1.0(2011-10-21 发布) http://blog.sina.com.cn/s/blog_5f54f0be0101hcy8.html 讲了 1....
  • xiaomin1991222
  • xiaomin1991222
  • 2016年03月10日 16:05
  • 1001

有关阅读JDK源码的看法

源码阅读,我觉得最核心有三点:技术基础+强烈的求知欲+耐心。  说到技术基础,我打个比方吧,如果你从来没有学过Java,或是任何一门编程语言如C++,一开始去啃《Core Java》,你是很难从...
  • mijinghjb
  • mijinghjb
  • 2014年04月25日 16:49
  • 3116
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Heritrix3.3.0源码阅读 动态加载种子
举报原因:
原因补充:

(最多只允许输入30个字)