Heritrix源码分析(八) Heritrix8个处理器(Processor)介绍(转)
本博客属原创文章,欢迎转载!转载请务必注明出处: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抽取到的所有链接,循环将他们放入调度中心,以便下次可以抓取
最新文章
- Firemonkey TComboBox 下拉菜单字型修改方法 (D10)
- Nginx中防盗链(下载防盗链和图片防盗链)操作记录
- yafphp框架
- style=";display";之后不能获取offsetHeight或clientWidth这类测量的值
- 系统调用表 linux 2.6.32
- iOS开发经验总结(上)
- js 数组引用 发现的问题
- python之6-2高阶函数
- 数据库中的T-sql语句 条件修改 高级查询
- 【2017集美大学1412软工实践_助教博客】团队作业3——需求改进&;系统设计 成绩公示
- Python2/3中的urllib库
- vuex Loding加载..
- hashCode方法和equals方法比较
- python -- Pythonic
- ubuntu 16.04 的IP地址变更
- leecode第一百三十六题(只出现一次的数字)
- liunx文件操作 文件查看
- AnimDynamics简介
- 【Spark】Spark-性能调优-系列文章
- [datatable]排序时指定某列不可排序
热门文章
- mysql 存储过程事务
- FZU Problem 2148 Moon Game (判断凸四边形)
- 使用 Nginx 和 GeoIP 模块来处理不同国家的访问
- log4j打印日志配置
- CentOS查看系统信息命令和方法
- struts2与struts1整合,Unable to load configuration. - interceptor-ref ... struts.xml
- awk文本处理知识汇总
- 《Linux/Unix系统编程手册》读书笔记8 (文件I/O缓冲)
- PowerDesigner建立与数据库的连接,以便生成数据库和从数据库生成到PD中。
- allegro下快捷键设置[转贴]