Python网络爬虫之URL去重方法:本地内存,Redis,布隆过滤器

URL去重应用URL去重广泛应用于网络爬虫方面,主要体现在以下两点:

  1. 实现增量爬虫时,需要判断哪些网页已经爬取了,哪些网页是新产生的,对新产生的网页,增量爬虫需要抓取其内容;
  2. 避免爬虫出现“死循环”,由于网络间链接非常复杂,爬虫在爬取数据时,容易出现闭环的死循环现象,重复做无用功,无法爬取新的内容,为了避免出现死循环,需要让爬虫知道哪些URL已经爬取了,已爬取的URL不再访问 。
几种URL去重方法介绍
  • 使用关系型数据库对URL去重
点评:使用关系型数据库查询URL是否存在,进而实现URL去重,这种方式效率低,速度慢,数据量越大查询越慢,不推荐!
  • 使用类Python set数据结构(内存去重)
又可以分为两种方法:使用Python set结构直接存储URL去重,或者存储URL对应的MD5来去重;
两种方法是基于内存去重,但第二种方法优势在于降低了内存的消耗 。
假设存储1亿个不同的URL,每个URL平均长度为80个字符:
  1. 通过Python set结构存储URL,消耗的内存大小为7.45GB
  2. 通过Python set结构存储URL对应的MD5,消耗的内存大小为2.98GB
关于内存消重,能够实现数据快速去重,但受制内存大小的限制,这就决定了去重数据量规模,如果是十亿级,百亿级URL消重,就无法应付了;同时内存去重还有一个问题就是数据持久化问题:主机意外故障,内存数据将不复存在 。
  • 使用redis数据库去重,利用Redis中的set数据结构(内存去重)
也是基于内存去重,Redis数据库有集合数据类型,可以直接存储URL去重,或者存储URL对应的MD5来去重;
优势在于:便于分布式爬虫共用同一份消重数据,保证了数据一致性,而且支持数据持久化;
缺点在于:同样,受制于内存大小限制,如果是十亿级,百亿级URL消重,就无法应付了;
  • 使用布隆过滤器(BloomFilter)实现URL去重
布隆过滤器是一种去重算法,这种去重方法占用内存极低,基本上可以忽略内存大小对去重数据量的限制;但是有一个问题,存在低概率的误报 。
最终URL去重方案综合以上URL去重方法,URL最终的去重方案为:
  • 内存去重:基于Redis数据库,存储URL对应的MD5,实现百万或千万级数据量消重方案,可以满足大多数中型爬虫业务需要
  • 布隆过滤器(BloomFilter)+ Redis方案 :上亿甚至十几亿海量数据消重方案,满足大型爬虫业务需要
最后根据业务场景需求,选择合适的去重方式!
以上两点核心问题在于如何实现快速去重方法 。
最后有关布隆过滤器介绍,及Python版实现,会在后续文章重点介绍,敬请期待!

【Python网络爬虫之URL去重方法:本地内存,Redis,布隆过滤器】


    推荐阅读