扩展 Heritrix

我们先来分析一下 Heritrix 的总体结构和 URI 的处理链。

Heritrix 的总体结构

Heritrix 采用了模块化的设计,用户可以在运行时选择要用的模块。它由核心类(core classes)和插件模块(pluggable modules)构成。核心类可以配置,但不能被覆盖,插件模块可以由第三方模块取代。所以我们就可以用实现了特定抓取逻辑的第三方模块来取代默认的插件模块,从而满足自己的抓取需要。

Heritrix 的整体结构如图 18 所示。其中 CrawlController(下载控制器)整个下载过程的总控制者,整个抓取工作的起点,决定整个抓取任务的开始和结束。每个 URI 都有一个独立的线程,它从边界控制器(Frontier)获取新的 URI,然后传递给 Processor chains(处理链)经过一系列 Processor(处理器)处理。

图 18. Heritrix 整体结构

URI 处理流程

处理链由多个处理器组成,共同完成对 URI 的处理,如图 19 所示。

图 19. URI 处理链

1)Pre-fetch processing chain( 预处理链 ),用来判断抓取时的一些先决条件,如 robot 协议、DNS 等。

2)Fetch processing chain(抓取处理链),解析网络传输协议,从远程服务器获取数据。

3)Extractor processing chain(抽取处理链),从网页中抽取新的 URL。

4)Write/index processing chain(写处理链),负责把数据写入本地磁盘。

5)Post-processing chain(后置处理链),在整个抓取解析过程结束后,进行一些扫尾工作,比如将前面 Extractor 解析出来的 URL 有条件的加入到待处理队列中去。这里我们只需要控制加入到待处理队列中的 URL,就可以控制抓取的范围。

扩展 FrontierScheduler 来抓取特定网站内容

FrontierScheduler 是 org.archive.crawler.postprocessor 包中的一个类,它的作用是将在 Extractor 中所分析得出的链接加入到 Frontier 中,以待继续处理。在该类的 innerProcess(CrawlURI) 函数中,首先检查当前链接队列中是否有一些属于高优先级的链接。如果有,则立刻转走进行处理;如果没有,则对所有的链接进行遍历,然后调用 Frontier 中的 schedule() 方法加入队列进行处理。其代码如图 20 所示。

图 20. FrontierScheduler 类中的 innerProcess() 和 schedule() 函数

从上面的代码可以看出 innerProcess() 函数并未直接调用 Frontier 的 schedule() 方法,而是调用自己内部的 schedule() 方法,进而在这个方法中再调用 Frontier 的 schedule() 方法。而 FrontierScheduler 的 schedule() 方法实际上直接将当前的候选链接不加任何判断地直接加入到抓取队列当中了。这种方式为 FrontierScheduler 的扩展留出了很好的接口。

这里我们需要构造一个 FrontierScheduler 的派生类 FrontierSchedulerForBjfu,这个类重载了 schedule(CandidateURI caUri) 这个方法,限制抓取的 URI 必须包含“bjfu”,以保证抓取的链接都是北林内部的地址。派生类 FrontierSchedulerForBjfu 具体代码如图 21 所示。

图 21. 派生类 FrontierSchedulerForBjfu

然后,在 modules 文件夹中的 Processor.options 中添加一行“org.archive.crawler.postprocessor.FrontierSchedulerForBjfu|FrontierSchedulerForBjfu”,这样在爬虫的 WebUI 中就可以选择我们扩展的 org.archive.crawler.postprocessor.FrontierSchedulerForBjfu 选项。如图 22 所示。

图 22. 用 FrontierSchedulerForBjfu 代替 FrontierScheduler

最终抓取的页面如图 23 所示,全部都是 http://www.bjfu.edu.cn下的页面。是不是很简单呢?当然,如果只是想实现这个抓取目标,不用修改源代码,通过在 Web UI 中设置抓取规则也可以满足要求。本文只是以此为例说明 Heritrix 如何扩展 Heritrix。

图 23. 扩展后的抓取效果

