在我的爬虫里面,判断一个 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 用作什么分析。