首页/新闻资讯/正文详情

qutebrowser 广告拦截测试数据集:ublock-matches.tsv.gz 的生成、结构与用法

发布时间:2026/9/23 10:48:02 来源:云帆数科 栏目:资讯中心
qutebrowser 广告拦截测试数据集:ublock-matches.tsv.gz 的生成、结构与用法
桌面应用【免费下载链接】qutebrowserA keyboard-driven, vim-like browser based on Python and Qt.项目地址https://gitcode.com/gh_mirrors/qu/qutebrowser点击查看免费下载导读本文围绕 qutebrowser 仓库中 tests/end2end/data/brave-adblock/README.md 所记录的测试数据集展开深入讲解ublock-matches.tsv.gz的来源、预处理流程、字段结构与资源类型映射并结合仓库源码说明它在 qutebrowser 广告拦截Brave adblocker单元测试与端到端测试中的实际消费方式。读完本文你将掌握这份真实世界广告请求数据集的完整生命周期并能在本地复现它的生成过程为理解 qutebrowser 的content.blocking.*广告拦截体系提供数据侧的支撑。一、数据集在 qutebrowser 测试体系中的定位qutebrowser 是一个基于 Python 与 Qt 的键盘驱动vim 风格浏览器其广告拦截功能支持两种引擎简单的 hosts 阻断器和基于 Braveadblock-rust的 ABP 风格Adblock Plus 语法拦截器后者通过可选的adblockPython 包接入见 qutebrowser/components/braveadblock.py。为了验证 Brave adblocker 在各种真实网络请求上不会误杀合法流量false positive测试需要一批真实世界中确实不应被拦截的请求样本。ublock-matches.tsv.gz正是为此准备的基准数据集——它取自 uBlock Origin 过滤器在实际浏览中的匹配记录作为assert_none_blocked类测试的负样本输入。该目录tests/end2end/data/brave-adblock/共包含四个文件文件作用README.md说明数据来源、生成方式与许可generate.py下载、过滤、压缩生成数据集的脚本ublock-matches.tsv.gz最终供测试使用的 gzip 压缩 TSV 数据LICENSE原始数据采用的 MPLv2 许可全文318 行二、数据来源Brave adblock-rust 的 ublock-matches.tsvREADME 明确指出ublock-matches.tsv文件下载自adblock-rust项目Brave 的 Rust 广告拦截库的数据目录随后由generate.py预处理并压缩最终产出ublock-matches.tsv.gz。generate.py中对应的下载地址常量印证了这一来源tests/end2end/data/brave-adblock/generate.py#L16URL https://raw.githubusercontent.com/brave/adblock-rust/master/data/ublock-matches.tsv该原始文件记录了 uBlock Origin 过滤器在真实浏览场景下的命中样本每条记录包含多个字段。qutebrowser 只关心其中用于构造测试请求的三个字段url被请求的资源 URL、sourceUrl发起请求的页面 URL、type请求的资源类型。三、generate.py 预处理流程详解generate.py是一个可直接运行的独立脚本tests/end2end/data/brave-adblock/generate.py执行后在工作目录产出ublock-matches.tsv.gz。其处理管线分为四个阶段1. 下载或复用缓存脚本优先检查系统临时目录中的缓存文件ublock-matches-cache.tsvCACHE_PATH pathlib.Path(tempfile.gettempdir(), ublock-matches-cache.tsv)见 generate.py#L17缓存存在直接读取避免重复下载缓存不存在通过urllib.request下载原始 TSV校验 HTTP 状态码为 200 后写入缓存再读入内存。2. 截取前 30 000 行并抽取三列ROWS_TO_USE 30_000 reader csv.DictReader(data, delimiter\t) rows list(itertools.islice(reader, ROWS_TO_USE))脚本只保留原始数据集的前 30000 行ROWS_TO_USE 30_000generate.py#L18并用csv.DictReader按 Tab 分隔符解析再输出到仅含url、source_url、type三列的字典写入器。这一截断策略既保证了测试样本量的充分性又控制了数据文件体积与测试运行时间。3. 资源类型重命名对齐 QtWebEngine 命名这是预处理中最关键的转换。原始数据使用的资源类型命名来自 Chromium/ABP 体系而 qutebrowser 的interceptor.ResourceTypeQtWebEngine 枚举命名不同因此type_rename()generate.py#L21-L31执行了如下映射原始类型重命名后处理otherunknown保留xmlhttprequestxhr保留fontfont_resource保留image/stylesheet/media/script/sub_frame原样保留保留其他类型—丢弃整行从源码注释Use the same resource type names as QtWebEngine可以看出这一步的目的是让测试数据中的type字段能直接被ResourceType[row[type]]反查为枚举成员见下文测试消费部分。无法识别的请求类型对应的行会被跳过不会进入最终数据集。4. gzip 压缩落盘过滤后的数据先写入内存中的io.StringIO再以最高压缩级别写盘with gzip.open(ublock-matches.tsv.gz, wb, compresslevel9) as gzip_f: gzip_f.write(uncompressed_f.read().encode(utf-8))compresslevel9表示最高压缩比以换取更小的仓库体积——这是为了将测试数据文件控制在 Git 仓库可接受的尺寸内。四、数据在测试中的消费方式1. 测试辅助函数解压读取tests/helpers/testutils.py#L246-L256 提供了统一的解压读取入口def _decompress_gzip_datafile(filename): path os.path.join(abs_datapath(), filename) yield from io.TextIOWrapper(gzip.open(path), encodingutf-8) def adblock_dataset_tsv(): return _decompress_gzip_datafile(brave-adblock/ublock-matches.tsv.gz)adblock_dataset_tsv()返回一个逐行迭代的文本流供单元测试按 CSV 格式解析。2. 单元测试逐条验证不误杀tests/unit/components/test_braveadblock.py#L88-L110 中run_function_on_dataset()将数据集逐行转换为测试用例def run_function_on_dataset(given_function): dataset testutils.adblock_dataset_tsv() reader csv.DictReader(dataset, delimiter\t) for row in reader: url QUrl(row[url]) source_url QUrl(row[source_url]) resource_type ResourceType[row[type]] given_function(url, source_url, resource_type)而assert_none_blocked()则对数据集中的每一条请求断言不应被拦截assert not ad_blocker._is_blocked(url, source_url, resource_type)。这正是数据集的用途核心这些是在真实世界中合法加载过的请求任何一条被 Brave adblocker 误拦截都说明引擎存在过度拦截false positive问题。此外该测试文件还在BUGGY_URLStest_braveadblock.py#L76-L85中记录了因上游adblock-rust已知缺陷而需要特殊处理的 URL对应上游 issue #146 及 qutebrowser issue #6000用于验证仓库内置的 workaround 逻辑仍然必要。3. 端到端测试与真实列表联动在 tests/end2end/test_adblock_e2e.py 中test_adblock参数化覆盖auto/hosts/adblock/both四种拦截方法both与adblock需要已安装adblock库否则通过pytest.mark.skipif跳过它配置content.blocking.hosts.lists与content.blocking.adblock.lists指向测试服务器上的本地列表tests/end2end/data/blocking/qutebrowser-adblock 内容为 ABP 规则|||qutebrowser.org^执行:adblock-update后打开data/blocking/external_logo.html并断言对应日志消息如Request to https://qutebrowser.org/icons/qutebrowser.svg blocked by ad blocker.。这套 e2e 测试与单元测试的数据集形成互补前者验证拦截器该拦的拦得住后者验证不该拦的不误杀。五、运行层面数据集对应的拦截引擎工作方式理解数据集的价值还需要知道它在运行时的对应物。Brave adblocker 在 qutebrowser 中的工作链路如下qutebrowser/components/braveadblock.py启动时通过hook.init()注册interceptor.register(ad_blocker.filter_request)braveadblock.py#L335-L352每个网络请求进入_is_blocked()调用self._engine.check_network_urls(request_url, first_party_url, resource_type_str)判定是否命中规则braveadblock.py#L203-L207命中后还会检查异常规则result.exception、important标记与白名单blockutils.is_whitelisted_url()最终决定是否info.block()。其中运行时的资源类型字符串映射_RESOURCE_TYPE_STRINGSbraveadblock.py#L77-L102与generate.py中的type_rename方向相反但逻辑呼应运行时把ResourceType枚举转换为 adblock 引擎认识的字符串如xhr、font、sub_frame而生成数据时把原始类型转换为ResourceType可解析的枚举名。两者共同保证了测试数据与真实拦截调用使用同一套类型语义。六、相关配置项数据测试背后的可配置面单元测试与 e2e 测试均通过配置项驱动拦截行为这些配置定义在 qutebrowser/config/configdata.ymlcontent.blocking.enabled默认true支持 URL pattern总开关content.blocking.method默认auto可选auto有 adblock 库则用 Brave 引擎否则退回 hosts、adblock、hosts、bothcontent.blocking.adblock.lists默认 EasyList EasyPrivacyABP 风格规则列表 URLcontent.blocking.hosts.lists默认 StevenBlack hostshosts 列表 URLcontent.blocking.whitelist豁免拦截的 URL 模式列表。需要说明的是auto模式只有在adblock依赖可用时才启用 Brave 引擎若依赖缺失或版本过旧braveadblock.py#L47-L74 的_possibly_show_missing_dependency_warning()会给出相应警告信息。七、许可与合规MPLv2 与 LICENSE 文件README 的第二个要点是许可声明原始ublock-matches.tsv由 Andrius Aucinas 以Mozilla Public License 2.0MPLv2发布许可副本存放于同目录的 LICENSE 文件中共 318 行含版权声明Copyright (c) 2019, Andrius Aucinas。在引入第三方测试数据时保留许可全文是开源仓库合规的重要实践——qutebrowser 本体为 GPL-3.0-or-later见generate.py的 SPDX 头而该数据集以 MPLv2 独立授权二者互不冲突地共存于仓库中。注意generate.py与测试源码采用 GPL-3.0-or-laterSPDX 标识见 generate.py#L2-L5与数据本身的 MPLv2 是两个独立的许可对象使用时应区分对待。八、本地复现重新生成数据集如需在本地重新生成ublock-matches.tsv.gz可在该目录下直接运行python tests/end2end/data/brave-adblock/generate.py脚本会依次输出以下日志整个过程无需任何第三方 Python 依赖仅用标准库Downloading https://raw.githubusercontent.com/brave/adblock-rust/master/data/ublock-matches.tsv ... Saving to cache file /tmp/ublock-matches-cache.tsv ... Reading rows into memory... Writing filtered file to memory... Compressing filtered file and saving to disk...注意事项首次运行需要联网下载原始 TSV约数 MB之后会复用/tmp/ublock-matches-cache.tsv缓存上游文件内容若发生变化重新生成的数据集与仓库中已提交的ublock-matches.tsv.gz可能存在差异可能影响零误杀断言的稳定性该脚本仅供数据维护者更新测试基准使用普通运行测试无需执行——仓库中已包含现成的压缩数据文件。小结ublock-matches.tsv.gz是 qutebrowser 广告拦截测试体系中一份小而关键的真实世界数据资产它从 Braveadblock-rust的 uBlock 匹配记录中截取 30000 条请求经generate.py完成资源类型归一化与 gzip 压缩后入库再由单元测试逐条断言不应误拦截与端到端测试的应当拦截断言共同构成完整的拦截器验证闭环。理解这份数据集的来源、结构与处理管线有助于深入把握 qutebrowser 的content.blocking.*广告拦截机制以及开源项目在引入第三方数据时对许可合规的处理范式。赞分享桌面应用【免费下载链接】qutebrowserA keyboard-driven, vim-like browser based on Python and Qt.项目地址https://gitcode.com/gh_mirrors/qu/qutebrowser点击查看免费下载相关推荐终结广告追踪uBlock Origin广告联盟识别与拦截全攻略终结广告追踪uBlock Origin广告联盟识别与拦截全攻略 你是否曾在浏览网页时被无处不在的广告追踪困扰从电商网站的浏览历史弹窗到社交媒体的定向推广网络安全应用安全uBlock Origin广告拦截效果测评主流网站拦截率对比uBlock Origin广告拦截效果测评主流网站拦截率对比 你是否还在忍受视频前90秒的广告轰炸是否为弹窗广告打断阅读而烦恼uBlock Origin网络安全应用安全上一篇HAMi 对 Sidecar 容器 GPU 资源核算的支持设计与实现解析下一篇如何使用 Python WebSocket 客户端快速实现实时通信的完整指南 创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关推荐

