本博客属原创文章,欢迎转载!转载请务必注明出处:http://guoyunsky.iteye.com/blog/643367

      本博客已迁移到本人独立博客: http://www.yun5u.com/

      欢迎加入Heritrix群(QQ):109148319,10447185 , Lucene/Solr群(QQ) :  118972724

Heritrix采用多线程去抓取数据,每次运行基本都要经过以下8个处理器处理(种子URL、先决条件URL除外),如此形成一整个流程。下面就大概介绍下每个处理器的作用以及大概处理的步骤。以后分析源码的时候再细节分析......

8个处理器都继承org.archive.crawler.framework.Processor类,然后每个处理器都有自己的子类实现。同时相近处理器用org.archive.crawler.framework.ProcessorChain去管理,比如FetchDNS和FetchHTPP都用于获取网页内容,所以属于同一个ProcessorChain。这里8个处理器其实就是8个ProcessorChain,每个处理器用户都可以自己实现。而管理ProcessorChain同时又用ProcessorChainList去管理,不过这个相对简单。Heritrix通过配置文件order.xml中获取各个子类,然后通过反射将他们加入到每个要处理的URL中,然后在线程中迭代ProcessorChainList获得每个ProcessorChain,然后又迭代每个ProcessorChain获得每个Processor,最后运行Processor的子类,完成一整个处理流程。整个处理流程都以URL贯穿(Heritrix封装URL为CrawlURI和CandidateURI),对于每个处理器运行的结果都会更新到URL上,当然不一样的结果会有不一样的属性,以后会重点介绍CrawlURI和CandidateURI这两个类。下面就大概介绍下每个处理的作用以及大概的处理流程:

1.Preselector 预选处理器,预先处理URL看其是否要继续处理,通过这个可以过滤一部分或者全部URL
                 1)<boolean name="block-all">false</boolean>,如果为true则表示阻止一切URL,接下来Heritrix不会运行任何抓取
                 2)<string name="allow-by-regexp"></string>,查看是否通过里面的正则表达式,通过则继续运行,如果不通过,该URL将不再会被处理
                 3)<string name="block-by-regexp"></string>,查看是否不通过里面的正则表达式,通过则URL不再会被处理,如果不通过则该URL会继续被处理

2.PreconditionEnforcer 抓取先决条件处理器,先处理一些先要处理的URL,这里主要是该URL的DNS解析
                 1)先查看该URL是否有先决条件URL要处理,如果有的话先将该URL的先决条件URL放入调度器,而该URL将跳过PreconditionEnforcer处理器
                 2)如果以上该URL没有先决条件URL要处理,则运行以下环节:
                         i)先验证该URL的schema,如果不是http或者https则退出该处理器
                         ii)如果以上验证该shema是http或者https,则先验证该URL是否可以通过爬虫协议,如果没有通过爬虫协议则退出本处理器,反之则验证该URL自身是否是先决条件以及是否通过登录凭证,如果该URL自身不是先决条件URL并且没有通过登录凭证则也退出本处理器
   
        3.Fetch  获取处理链,主要用于获取网页内容,对于不同的shcema有不同的处理器,如针对DNS有FetchDNS,对于HTTP则是FetchHttp,这里依次介绍(如果该URL是种子URL这个处理链不会处理):
                 3.1 FetchDNS:获取DNS数据,这里采用第三方JAR包(dnsjava.jar)
                        1)首先获取该URL的DNS名字,然后通过DNS名字从缓存中获取CrawlHost
                         2)验证该URL的DNS名字是否通过第四代IP命名,如果不通过则退出本处理器
                         3)如果以上通过,则开始获取DNS数据,同时记录开始获取以及成功获取时间,最后将DNS数据保存在本地文件(scratch文件)以及更新该URL状态以及该URL的CrawlHost的IP、时间等数据
                 3.2 FetchHTTP: 获取HTTP数据,这里采用HttpClient包去获取,通过Heritrix也封装了该包
                        1)获取HTTP数据的前提是,该URL的schema为http或者https以及该URL所属的DNS数据已经获取,如果两者不具备则跳出本处理器
                       2)如果以上通过,则统计这个处理器处理的URL个数,以及开始获取HTTP内容,然后将内容保存在本地文件(scratch文件)

4.ExtractorHTTP 抽取链,主要用于从URL内容中抽取出新的URL,这里只处理shcema为http或者https的url,针对不同的URL有不同的抽取器,如JS:ExtractorJS,CSS:ExtractorCSS,Html:ExtractorHTML,(如果该URL是种子URL这个处理链不会处理
          这里主要是通过正则表达式从网页文本内容中抽取出URL,主要是ExtractorHTML类

5.WriterProcessor:写处理器,主要将从FetchHttp里获取的网页内容写入本机

6.CrawlStateUpdater 抓取状态更新处理器,只针对http或者https
               1)计算该Server(一个DNS为一个Server)下连接错误的URL个数
               2)如果该URL为爬虫协议(http://xxx/robots.txt),则更新爬虫协议robots.txt

7.LinksScoper 链接接范围验证处理器,主要验证该URL抽取出来的链接是否在范围
              1)  先验证该URL是否有先决条件URL要先处理,有的话先验证该先决条件URL是否在范围同时退出该处理器
              2) 如果以上没有先决条件URL要先处理,则获取该URL抽取到的链接,然后循环验证每个链接是否在范围,不在范围则过滤掉

 8.FrontierScheduler 调度处理器,将URL放入调度中心,以便接下来可以抓取
              1) 先验证该URL是否有先决条件URL要先处理,有的话则将该先决条件URL放入调度中心,同时退出该处理器
              2) 如果以上该URL没有先决条件URL要处理,则获取该URL抽取到的所有链接,循环将他们放入调度中心,以便下次可以抓取