Heritrix 拓展Heritrix相关推荐

  1. heritrix 3.2.0 -- 环境搭建

    heritrix作为一个比较经典的开源爬虫,写这篇文章目的是因为,3.X之后的heritrix的介绍以及配置的文章比较少了. heritrix 3.x 以后使用maven 2配置jar包引用,但是总是 ...

  2. crawler4j mysql_Nutch、heritrix、crawler4j优缺点

    Nutch: ApacheNutch是一个高度可扩展的和可伸缩的开源网页爬虫软件项目.源于ApacheLuceneTM,项目多样化,目前由两个代码库组成,即: 1.     Nutch1.x:一个非常 ...

  3. 爬虫技术框架——Heritrix

    Heritrix是一个由Java开发的开源Web爬虫系统,用来获取完整的.精确的站点内容的深度复制, 具有强大的可扩展性,运行开发者任意选择或扩展各个组件,实现特定的抓取逻辑. 一.Heritrix介 ...

  4. heritrix mysql_Heritrix使用小结

    1.Heritrix 简介 Heritrix是一个专门为互联网上的网页进行存档而开发的网页检索器.它使用Java编写并且完全开源.它主要的用户界面可以通过一个web流量器来访问并通过它来控制检索器的行 ...

  5. java heritrix_「heritrix」开源爬虫: Heritrix 3.1 Windows 上安装/使用 - seo实验室

    heritrix 目前 Heritrix 的最新版本是 3.1.0(2011-10-21 发布) http://blog.sina.com.cn/s/blog_5f54f0be0101hcy8.htm ...

  6. Heritrix Eclipse下环境配置

    在http://sourceforge.net/projects/archive-crawler/files/archive-crawler%20%28heritrix%201.x%29/1.14.4 ...

  7. Heritrix Eclipse配置和使用

    1.首先在 Eclipse 中新建 Java 工程 ,工程名自取,以MyHeritrix为例.利用下载的源代码包根据以下步骤来配置这个工程. 2.导入类库 Heritrix 所用到的工具类库都在 he ...

  8. 利用 Heritrix 构建特定站点爬虫

    本文由浅入深,详细介绍了 Heritrix 在 Eclipse 中的配置.运行.最后对其进行扩展,介绍如何实现只抓取特定网站的页面. 通过本文,读者可以了解 Heritrix 的相关特点以及在 Ecl ...

  9. 使用Heritrix进行主题抓取

    一.配置Heritrix项目 1.下载heritrix编译后的字节码包与源码包 heritrix-1.14.4.zip heritrix-1.14.4-src.zip 注:以下文件未强调时均为源码包中 ...

最新文章

  1. mysql.err日志分析_Mysql日志解析
  2. 从一个页面跳转到用swiper写的全屏滚动页面的指定位置
  3. c++ 函数模板_C/C++编程笔记:C++入门知识,深入解析C++函数和函数模板
  4. linux lynx 源码,Lynx字符浏览器移植
  5. mysql数据库分表备份脚本_mysql 分库分表备份脚本
  6. 代码缺乏装饰?使用ts装饰器来装饰你的代码
  7. 使用HTTPS和OAuth 2.0保护服务到服务的Spring微服务
  8. RoboWare Studio 安装教程与可能问题解决
  9. 北京航空航天大学计算机科学与技术考研科目,2022北京航空航天大学计算机科学与技术考研备考指导-参考书、分数线...
  10. web常见的五种前端布局方式
  11. C#编程,使用 Roslyn引擎动态编译代码
  12. Hello World with Ant
  13. Redis学习之lpush命令
  14. 不爱,就收起暧昧走开...
  15. 一步完成最小二乘法、递推最小二乘法、增广最小二乘法、广义最小二乘法、辅助变量法、二步法辨识(传递函数)
  16. iOS/MAC 数据压缩与解压缩及常用算法 LZMA、ZLIB
  17. L. Lifeguards(平面几何 点平分成两边)
  18. H5 移动端富文本编辑器
  19. 如何打造陆金所营销活动配置发布平台
  20. python人脸检测代码_python实现人脸识别代码

热门文章

  1. 19年电赛经验总结-应该如何准备电赛
  2. IM即时通讯软件开发之扫码登录功能
  3. 云原生Istio案例实战
  4. vue项目中如何利用lodop控件实现多页打印
  5. 汽车电控转向助力技术(EPS)
  6. m基于K-means聚类算法和神经网络的模糊控制器设计matlab仿真
  7. VirtualNES虚拟红白机
  8. termux获取sd卡读写权限_索尼发布“世界最快”USB-C Hub及TOUGH SF-M系列SD卡
  9. STM32MP157驱动开发——Linux RS232/485/GPS 驱动
  10. 什么是 HTTP 协议