这节我们来看看crawler4j中的URL管理机制--Frontier的设计和实现。
总体上来讲,crawler4j的Frontier提供了如下一些功能,大部分都是URL队列应该有的基本功能:
(1)URL的获取,URL的保存,以及删除。
(2)不同类型URL的统计,如放入队列的URL总数和已处理的URL总数
(3)恢复上次爬取中没有处理完的URL(已经从URL队列中取出,但还没有处理)
URL的保存使用了oracle 的je数据库,其内部采用BTree结构实现,支持重复键,事务和锁机制,因此,不仅查询和插入都比较块,并且支持高的并发性,同步什么都不是问题。在crawler4j中除了URL之外,还有实现URL去重的结构,记录正在处理的URL以及计数器都是通过JE来实现。
首先谈谈第一个和第二个功能
所有即将爬取的URL都放在一个待爬取队列WorkQueues中,这个队列内部的URL按照如下顺序排列:优先级,深度,docID,即:优先级越高,深度越小,docID越小
的URL越早被爬取。这里的优先级用户可以自己基于某个准则指定,深度为当前URL在整个爬取过程中被发现的层次,docID为被发现的顺序。由此可知,当一个新的URL被插入到队列中后,其所处位置也就已经确定,这个插入操作是由JE内部来保证的,在JE内部每个URL都以字节来存放,JE会按照上述三元组构成的KEY来