您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > Python

使用布隆过滤器用于Python网络爬虫URL去重

时间:2020-09-29 13:12:23  来源:  作者:

布隆过滤器BloomFilter)类似于hash set,用来判断元素是否在集合中。但是与hash set区别是:布隆过滤器不需要存储元素值,就能判断元素是否在集合中。

说一下布隆过滤器优缺点:

  • 优点:相比于其它的数据结构,其在空间和时间方面都有巨大的优势,内存资源占用低、查找速度快
  • 缺点:存在低概率的识别错误(布隆过滤器识别某一元素存在,但是实际上该元素并不在),以及更新到集合中的元素不能删除。

布隆过滤器原理

布隆过滤器是由一个特定长度的二进制向量(可以理解为位数组,如32位的位数组,大小为4个字节,每一位取值只有0和1)和多个哈希函数构成。

布隆过滤器添加元素过程

  1. 有一个m位的位数组,位数组每一位初始化为0
  2. 选择k个不同的哈希函数,第n个哈希函数对字符串的哈希值,记为hash(n,str),且hash(n,str)取值范围0~m-1
  3. 字符串经k个不同的哈希函数,计算得到k个数值,记为hash(1,str)…hash(k,str)
  4. 字符串每个哈希数值,对应位数组的下标位置对应的值,置1
  5. 这样字符串就映射到位数组中k个二进制位了
使用布隆过滤器用于Python网络爬虫URL去重

 

布隆过滤器查询元素过程

  1. 将要查询的字符串给k个哈希函数,得到对应于位数组上的k个位置
  2. 如果k个位置有一个为0,则集合一定不存在该字符串
  3. 如果k个位置全部为1,则集合可能存在该字符串

如何判断字符串存在呢?

只需将字符串经hash(1,str)…hash(k,str)哈希映射,检查每一个映射所对应位数组位置的值是否都为1,若k个位置的值都是1,则字符串存在,不全为1,则字符串一定不存在。

其中选择k个哈希函数比较麻烦,这里换个思路,选择一个哈希函数,附带k个不同的参数

布隆过滤器参数选择

布隆过滤器参数选择分为:哈希函数选择以及参数m,n,k取值

哈希函数选择

哈希函数的选择对布隆过滤器的性能影响很大,哈希函数要具有较好的离散性(能近似等概率的将字符串映射到各个位)。

哈希函数推荐采用Murmur hash

Murmur hash是一种非加密型哈希函数,适用于一般的哈希检索操作,与其它流行的哈希函数相比,对于规律性较强的字符串内容,MurmurHash的随机分布特征表现更良好,而且计算性能也很快

参数m,n,k取值

  • k - 哈希函数个数
  • m - 位数组的长度
  • n - 布隆过滤器加入字符串数量

当k、m、n三者满足 k = ln(2)* m/n 时,误识别率最低。

当哈希函数个数k=10,位数组长度m是字符串个数n的20倍时,误识别概率是0.0000889 ;即10万次判断,存在9次误判,1亿次判断,误判的次数为9000次

布隆过滤器应用

  1. 网络爬虫 - 爬虫是否访问过URL
  2. 垃圾邮件过滤
  3. 检测海量的名单
  4. 检查单词拼写是否正确 - 看它是否在已经字典中