车载以太网中间件怎么选?SOME/IP、MQTT、DDS对比与混合部署实践
车载以太网中间件怎么选?SOME/IP、MQTT、DDS对比与混合部署实践

前阵子帮一个整车项目做智驾域控的通信中间件选型,前后调研了两个多月,把SOME/IP、MQTT、DDS这三兄弟翻来覆去对比了好几轮。圈里讨论这个问题的帖子很多,但大多只停留在“SOME/IP是SOA、MQTT是物联网、DDS是高性能”这种口号层面。真正落过地… · 2026/9/23 10:48:02

Talos Linux ContainerConfig 完全指南:在 Kubernetes 之外直接运行系统级容器
Talos Linux ContainerConfig 完全指南:在 Kubernetes 之外直接运行系统级容器

云原生操作系统容器编排 【免费下载链接】talos Talos Linux is a modern Linux distribution built for Kubernetes. 项目地址: https://gitcode.com/gh_mirrors/ta/talos 点击查看 免费下载 导读 ContainerConfig 是 Talos Linux 提供的一种机器配置&#xff08… · 2026/9/23 10:47:56

7B小模型如何打破参数瓶颈?中关村学院全开源ZGCM-1,256K上下文数学智能体搜索
7B小模型如何打破参数瓶颈?中关村学院全开源ZGCM-1,256K上下文数学智能体搜索

