Python 爬虫数据去重的几种实现浅析

「这是我参与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 的情况下,可认为两篇文档是相似的或者是重复的。当然这个值只是参考值,针对自己的应用可能有不同的测试取值

Guess you like

Origin juejin.im/post/7034833679260057637