如何使用Python实现广告屏蔽?

5 投票
4 回答
13041 浏览
提问于 2025-04-15 12:41

我正在慢慢用 PyQt4 搭建一个网页浏览器,感觉速度还不错。不过,我想把 easylist.txt 加进去。我相信广告屏蔽工具就是用这个来阻止浏览器的 HTTP 请求的。

那么,使用 Python/PyQt4 该怎么做呢?

[编辑1] 好的。我想我已经设置好了 Privoxy。我没有设置任何额外的过滤器,似乎也能正常工作。我尝试使用的 PyQt4 代码大概是这样的:

self.proxyIP = "127.0.0.1"  
self.proxyPORT= 8118  
proxy = QNetworkProxy()  
proxy.setType(QNetworkProxy.HttpProxy)  
proxy.setHostName(self.proxyIP)  
proxy.setPort(self.proxyPORT)  
QNetworkProxy.setApplicationProxy(proxy)

不过,这段代码完全没有效果,我看不懂文档,也找不到任何例子。

[编辑2] 我刚注意到,如果我把 self.proxyIP 改成我实际的本地 IP,而不是 127.0.0.1,页面就加载不出来。所以应该是发生了什么事情。

4 个回答

0

easylist.txt 文件就是一个普通的文本文件,像这里展示的那样: http://adblockplus.mozdev.org/easylist/easylist.txt

文件中以 [ 和 ! 开头的行看起来是注释,所以我们只需要在这个文件里找出正确的内容,根据行的开头字符来判断在网址或请求中该查找什么。

1

这个问题是关于网络过滤的吗?

那你可以试试一些外部的网络代理,比如Privoxy(http://en.wikipedia.org/wiki/Privoxy)。

6

我知道这个问题已经很老了,但我想试着给出一个答案,供偶然看到这个问题的人参考。你可以创建一个QNetworkAccessManager的子类,然后把它和https://github.com/atereshkin/abpy结合起来。大概可以这样做:

from PyQt4.QtNetwork import QNetworkAccessManager
from abpy import Filter
adblockFilter = Filter(file("easylist.txt"))
class MyNetworkAccessManager(QNetworkAccessManager):
    def createRequest(self, op, request, device=None):
        url = request.url().toString()
        doFilter = adblockFilter.match(url)
        if doFilter:
            return QNetworkAccessManager.createRequest(self, self.GetOperation, QNetworkRequest(QUrl()))
        else:
            QNetworkAccessManager.createRequest(self, op, request, device)
myNetworkAccessManager = MyNetworkAccessManager()

之后,在你所有的QWebView实例上设置以下内容,或者你也可以创建一个QWebView的子类:

QWebView.page().setNetworkAccessManager(myNetworkAccessManager)

希望这对你有帮助!

撰写回答