爬虫中的去重处理方法详解
-
去重实现的基本原理
-
根据给定的判断依据和给定的去重容器,将原始数据逐一进行判断,判断去重容器中是否有该数据。如果没有那就把该数据对应的判断依据添加去重容器中,同时标记该数据是不重复数据;如果有就不添加,同时标记该数据是重复数据。
-
判断依据(原始数据、原始数据特征值)
-
去重容器(存储判断数据) set()
-
-
根据原始数据进行去重判断
根据原始数据的特征值进行去重判断
临时去重容器与持久化去重容器
- 临时去重容器指如利用list、set等编程语言的数据结构存储去重数据,一旦程序关闭或重启后,去重容器中的数据就被回收了。
- 使用与实现简单方便;但无法共享、无法持久化
- 持久化去重容器指如利用redis、mysql等数据库存储去重数据。
- 持久化、共享;但使用与实现相对复杂
1 .基于信息摘要算法的去重
-
信息摘要hash算法指可以将任意长度的文本、字节数据,通过一个算法得到一个固定长度的文本。 如MD5(128位)、SHA1(160位)等。
-
特征:只要源文本不同,计算得到的结果,必然不同(摘要)。
-
摘要:摘要算法主要用于比对信息源是否一致,因为只要源发生变化,得到的摘要必然不同;而且通常结果要比源短很多,所以称为“摘要”。
-
-
正因此,利用信息摘要算法能大大降低去重容器的存储空间使用率,并提高判断速度,且由于其强唯一性的特征,几乎不存在误判。
-
注意:
- hash算法得出的结果其实本质上就是一串数值,如md5的128位指的是二进制的长度,十六进制的长度是32位。一个十六进制等于四个二进制。
2.基于simhash算法的去重(千万级数据)
Simhash算法是一种局部敏感哈希算法,能实现相似文本内容的去重。比如下列两篇新闻数据
-
与信息摘要算法的区别:
- 信息摘要算法:如果原始内容只相差一个字节,所产生的签名也很可能差别很大。 ==
- Simhash算法:如果原始内容只相差一个字节,所产生的签名差别非常小。
-
Simhash值比对:通过两者的simhash值的二进制位的差异来表示原始文本内容的差异。差异个数又被称为海明距离。
-
注意:
-
Simhash对长文本500字+比较适用,短文本可能偏差较大
-
在google的论文给出的数据中,64位simhash值,在海明距离为3的情况下,可认为两篇文档是相似的或者是重复的。当然这个值只是参考值,针对自己的应用可能有不同的测试取值
-
Simhash值得比对
- Python实现的simhash算法。该模块得出的simhash值长度正是64位 如对
- 比前面列出的人民网和中国网的两篇相似新闻(以下值仅供参考)
- 128位MD5值:
64位simhash值