它的实现方式是这样的:一个超长的二进制向量(可以理解为一个全是0和1的大数组),加上一组哈希函数。当你添加一个URL时,用每个哈希函数计算出一个位置,把向量中对应位置的0变成1。当你检查一个URL是否存在时,同样计算出所有哈希位置,只要有一个位置是0,这个URL肯定没来过;如果所有位置都是1,那它有很大概率来过了——注意,只是大概率,不是绝对。这个“误判率”是可控的。通过调整布隆过滤器的长度和哈希函数的数量,你可以把误判率压到1%甚至0.1%。对于URL去重来说,偶尔漏掉几个URL不去抓取,完全是可以接受的。在分布式环境下,布隆过滤器的优势更是体现得淋漓尽致。一个共享的布隆过滤器可以被所有爬虫节点共用,每个节点在抓取前先查询,确认不存在之后再抓取并添加。这就完美解决了多节点重复抓取的问题。目录技术选型:这次我们用PyBloom和Redis从零搭建一个分布式爬虫去重框架异步爬虫核心:布隆过滤器的集成多节点分布式部署方案性能优化:调低误判率,提高吞吐量生产环境踩坑总结完整运行示例技术选型:这次我们用PyBloom和RedisPython生态里布隆过滤器的实现有好几个:pybloom-live:纯Python实现,内存存储,适合单机场景redisbloom:Redis官方布隆过滤器模块,支持分布式,需要Redis 4.0+pyreBloom:基于RedisBitmaps自己实现,灵活性高考虑到分布式环境,我选择redisbloom。它把布隆过滤器作为Redis的一种原生数据类型来支持,所有操作都是原子性的,天然适合多节点并发访问。安装依赖:bashpip install redis redisbloom aiohttp aiofiles asyncio如果你的Redis还没装redisbloom模块,需要先加载:bashgit clone https://github.com/RedisBloom/RedisBloom.git cd RedisBloom make # 启动时加载模块 redis-server