首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
12.1 Charles 抓包工具的使用
12.2 mitmproxy 抓包工具的使用
12.3 mitmdump 实时抓包处理
12.4 Appium 的使用
12.5 基于 Appium 的 App 爬取实战
12.6 Airtest 的使用
12.7 基于 Airtest 的 App 爬取实战
12.8 手机群控爬取实战
12.9 云手机的使用
13.0 Android 逆向
13.1 jadx 的使用
13.2 JEB 的使用
13.3 Xposed 框架的使用
13.4 基于 Xposed 的爬取实战案例
13.5 Frida 的使用
13.6 SSL Pining 问题的解决方案
13.7 Android 脱壳技术简介与实战
13.8 利用 IDA Pro 静态分析和动态调试 so 文件
13.9 基于 Frida-RPC 模拟执行 so 文件
13.10 基于 AndServer-RPC 模拟执行 so 文件
13.11 基于 unidbg 模拟执行 so 文件
14.1 页面智能解析简介
14.2 详情页智能解析算法简介
14.3 详情页智能解析算法的实现
14.4 列表页智能解析算法简介
14.5 列表页智能解析算法的实现
14.6 如何智能分辨列表页和详情页
15.1 Scrapy框架介绍
15.2 Scrapy入门
15.3 Selector 的使用
15.4 Spider 的使用
15.5 Downloader Middleware的使用
15.6 Spider Middleware的使用
15.7 Item Pipeline的使用
15.8 Extension的使用
15.9 Scrapy 对接 Selenium
15.10 Scrapy 对接 Splash
15.11 Scrapy 对接 Pyppeteer
15.12 Scrapy 规则化爬虫
15.13 Scrapy 实战
16.1 分布式爬虫理念
16.2 Scrapy-Redis原理和源码解析
16.3 基于Scrapy-Redis的分布式爬虫实现
16.4 基于Bloom Filter进行大规模去重
16.5 基于RabbitMQ的分布式爬虫
17.1 Scrapyd和ScrapydAPI的使用
17.2 Scrapyd-Client 的使用
17.3 Gerapy 爬虫管理框架的使用
17.4 将Scrapy 项目打包成 Docker 镜像
17.5 Docker Compose 的使用
17.6 Kubernetes的使用
17.7 用 Kubernetes 部署和管理 Scrapy 爬虫
17.8 Scrapy 分布式爬虫的数据统计方案
17.9 基于Prometheus和Grafana的分布式爬虫监控方案
当前位置:
首页>>
技术小册>>
Python3网络爬虫开发实战(下)
小册名称:Python3网络爬虫开发实战(下)
### 16.4 基于Bloom Filter进行大规模去重 在Python网络爬虫的开发中,处理大规模数据时,数据去重是一个至关重要且极具挑战性的任务。随着网络数据的爆炸式增长,传统的去重方法(如哈希表、数据库查询等)在面对海量数据时往往显得力不从心,它们要么占用过多内存资源,要么查询效率低下。此时,引入Bloom Filter这一数据结构,便成为了一种高效解决大规模数据去重问题的方案。 #### 16.4.1 Bloom Filter简介 Bloom Filter是由Burton Howard Bloom在1970年提出的,它本质上是一种空间效率很高的概率型数据结构,用于判断一个元素是否在一个集合中。但与普通的集合数据结构不同的是,Bloom Filter允许存在一定的误判率,即它可能会错误地认为某个元素属于集合(假阳性),但绝不会错误地拒绝集合中的元素(即不存在假阴性)。 Bloom Filter的核心思想是利用多个哈希函数对元素进行映射,将结果存储在位数组中。当需要判断一个元素是否存在于集合中时,只需对该元素执行相同的哈希函数,并检查位数组中对应的位是否被置为1。如果所有对应的位都是1,则认为元素可能存在于集合中;如果有任何一位是0,则可以确定元素不在集合中。 #### 16.4.2 Bloom Filter的原理与实现 **1. 初始化** - **确定位数组大小**:位数组的大小直接影响Bloom Filter的误判率和空间效率。一般来说,位数组越大,误判率越低,但空间占用也越大。 - **选择哈希函数个数**:哈希函数的个数同样影响误判率。哈希函数越多,误判率越低,但计算成本也越高。 - **初始化位数组**:将所有位初始化为0。 **2. 添加元素** - 对要添加的元素应用所有哈希函数。 - 将每个哈希函数的结果作为索引,在位数组中对应的位上置为1。 **3. 查询元素** - 对要查询的元素应用相同的哈希函数。 - 检查所有哈希函数对应的位,如果所有位都是1,则认为元素可能存在于集合中(存在误判可能);如果任何一位是0,则确定元素不在集合中。 **Python实现示例**: ```python import mmh3 # 使用mmh3库,一个高效的哈希函数库 class BloomFilter: def __init__(self, size, hash_count): self.size = size self.hash_count = hash_count self.bit_array = bytearray(size) # 初始化位数组 def _hash(self, item): """生成多个哈希值""" return [mmh3.hash(item, i) % self.size for i in range(self.hash_count)] def add(self, item): """添加元素到Bloom Filter""" for pos in self._hash(item): self.bit_array[pos] = 1 def contains(self, item): """检查元素是否可能在集合中""" for pos in self._hash(item): if self.bit_array[pos] == 0: return False return True # 使用示例 bf = BloomFilter(size=2**24, hash_count=7) bf.add("python") print(bf.contains("python")) # True print(bf.contains("java")) # 可能为False,也可能为True(如果发生误判) ``` #### 16.4.3 Bloom Filter在网络爬虫中的应用 在网络爬虫中,Bloom Filter常被用于URL去重、内容去重等场景。由于网络爬虫需要处理大量的URL和网页内容,传统的去重方法(如内存中的哈希表)在面临大规模数据时容易遇到内存瓶颈。而Bloom Filter凭借其高效的空间利用和查询速度,成为解决这一问题的理想选择。 **URL去重**: 在爬取网页时,使用Bloom Filter记录已访问过的URL,可以有效避免重复爬取相同页面。当爬虫遇到一个新URL时,先通过Bloom Filter检查该URL是否已被访问过,若未访问过,则进行爬取并更新Bloom Filter;若已访问过,则跳过该URL。 **内容去重**: 对于需要爬取网页内容并进行存储或分析的爬虫来说,内容去重同样重要。通过提取网页的关键信息(如标题、摘要、特定标签的内容等),将其作为字符串或哈希值加入Bloom Filter中,可以实现内容层面的去重。需要注意的是,由于Bloom Filter存在误判率,因此在实际应用中,可能需要结合其他方法(如精确比对)来进一步确认内容的唯一性。 #### 16.4.4 注意事项与优化 - **误判率控制**:通过调整位数组大小和哈希函数个数,可以在一定程度上控制Bloom Filter的误判率。但需要注意的是,误判率与空间占用和计算成本之间存在权衡关系。 - **动态扩展**:标准的Bloom Filter不支持动态扩展。如果数据量超过预期,可能需要重新构造一个更大的Bloom Filter,并将旧数据重新插入。这在实际应用中可能带来不便。为此,可以考虑使用可动态扩展的变种,如Counting Bloom Filter。 - **结合其他数据结构**:对于要求极低误判率的场景,可以将Bloom Filter与其他数据结构(如哈希表)结合使用。首先使用Bloom Filter进行快速筛选,再对可能存在的元素进行精确查询。 综上所述,Bloom Filter作为一种高效的空间节省型概率数据结构,在网络爬虫的大规模去重任务中展现出了独特的优势。通过合理的配置和优化,Bloom Filter能够显著提升爬虫的性能和效率,为大数据处理提供有力支持。
上一篇:
16.3 基于Scrapy-Redis的分布式爬虫实现
下一篇:
16.5 基于RabbitMQ的分布式爬虫
该分类下的相关小册推荐:
Python合辑2-字符串常用方法
Python合辑3-字符串用法深度总结
Python编程轻松进阶(一)
Python面试指南
Python合辑6-字典专题
Python合辑4-130个字符串操作示例
Python合辑13-面向对象编程案例(上)
剑指Python(万变不离其宗)
实战Python网络爬虫
Python数据分析与挖掘实战(下)
Python编程轻松进阶(二)
Python与办公-玩转PPT