爬虫等数据去重方案: 摘要算法 Simhash 布隆过滤器

1. 去重的应用场景和基本原理

1.1 场景引入思考:
  • 1.防止发送重复的请求
  • 2.防止保存重复的数据

原理:一致, 对二进制字符串去重

1.2 基本原理:

思考:

  • 明确 数据构成类型(字符串, 数字 , 对象, 特殊字符…) ==> 来制定去重方案
  • 判断依据: 什么样的数据算作重复数据?

总结:

​ 根据给定的 [判断依据][去重容器], 将原始数据逐一进行判断, 判断去重容器中是否有该数据, 如果没有则把该数据的 对应判断依据 添加到去重容器中, 同时标记该数据是不重复数据; 如果有就不添加, 同时标记该数据是重复数据.

  • 判断依据(原始数据, 原始数据特征值)
  • 去重容器(存储判断依据)
1.3 特征值判断原因:
  • 业务需求
  • 效率考量(内存中, 不能太大, 同时判断的速度要足够快)
1.4 去重容器 方案选择
  • 临时去重容器: list 、 set 等编程语言的数据结构存储去重数据.
    • 存在问题:
      • 一旦程序关闭或重启后, 去重容器的数据就被回收了.
      • 无法共享、无法持久化保存
    • 优势:
      • 实现简单方便
  • 持久化去重容器: redis、myql等数据库存储去重数据.
    • 优势:
      • 持久化
      • 共享方便
    • 存在问题:
      • 使用与实现相对复杂

2. 基于信息摘要算法的去重

2.1 信息摘要hash算法介绍
  • 信息摘要hash算法可以将 任意长度的文本、字节数据, 通过 算法 得到一个固定长度的文本。如, MD5(32位16进制, 128Bit, 16Byte) 、SHA1(40位16进制, 160Bit, 20Byte)等.

    • 特征: 只要源文本不同, 计算得到的结果(摘要)必然不同
    • 摘要: 摘要算法主要用于比对信息源是否一致, 因为只要源发生变化, 得到的摘要必然不同; 而且通常结果要比源短很多, 所以称为 “摘要”。
  • 正因此, 利用信息摘要算法能大大降低去重容器的存储空间使用率, 并提高判断速度, 且由于其强唯一性的特征, 几乎不存在误判.

  • 注意:

    • hash算法得出的结果本质就是一串数值, 如md5的128位指的是二进制的长度, 十六进制的长度是32位. 一个16进制等于4个二进制(位数不足前面填0).
  • In [1]: from hashlib import md5
    
    In [2]: m5 = md5()  # 小写
    
    In [3]: m5.update("abscedwwasgfsdfsd")  # python2 中这里不会报错, py3中会报错
    ---------------------------------------------------------------------------
    TypeError                                 Traceback (most recent call last)
    <ipython-input-3-6002a57d4a95> in <module>()
    ----> 1 m5.update("abscedwwasgfsdfsd")
    
    TypeError: Unicode-objects must be encoded before hashing
    
    # 对于 字符串来说 [4] 和 [5] 的操作是等价的. 
    # 中文字符串前面不能用 b"", 因为不支持 ascii码
    In [4]: m5.update("abscedwwasgfsdfsd".encode(
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值