Heritrix源码分析(八) Heritrix8个处理器(Processor)介绍(转)的更多相关文章

  1. Heritrix源码分析(十四) 如何让Heritrix不间断的抓取(转)

    欢迎加入Heritrix群(QQ):109148319,10447185 , Lucene/Solr群(QQ) :  118972724 本博客已迁移到本人独立博客: http://www.yun5u ...

  2. Heritrix源码分析(九) Heritrix的二次抓取以及如何让Heritrix抓取你不想抓取的URL

    本博客属原创文章,欢迎转载!转载请务必注明出处:http://guoyunsky.iteye.com/blog/644396       本博客已迁移到本人独立博客: http://www.yun5u ...

  3. Heritrix源码分析(十四)

    近段时间在搞定Lucene的一些问题,所以Heritrix源码分析暂时告一段落.今天下午在群里有同学提到了Heritrix异常终止的问题以及让Heritrix不停的抓取(就是抓完一遍后载入种子继续抓取 ...

  4. springMVC源码分析--ViewNameMethodReturnValueHandler返回值处理器(三)

    之前两篇博客springMVC源码分析--HandlerMethodReturnValueHandler返回值解析器(一)和springMVC源码分析--HandlerMethodReturnValu ...

  5. ABP源码分析八:Logger集成

    ABP使用Castle日志记录工具,并且可以使用不同的日志类库,比如:Log4Net, NLog, Serilog... 等等.对于所有的日志类库,Castle提供了一个通用的接口来实现,我们可以很方 ...

  6. Vue.js 源码分析(八) 基础篇 依赖注入 provide/inject组合详解

    先来看看官网的介绍: 简单的说,当组件的引入层次过多,我们的子孙组件想要获取祖先组件的资源,那么怎么办呢,总不能一直取父级往上吧,而且这样代码结构容易混乱.这个就是这对选项要干的事情 provide和 ...

  7. Heritrix源码分析(十五) 各种问题总结(转)

    开博客以及建立Heritrix 群有一段时间了(这里谢谢大家的关注),这篇博客将整理这段时间所遇到的问题.同时由于自己从今年5月份开始就不怎么接触Heritrix,很多东西开始遗忘(不过里面思想没忘) ...

  8. Heritrix源码分析(十三) Heritrix的控制中心(大脑)CrawlController(二)

    本博客属原创文章,欢迎转载!转载请务必注明出处:http://guoyunsky.iteye.com/blog/650744      本博客已迁移到本人独立博客: http://www.yun5u. ...

  9. Heritrix源码分析(七) Heritrix总体介绍(转)

    本博客属原创文章,欢迎转载!转载请务必注明出处:http://guoyunsky.iteye.com/blog/642794         本博客已迁移到本人独立博客: http://www.yun ...

随机推荐

  1. 饶有兴致的用javascript做了个贪食蛇游戏

    09年写的东西.一直藏在自己的记事本里头,现在开始整理写博客,所以直接搬过来 先上效果图 再添代码: <HTML> <HEAD> <TITLE>贪吃蛇 Snake ...

  2. JS之事件(一)

    事件:交互 异步监听,不是JS引擎监听的 一.绑定 1.ele.onxxxx(eg:onclick) = function (e) { //回调函数/事件处理函数 } 兼容性很好,但同一个事件仅能绑定 ...

  3. sql openrowset

    select * from openrowset('sqloledb','ip';'user';'pwd','exec 库..过程') 

  4. UITableViewController 滚动引起的cocos2d动画暂停问题的解决

    UITableViewController 滚动引起的cocos2d动画暂停问题的解决 之前在使用UITableViewController进行滚动时,cocos2d的动画会暂停,直至滚动完毕才会继续 ...

  5. 2016CVTE编程题:兔子藏洞

    兔子藏洞 题目描述 一只兔子藏身于20个圆形排列的洞中(洞从1开始编号),一只狼从x号洞开始找,下次隔一个洞找(及在x+2号洞找),在下次个两个洞找(及在x+5号洞找),以此类推...它找了n次仍然没 ...

  6. Log4J入门教程(一) 入门例程

    Log4J的入门简介学习 简介: Log4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台.文件.GUI组件.甚至是套接口服务器.NT的事件记录器.U ...

  7. android-exploitme(七):高级加密

    在上一个议题上我们解释了为什么不能把信息明文保存在设备上,应该加密,那么加密就是安全的吗? 下面来看一下, 编译BasicEncryptionSolution.apk,安装

  8. C编译器剖析PDF文档及UCC编译器162.3

    http://blog.csdn.net/sheisc/article/details/42387857 http://blog.csdn.net/sheisc/article/details/455 ...

  9. MyBatis学习总结_07_Mybatis缓存

    一.MyBatis缓存介绍 正如大多数持久层框架一样,MyBatis 同样提供了一级缓存和二级缓存的支持 一级缓存: 基于PerpetualCache 的 HashMap本地缓存,其存储作用域为 Se ...

  10. JSP列表形式显示数据库中的数据 OracleCachedRowSet 实例

    现在数据库中有一张用户表,希望用户在jsp页面中输入用户名和密码以及 用户类型,在servlet中插入数据库后,在另一个jsp页面中把数据库中所有的用户名和类型都以列表的形式列出来    可以用Ora ...