ZGCM-1: A Fully Open and Extremely Efficient Foundation Model for Math and Agentic Search 作者:Jiyan He, Guang Liang, Hao Liu, Haoxiang Guan, Jinbo Sun, Junyi Guo, Wenjun Feng, Yantai Xie, Yifei Shen, Bin Shao, Chuyang Wei, Kai Chen, Kexin Zhou,… · 2026/9/23 10:47:56

186666升级翻车?3步搞定API变更,新手避坑实战
186666升级翻车?3步搞定API变更,新手避坑实战

186666升级翻车?3步搞定API变更,新手避坑实战 昨天半夜两点,老张在群里炸毛了。他刚把项目里的核心模块从旧版升到新版,结果一运行,满屏全是 AttributeError 和 TypeError… · 2026/9/23 12:10:31

PHP-CS-Fixer 的 function_typehint_space 规则:函数参数类型与变量间的空格规范化及其废弃迁移指南
PHP-CS-Fixer 的 function_typehint_space 规则:函数参数类型与变量间的空格规范化及其废弃迁移指南

PHP-CS-Fixer 的 function_typehint_space 规则:函数参数类型与变量间的空格规范化及其废弃迁移指南 【免费下载链接】PHP-CS-Fixer A tool to automatically fix PHP Coding Standards issues 项目地址: https://gitcode.com/gh_mirrors/ph/PHP-CS-Fixer 导… · 2026/9/23 12:10:25

STM32L431RCT6 mini核心板原理图设计:低功耗与去耦细节解析
STM32L431RCT6 mini核心板原理图设计:低功耗与去耦细节解析

简介:STM32L431RCT6主芯片开发板原理图是一份mini核心板的PDF设计文件,面向嵌入式入门新手、STM32/ARM学习者,以及需要进行芯片评估与替换验证的工程师,可用于入门学习、核心板评估和项目选型验证。原理图完整呈现基于ARM Cortex-… · 2026/9/23 12:10:19

3步搞定在线测试显卡性能 一文搞懂底层逻辑
3步搞定在线测试显卡性能 一文搞懂底层逻辑

3步搞定在线测试显卡性能 一文搞懂底层逻辑 看了一堆教程还是不会写项目,卡在显卡测试这一步的开发者不在少数。很多人以为只要打开网页点一下按钮就能出结果,但真到了生产环境,浏览器卡顿、数据不准、甚至直接白屏,问题就全暴露了。其实,… · 2026/9/23 12:10:19

3分钟看懂中关村贵阳科技园注册原理图解
3分钟看懂中关村贵阳科技园注册原理图解

3分钟看懂中关村贵阳科技园注册原理图解 官方文档往往厚达百页,密密麻麻的法条和流程图让人看一眼就头大,想抓重点却总是迷路。很多刚接触园区注册或年审的朋友,都在抱怨找不到核心逻辑,其实只要把复杂的行政流程拆解成底层代码,一切就清晰了。今天这篇… · 2026/9/23 12:10:18

艳后奈德丽保姆级教程:3步解决代码跑不通难题
艳后奈德丽保姆级教程:3步解决代码跑不通难题

艳后奈德丽保姆级教程:3步解决代码跑不通难题 刚接手项目,从网上复制了一段处理【艳后奈德丽】核心逻辑的代码,运行结果却是 KeyError 或 Timeout… · 2026/9/23 12:10:12

3招搞定手机怎么下载微信面试难题实战项目解析
3招搞定手机怎么下载微信面试难题实战项目解析

3招搞定手机怎么下载微信面试难题实战项目解析 面试被问“手机怎么下载微信”背后的原理,90%的人答不上来。别笑,这看似弱智的问题,实则是考察你对移动应用分发机制、安全校验及网络协议理解的试金石。我带过不少校招新人,他们背了八股文,却连一个A… · 2026/9/23 0:00:03

你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型
你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型

你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型 面试被问“高并发下如何保证消息不丢失”,你张口就是“用Redis”,结果面试官追问“如果Redis宕机了怎么办”,你瞬间卡壳。这种场景太常见了,很多新手在背八股文时,只记住了技术名词… · 2026/9/23 0:00:29

Win7无线热点配置工具源码解析:解决API失效的3个实战技巧
Win7无线热点配置工具源码解析:解决API失效的3个实战技巧

Win7无线热点配置工具源码解析:解决API失效的3个实战技巧 Win7无线热点配置工具在Win10/11上跑不动?不是你的问题,是版本升级后 API 全变了。很多老项目里的 netsh wlan… · 2026/9/23 0:00:36

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码