本节来看看crawler4j是如何支持robots协议的。对robots协议的支持主要目的就是遵守礼貌爬取,即:按照服务器制定的规则来爬取,只抓取允许抓取的,不让抓的不抓。
在crawler4j中对robots的支持包括如下几个类:RobotstxtConfig,RobotstxtServer,HostDirectives,RuleSet,RobotstxtParser。
首先简单介绍一下上述几个类的主要作用:
RobotstxtConfig:存放了robots相关的配置,如是否开启robots,cache的大小,以及user-agent。。
RobotstxtServer:robots的主类,存放cache规定大小的robots项,实现对外的robots功能,后面详解介绍
HostDirectives:一个host的robots记录,实现具体的robots规则。
RuleSet:存放具体的robots条目,包括:allow和disallow。
RobotstxtParser:负责将得到的robots文件解析成具体的robots条目。
下面我们从如下三个方面来展开分析:
robots记录的访问,缓存的更新策略,记录的存放。
Robots记录的访问:
整个robots模块对外的接口只有一个,即:RobotstxtServer.allows(WebURL webURL),这个接口在两个地方被调用,一个是往Frontier中增加seedUrl时,另个是将新发现
的Url往Frontier中增加的时候。而这个函数就实现了对robots缓存的访问,在RobotstxtServer中robots记录按照host为单位来存放:
protected final Map<String, HostDirectives> host2directivesCache = new HashMap<>();
下面就看看allows函数的实现流程,先看源码: