URL去重应用URL去重广泛应用于网络爬虫方面,主要体现在以下两点:
- 实现增量爬虫时,需要判断哪些网页已经爬取了,哪些网页是新产生的,对新产生的网页,增量爬虫需要抓取其内容;
- 避免爬虫出现“死循环”,由于网络间链接非常复杂,爬虫在爬取数据时,容易出现闭环的死循环现象,重复做无用功,无法爬取新的内容,为了避免出现死循环,需要让爬虫知道哪些URL已经爬取了,已爬取的URL不再访问 。
- 使用关系型数据库对URL去重
- 使用类Python set数据结构(内存去重)
两种方法是基于内存去重,但第二种方法优势在于降低了内存的消耗 。
假设存储1亿个不同的URL,每个URL平均长度为80个字符:
- 通过Python set结构存储URL,消耗的内存大小为7.45GB
- 通过Python set结构存储URL对应的MD5,消耗的内存大小为2.98GB
关于内存消重,能够实现数据快速去重,但受制内存大小的限制,这就决定了去重数据量规模,如果是十亿级,百亿级URL消重,就无法应付了;同时内存去重还有一个问题就是数据持久化问题:主机意外故障,内存数据将不复存在 。
- 使用redis数据库去重,利用Redis中的set数据结构(内存去重)
优势在于:便于分布式爬虫共用同一份消重数据,保证了数据一致性,而且支持数据持久化;
缺点在于:同样,受制于内存大小限制,如果是十亿级,百亿级URL消重,就无法应付了;
- 使用布隆过滤器(BloomFilter)实现URL去重
最终URL去重方案综合以上URL去重方法,URL最终的去重方案为:
- 内存去重:基于Redis数据库,存储URL对应的MD5,实现百万或千万级数据量消重方案,可以满足大多数中型爬虫业务需要
- 布隆过滤器(BloomFilter)+ Redis方案 :上亿甚至十几亿海量数据消重方案,满足大型爬虫业务需要
以上两点核心问题在于如何实现快速去重方法 。
最后有关布隆过滤器介绍,及Python版实现,会在后续文章重点介绍,敬请期待!
【Python网络爬虫之URL去重方法:本地内存,Redis,布隆过滤器】
推荐阅读
- python 进程、线程、协程对比
- python:教你用爬虫通过代理自动刷网页的浏览量
- python正则表达式re模块的高级用法
- python求解最大子序列问题,子序列可连续或不连续
- 手机也能有线上网?比Wi-Fi更快、更稳定的网络连接方式
- 手机微信不能上网 微信网络连接不可用
- 两个男生击剑什么感觉 击剑什么梗
- 远控木马Remcos新变种改变传播策略,开始走网络钓鱼电子邮件路线
- Python处理session最简单的方法
- Python:如何判断一个url是以http开头的?