我们都知道在获取网站的各层url的过程中,每一层都会有相互指向的url,这样就形成了一个闭合的url网络,那么要想实现爬虫一步步获取url,不陷入死循环,必须进行去重的操作
1.将访问过的url保存到数据库中
这种方式是最简单方式,当我们在获取下一个url的时候,就到数据库中查询这个url是否存在,虽然数据库有缓存,但是每个url都从数据库中查找,这样以来效率会非常的低,但是这种方式操作起来比较简单。
2.将访问过的url保存到set中,主需要o(1)的代价就可以查询url
第二种方式就是将url保存到内存当中,在取url的过程中就可以很快拿到。这种方法的缺点就是,随着不断查询,内存占率空间就会逐步加大,假设一个大型网站有1亿条url,每条url有50个字符,python中按照unicode编码,假设有2个byte。那么按照下面的公式就能计算出,所需要的内存空间为9G。
100000000*2byte*50个字符/1024/1024/1024 = 9G
3. url经过md5等方法哈希后保存到set中
使用md5编码就可以将字符缩减到固定的长度,用于解决第二种方法中内存占用过度的问题
4.用bitmap方法,将访问过的url通过hash函数映射到某一位
如果还想将内存占用进一步压缩,就可以使用这种方法。它可以申请8个位,以0,1映射到位置当中,以0,1及位置,表明url是否存在。但是这种方法的冲突非常高。
5.bloomfilter方法对 bitmap进行改进,多重hash函数降低冲突
这种方法改进了bitmap方法,通过多个方法改进了重复的可能性。