赞
踩
对网络爬虫有一定了解的小伙伴们应该都知道,网络爬虫在爬取信息的时候,为了避免爬虫爬到重复数据、爬虫陷入死循环等问题,我们就需要对URL去重。
目录
字面意思,去除相同的URL,使得爬虫在爬取过程中尽可能少的爬取重复数据。
反过来说,就是不对URL进行去重,会产生那些问题呢?
上面的问题是怎么产生的呢?
首先,我们要明确一点,URL去重是应用于网络爬虫(不知道什么是网络爬虫自己度娘一下)的。
单机版 (这里的单机版指的是一台机器):
单机版中URL去重体现在: 爬取每一个页面前,先看看以前是否已经爬取过这个页面,如果没有爬取过就爬取,否则直接跳过。
分布式:
分布式爬虫中URL去重体现在:维护一个不重复的请求队列。
这里以3个url为例:一个页面中会包括多个超链接,而所有的超链接都是我们可能要爬取的目标。
我们假设url1中有url2的超链接,url2有url3的超链接,url3又有url1的超链接,那么这三个页面就可以构成下面的关系。
相信聪明的你已经看出了端倪,如果再多几个页面,那么这些页面就形成了一个网(有回路),这是网络爬虫不对url去重而会陷入死循环的原因。
所以,要想编写出功能强大的网络爬虫,url去重是必不可少的。
列表优点:简单易操作
缺点:每次添加URL到列表之前,都要先查询一下是否已存在,非常耗费时间和内存空间。
集合优点:对比list来说,省去了过多的查询,节省了一些时间和内存空间
缺点:耗费内存空间较大,如果有一亿条URL,一个URL50字符:
100000000 * 50字符 * 2byte / 1024 / 1024 / 1024 约= 9.3GB
优点:对比单纯使用set来说,md5加密方式大大缩小了占用内存空间
缺点:耗费内存空间还是很大,如果有一亿条URL,一个URL16字节:
100000000 * 16byte / 1024 / 1024 / 1024 约= 1.4GB
优点:对比使用set+md5来说,位图的方式将空间占用缩小到了极限。如果有一亿条URL,一个URL1位:
100000000 / 8bit / 1024 / 1024 / 1024 约= 12M
缺点:产生哈希冲突的可能性很大。
优点:对比使用bitmap来说,BloomFilter降低了的哈希冲突的出现率。
缺点:对比bitmap方式来说,BloomFilter较多的耗费内存空间,有一定的误识别率和删除困难。
不存在漏报(False Negative),即某个元素在某个集合中,肯定能报出来。
可能存在误报(False Positive),即某个元素不在某个集合中,可能也被爆出来。
总结一下:
1、list : 简单易操作,耗费内存空间多,耗费资源多
2、set:比list耗费资源少
3、set+md5:比set耗费内存空间少(scrapy-redis中使用的就是类似这种的)
4、bitmap: 耗费内存空间最少,产生hash冲突的概率极大。
5、boomfilter: 耗费内存空间比bitmap多一点,产生hash冲突的概率比bitmap小一些,但是可能存在误报,而且删除困难。
最后多说一点:去重是一种思想,去重并不是只能用在url上,还可以用在任何东西上。比如说:爬取100万首音乐,就可以用去重来保证爬取到的音乐的内容不重复。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。