如何通过 PyQt4 中的代理发出请求

Posted

技术标签:

【中文标题】如何通过 PyQt4 中的代理发出请求【英文标题】:How to make request through proxy in PyQt4 【发布时间】:2012-12-15 23:49:12 【问题描述】:

我想通过 HTTP 代理发出请求,问题是我真的不明白如何设置它。

这是一个示例代码:

#! /usr/bin/env python2.7

from PyQt4.QtCore import *
from PyQt4.QtGui import *
from PyQt4.QtWebKit import *
from bs4 import BeautifulSoup
import sys

class MySettings(QWebPage):
    def __init__(self):
        QWebPage.__init__(self)
        self.settings().setAttribute(QWebSettings.AutoLoadImages, False)

class Browser(QWebView):
    def __init__(self):
        QWebView.__init__(self)
        self.setPage(MySettings())
        self.loadProgress.connect(self._progress)
        self.loadFinished.connect(self._loadFinished)
        self.doc = self.page().currentFrame()

    def _progress(self, progress):
        print progress

    def _loadFinished(self):
        html = unicode(self.doc.toHtml()).encode('utf-8')
        soup = BeautifulSoup(html[1000])
        print soup.prettify()

if __name__ == "__main__":
    app = QApplication(sys.argv)
    br = Browser()
    url = QUrl('http://http://ip2location.com/')
    br.load(url)
    br.show()
    app.exec_()

我已阅读有关 QNetworkAccessManager 类的信息,但不明白我应该把它放在哪里,或者我应该像使用 QWebPage 那样创建一个不同的类:

class MyNetworkAccessManager(QNetworkAccessManager):
    def __init__(self):
        QNetworkAccessManager.__init__(self)
        proxy = QNetworkProxy('HTTP','127.0.0.1', '8080') 
        self.setProxy(proxy)

如果是这样,如何让我的 Browser(QWebView) 类使用 MyNetworkAccessManager,

或者可能是我完全错了,应该以不同的方式来做。

非常感谢您的帮助。

【问题讨论】:

我知道如何使用 urllib 和 Mechanize 设置代理,但不使用 PyQt4。但是根据这个link,正确的语法是QNetworkProxy.setApplicationProxy(QNetworkProxy(QNetworkProxy.HttpProxy, "proxy.example.com", 8080))HTH。 【参考方案1】:

要使用您创建的QNetworkAccessManager 子类,请将此代码添加到您的Browser

old_manager = self.page().networkAccessManager()
new_manager = MyNetworkAccessManager(old_manager)
self.page().setNetworkAccessManager(new_manager)

【讨论】:

以上是关于如何通过 PyQt4 中的代理发出请求的主要内容,如果未能解决你的问题,请参考以下文章

通过 SOCKS 代理发出 HTTP 请求

如何将通过 Filepicker 发出的文件上传请求转换为使用 PHP 中的简单 HTML 文件控件发出的类似请求?

如何检查请求是不是通过 CodeIgniter 中的 AJAX 发出?

如何使用 luminati.io 等代理服务器正确地向 https 发出请求?

使用 SOCKS 代理发出 HTTP 请求

如何使用 Javascript 中的动态链接数组发出多个 Axios 请求?