You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在PySide6开发的Web浏览器中实现广告拦截功能?

PySide6 浏览器广告拦截功能修复方案

修改后的完整代码

from PySide6.QtWebEngineCore import QWebEngineUrlRequestInterceptor, QWebEngineUrlRequestInfo
from PySide6.QtWebEngineWidgets import QWebEngineProfile, QWebEngineView
from PySide6.QtWidgets import QApplication
from adblockparser import AdblockRules
import sys

# 加载并预处理广告规则:过滤空行与注释行
with open("easylist.txt", encoding="utf-8") as f:
    raw_rules = [line.strip() for line in f if line.strip() and not line.startswith("!")]
rules = AdblockRules(raw_rules)

class AdBlockInterceptor(QWebEngineUrlRequestInterceptor):
    def intercept(self, info: QWebEngineUrlRequestInfo):
        url = info.requestUrl().toString()
        # 仅拦截非文档类请求(避免误拦截主页面)
        if info.resourceType() != QWebEngineUrlRequestInfo.ResourceType.ResourceTypeDocument:
            if rules.should_block(url):
                print(f"拦截广告请求: {url}")
                info.block(True)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    # 配置请求拦截器
    interceptor = AdBlockInterceptor()
    QWebEngineProfile.defaultProfile().setRequestInterceptor(interceptor)
    # 启动浏览器
    browser = QWebEngineView()
    browser.load("https://example.com")
    browser.show()
    sys.exit(app.exec())

关键修复点说明

  • 继承正确的拦截器父类:原代码未继承QWebEngineUrlRequestInterceptor,导致Qt无法识别并调用拦截逻辑,这是代码失效的核心原因。
  • 规则预处理:对easylist规则进行过滤,移除空行和注释行(规则中以!开头的行),避免无效规则干扰解析。
  • 请求类型过滤:只拦截脚本、图片、第三方资源等非文档请求,防止误拦截主页面的加载请求。
  • 完整应用流程:补充了标准的PySide6应用启动流程,确保拦截器被正确初始化和绑定到浏览器配置。

注意事项

  • 确保easylist.txt文件路径正确,可获取最新规则文件更新拦截能力。
  • 确认已安装依赖:执行pip install adblockparser pyside6完成环境配置。
  • 若需要更精准的拦截,可扩展should_block的判断逻辑,比如结合请求的来源URL等参数。

内容的提问来源于stack exchange,提问作者James

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 13:47:48