论判断一个 URL 是否已经被爬虫处理

时间:2021-01-20 09:00:13

在我的爬虫里面,判断一个 URL 有没有被爬虫处理过,需要经历五层筛选。

1,是否 URL 的深度是否已经超出了配置的最大深度。

2.是否 URL 在起始站点 URL 队列里面。

3.是否已经在预处理队列里面了。

4.是否已经在处理过的队列里面了。

5.是否符合配置的 URL 匹配规则(正则表达式)。

先扯两点与我要描述的重点不相关的。

1.这五个判断应该按这样的顺序来判断,把代价更小,更有可能命中的判断放在前面,有助于提升效率。

2.这五个判断只有第二个不是必须的,但因为这个判断可以直接利用已存在的起始站点 URL 队列,这个队列比较小,代价比较小,如果在这里就把 URL 过滤掉是很幸运的。但这个比较不是必须的,因为开始站点 URL 必然也会出现在预处理队列或者已处理队列里,只不过这两个队列可能很大,相对于开始站点队列,匹配的效率会低一些。所以这一个判断只是用来优化的,不是必须的。

啰嗦了这么多,还没有说到我想说的东西。我想说的是,这个判断流程在链接处理线程与内容分析线程独立的时候,会存在 BUG 。什么?会有BUG?是的。而且这个BUG隐藏的很深。

我们先捋一下处理流程。链接分析线程从网页上获得多个 url ,用上面五个判断进行过滤,得到的有两类结果,一类是继续用于链接分析的 url ,一类是用于内容分析的 url 。这两类结果通过给上面五个判断输入参数达到分类的目的,比如,判断是不是在预处理队列里面时,对于链接分析 url 要判断是不是在链接分析 url 队列里面,而内容分析 url 要判断是不是在内容分析 url 队列里面,类似于此。只有一个判断的参数是一致的,判断是不是在数据库中,用的是一个表进行判断。很容易被忽略,如果一个 url 即用作链接分析也被用作了 内容分析,那么,只有前一个判断是成立的,后一个判断是不成立的,那么它不会被用作后一种判断。这会遗漏很多需要进行分析的 url,所以应该在已处理 url 表中增加属性以标致该 url 用作什么分析。