爬虫框架如何做到百万URL爬取不重复NetDiscovery布隆过滤器去重完整拆解【免费下载链接】NetDiscoveryNetDiscovery 是一款基于 Vert.x、RxJava 2 等框架实现的通用爬虫框架/中间件。项目地址: https://gitcode.com/gh_mirrors/ne/NetDiscovery️ 在大规模爬虫场景中URL 去重是决定爬虫是否烧钱、是否礼貌的核心能力。NetDiscovery是一款基于 Vert.x、RxJava 2 实现的通用爬虫框架它在队列层内置了HashSet 精确去重和布隆过滤器Bloom Filter海量 URL 去重两套策略让百万级 URL 爬取不重复、不爆内存。本文带你完整拆解它的实现原理与使用方式。为什么大规模爬取必须做 URL 去重爬虫运行时解析器会源源不断地产出新 URL。如果没有去重❌ 同一个页面被反复抓取带宽和代理费用白白浪费❌ 队列无限膨胀最终内存溢出❌ 高频重复请求容易触发目标站风控NetDiscovery 的思路是在 URL 进入队列的那一刻就完成去重判定让重复请求根本进不了队列。URL 去重发生在爬虫管线的哪个位置NetDiscovery 的队列统一继承自 AbstractQueue.java。每次push(request)时它都会先问一个守门员调用去重过滤器filter.isDuplicate(request)判断该 URL 是否见过是重复→ 直接丢弃日志级别仅 debug不重复→ 才调用pushWhenNoDuplicate()真正入队这个守门员就是 DuplicateFilter.java 接口只有两个方法isDuplicate()判重、getTotalRequestsCount()供监控统计集群监控面板里显示的总请求数就来自它。NetDiscovery 内置的两种 URL 去重策略策略一HashSet 精确去重默认HashSetDuplicateFilter.java 默认被AbstractQueue启用。它底层是一个ConcurrentHashMap包装的SetString✅零误判URL 精确匹配不会把新 URL 错判成旧 URL✅线程安全多线程并发 push 不会出错⚠️内存代价每个 URL 原样驻留内存百万级还行千万级就会很吃力它还有一个巧思如果请求标记了checkDuplicatefalseURL 只会记录计数、不参与判重。这正好支撑了 Spider.java 中的repeatRequest()定时重抓功能——同一 URL 按周期重复提交也不会被误杀。策略二布隆过滤器海量去重NetDiscovery 的招牌当 URL 量级到千万甚至上亿HashSet 就不够看了。此时换 BloomDuplicateFilter.java参数含义默认值expectedInsertions预估要插入的 URL 数量由你指定如 100 万fpp误判率false positive probability0.01即 1%核心逻辑只有三行直观到几乎不用解释boolean isDuplicate bloomFilter.mightContain(request.getUrl()); if (!isDuplicate) { bloomFilter.put(request.getUrl()); }布隆过滤器为什么省内存它不存 URL 本身只把每个 URL 经过多个哈希函数映射到一段位图上。百万 URL 的 HashSet 至少要几百 MB而同规模布隆过滤器通常只需几 MB——这就是百万 URL 爬取不重复的秘密用 1% 的极小误判概率换取数量级的内存节省。⚠️ 注意布隆过滤器的特性它只能回答可能见过 / 一定没见过误判只会把新 URL 错当旧 URL 丢掉绝不会把旧 URL 当新的放过。如何启用布隆过滤器 URL 去重队列的过滤器是可插拔的通过AbstractQueue的setFilter()一键切换示例// 预估爬取 200 万个 URL误判率 0.1% queue.setFilter(new BloomDuplicateFilter(2000000, 0.001));几个实用建议预估量留足余量expectedInsertions设小会让误判率飙升建议按预估 URL 量 ×2 设置单机中小规模用默认 HashSet即可精确且零配置配合checkDuplicate开关需要定时重抓的 URL 记得标记checkDuplicate(false)参考 Request.kt 中的字段定义监控总请求数getTotalRequestsCount()已统计进监控响应体接入 SpiderEngine 后可在面板看到去重后的真实规模总结如何为爬虫选择 URL 去重方案场景推荐策略理由URL 百万、内存充足HashSet 精确去重零误判零配置URL 千万级 / 内存紧张布隆过滤器去重内存省一个数量级定时重抓同一 URLcheckDuplicatefalse绕过判重直接放行NetDiscovery 把去重封装成DuplicateFilter接口、挂在队列入口统一拦截既保留了策略灵活性又让业务代码完全无感——这正是它作为通用爬虫框架的设计精髓。想动手试试可以直接参考 example/ 目录下的深度爬取示例从第一个push()开始感受去重过滤器如何工作。【免费下载链接】NetDiscoveryNetDiscovery 是一款基于 Vert.x、RxJava 2 等框架实现的通用爬虫框架/中间件。项目地址: https://gitcode.com/gh_mirrors/ne/NetDiscovery创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考