【问题标题】:How to make request through proxy in PyQt4? - I saw the answer but not sure where to put the code如何通过 PyQt4 中的代理发出请求? - 我看到了答案,但不知道把代码放在哪里
【发布时间】:2017-05-21 09:27:21
【问题描述】:

我基本上是在尝试使用 PyQt 废弃一个能够加载 Javascript 的站点,并且我正在尝试通过 PyQt4 中的代理来执行请求。我看到它适用于提出这个已回答问题的人:How to make request through proxy in PyQt4 但我无法使其工作,我不确定在哪里添加答案中建议的信息:

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

知道如何使这段代码完整吗?

我尝试过类似的方法:

import sys 
import socket
import requests
from PyQt4.QtGui import *  
from PyQt4.QtCore import *  
from PyQt4.QtWebKit import *
from PyQt4.QtNetwork import *
from bs4 import BeautifulSoup

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

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

class Browser(QWebView):
    def __init__(self):
        QWebView.__init__(self)
        old_manager = self.page().networkAccessManager()
        new_manager = MyNetworkAccessManager(old_manager)
        self.page().setNetworkAccessManager(new_manager)
        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):
        soup = BeautifulSoup(unicode(self.doc.toHtml()), 'lxml')
        print soup.prettify().encode('utf-8')

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

但是返回一个错误说:

"__init__() 正好接受 1 个参数(给定 2 个)" 就行 new_manager = MyNetworkAccessManager(old_manager)

【问题讨论】:

    标签: python pyqt pyqt4


    【解决方案1】:

    您不应该将旧经理作为参数传递,您必须更改:

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

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

    也改变:

    proxy = QNetworkProxy('HTTP','179.179.253.147', '8080') 
    

    到:

    proxy = QNetworkProxy(QNetworkProxy.HttpProxy, QString("179.179.253.147"), 8080) 
    

    【讨论】:

    • 如果我将代码更改为: ` class Browser(QWebView): def __init__(self): QWebView.__init__(self) new_manager = MyNetworkAccessManager() self.page().setNetworkAccessManager(new_manager) self .setPage(MySettings()) self.loadProgress.connect(self._progress) self.loadFinished.connect(self._loadFinished) self.doc = self.page().currentFrame()`
    • 返回错误就行了:proxy = QNetworkProxy('HTTP','179.179.253.147', '8080') 错误:参数不匹配任何重载调用:QNetworkProxy(): too many参数 QNetworkProxy(QNetworkProxy.ProxyType,主机名:QString = QString(),端口:int = 0,用户:QString = QString(),密码:QString = QString()):参数 1 具有意外类型“str”
    • 好的,我现在没有错误,但它没有为请求使用代理。我正在从这个站点测试不同的 ip/端口:proxynova.com/proxy-server-list/country-fr 如果我尝试加载例如“www.google.com”,如果我使用来自法国的代理 ip,它应该加载谷歌法国,但它不是,它正在从我的国家加载谷歌,这意味着它没有使用新的代理请求。 =(
    • 谢谢,我认为它现在可以工作了非常感谢!
    • 谢谢,是的,我确实将您的答案标记为正确。我想我需要添加一个等待计时器来加载页面,以便能够正确加载页面,但我不确定如何。如果你能帮助我,我已经提出了一个问题:stackoverflow.com/questions/44092488/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多