Tags:布隆过滤器   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
布隆过滤器(BloomFilter)类似于hash set,用来判断元素是否在集合中。但是与hash set区别是:布隆过滤器不需要存储元素值,就能判断元素是否在集合中。说一下布隆过滤器优缺点: 优点...【详细内容】
2020-09-29  Tags: 布隆过滤器  点击:(175)  评论:(0)  加入收藏
作者:jack_xujuejin.im/post/5e9c110151882573793e8940不知道从什么时候开始,本来默默无闻的布隆过滤器一下子名声大燥,在面试中面试官问到怎么避免缓存穿透,你的第一反应可能就...【详细内容】
2020-05-13  Tags: 布隆过滤器  点击:(82)  评论:(0)  加入收藏
为什么引入我们的业务中经常会遇到穿库的问题,通常可以通过缓存解决。如果数据维度比较多,结果数据集合比较大时,缓存的效果就不明显了。因此为了解决穿库的问题,我们引入Bloom...【详细内容】
2020-05-05  Tags: 布隆过滤器  点击:(75)  评论:(0)  加入收藏
Redis概述:Redis是一个开源的Key-Value存储系统,其中Value支持String、list、set、hash、zset五种数据结构,这些数据都支持push/pop、add/remove、取交集并集、排序等丰富的操...【详细内容】
2020-01-17  Tags: 布隆过滤器  点击:(259)  评论:(0)  加入收藏
在项目开发中,我们经常会遇到去重问题。比如:判断一个人有没有浏览过一篇文章,判断一个人当天是否登录过某个系统,判断一个ip是否发过一个请求,等等。...【详细内容】
2019-10-08  Tags: 布隆过滤器  点击:(278)  评论:(0)  加入收藏
概述布隆过滤器(Bloom Filter)是1970年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数,布隆过滤器可以用于检索一个元素是否在一个集合中。如果想要判...【详细内容】
2019-08-30  Tags: 布隆过滤器  点击:(331)  评论:(0)  加入收藏
URL去重应用URL去重广泛应用于网络爬虫方面,主要体现在以下两点: 实现增量爬虫时,需要判断哪些网页已经爬取了,哪些网页是新产生的,对新产生的网页,增量爬虫需要抓取其内容; 避免爬...【详细内容】
2019-08-26  Tags: 布隆过滤器  点击:(437)  评论:(0)  加入收藏
▌简易百科推荐
近几年 Web3 被炒得火热,但是大部分人可能还不清楚什么是 Web3,今天就让w3cschool编程狮小师妹带你了解下 Web3 是什么?与我们熟知的 Web1 和 Web2 又有什么区别呢?web3.0什么是...【详细内容】
2022-07-15  编程狮W3Cschool    Tags:Web3.0   点击:(2)  评论:(0)  加入收藏
1、让我们一起来看下吧,直接上图。 第一眼看到是不是觉得很高逼格,暗黑画风,这很大佬。其实它就是------AidLearning。一个运行在安卓平台的linux系统,而且还包含了许多非常强大...【详细内容】
2022-07-15  IT智能化专栏    Tags:AidLearning   点击:(2)  评论:(0)  加入收藏
真正的大师,永远都怀着一颗学徒的心! 一、项目简介 今天说的这个软件是一款基于Python+vue的自动化运维、完全开源的云管理平台。二、实现功能 基于RBAC权限系统 录像回放 ...【详细内容】
2022-07-14  菜鸟程序猿    Tags:Python   点击:(3)  评论:(0)  加入收藏
前言今天笔者想和大家来聊聊python接口自动化的MySQL数据连接,废话不多说咱们直接进入主题吧。 一、什么是 PyMySQL?PyMySQL是在Python3.x版本中用于连接MySQL服务器的一个库,P...【详细内容】
2022-07-11  测试架构师百里    Tags:python   点击:(19)  评论:(0)  加入收藏
aiohttp什么是 aiohttp?一个异步的 HTTP 客户端\服务端框架,基于 asyncio 的异步模块。可用于实现异步爬虫,更快于 requests 的同步爬虫。安装pip install aiohttpaiohttp 和 r...【详细内容】
2022-07-11  VT漫步    Tags:aiohttp   点击:(15)  评论:(0)  加入收藏
今天我们学习下 Queue 的进阶用法。生产者消费者模型在并发编程中,比如爬虫,有的线程负责爬取数据,有的线程负责对爬取到的数据做处理(清洗、分类和入库)。假如他们是直接交互的,...【详细内容】
2022-07-06  VT漫步    Tags:Python Queue   点击:(34)  评论:(0)  加入收藏
继承:是面向对象编程最重要的特性之一,例如,我们每个人都从祖辈和父母那里继承了一些体貌特征,但每个人却又不同于父母,有自己独有的一些特性。在面向对象中被继承的类是父类或基...【详细内容】
2022-07-06  至尊小狸子    Tags:python   点击:(25)  评论:(0)  加入收藏
点击上方头像关注我,每周上午 09:00准时推送,每月不定期赠送技术书籍。本文1553字,阅读约需4分钟 Hi,大家好,我是CoCo。在上一篇Python自动化测试系列文章:Python自动化测试之P...【详细内容】
2022-07-05  CoCo的软件测试小栈    Tags:Python   点击:(27)  评论:(0)  加入收藏
第一种方式:res = requests.get(url, params=data, headers = headers)第二种方式:res = requests.get(url, data=data, headers = headers)注意:1.url格式入参只支持第一种方...【详细内容】
2022-07-05  独钓寒江雪之IT    Tags:Python request   点击:(19)  评论:(0)  加入收藏
什么是python类的多态python的多态,可以为不同的类实例,或者说不同的数据处理方式,提供统一的接口。用比喻的方式理解python类的多态比如,同一个苹果(统一的接口)在孩子的眼里(类实...【详细内容】
2022-07-04  写小说的程序员    Tags:python类   点击:(28)  评论:(0)  加入收藏
站内最新
站内热门
站内头条