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