【问题标题】:How to Open URL with POST method in QWebEnginePage-pyqt5如何在 QWebEnginePage-pyqt5 中使用 POST 方法打开 URL
【发布时间】:2019-01-29 07:04:10
【问题描述】:

如何在 QWebEnginePage-pyqt5 中使用 POST 方法打开 URL,我还需要在每个请求中读取并发布一个 cookie。

def __init__(self, url):
    self.app = QApplication(sys.argv)
    QWebEnginePage.__init__(self)
    self.html = ''
    self.loadFinished.connect(self._on_load_finished)
    self.load(QUrl(url))
    self.app.exec_()

def _on_load_finished(self):
    self.html = self.toHtml(self.Callable)

def Callable(self, html_str):
    self.html = html_str
    self.app.quit()

【问题讨论】:

    标签: python python-3.x qt pyqt pyqt5


    【解决方案1】:

    除非您使用 Javascript,否则您不能使用 QWebEnginePage 发出 POST 请求。

    这是一个如何使用 Qt 类的示例(尚未测试,但应该可以)。

    首先我们发出 get 请求来获取 cookie(您需要为此提供特定的 URL),然后我们存储目标地址的 cookie 并使用一些数据执行 post 请求:

    from PyQt5.QtCore import pyqtSignal, QUrl, QUrlQuery
    from PyQt5.QtNetwork import QNetworkAccessManager, QNetworkReply, QNetworkRequest,QNetworkCookieJar
    
    
    class NetworkManager(QNetworkAccessManager):
        requestFinished = pyqtSignal(QNetworkReply)
    
        def __init__(self):
            super().__init__()
    
        def finished(self, reply):
            super().finished(reply)
            self.requestFinished.emit(reply)
    
    
    class Request:
        def __init__(self):
            super().__init__()
    
            self.network_manager = NetworkManager()
            self.network_manager.requestFinished.connect(self.request_finished)
    
            self.network_manager.setCookieJar(QNetworkCookieJar())
    
            self.url = ''
            self.cookie_url = ''
    
        def _read_cookie(self):
            request = QNetworkRequest(QUrl(self.cookie_url))
            request.setHeader(QNetworkRequest.ContentTypeHeader, "application/x-www-form-urlencoded")
            self.network_manager.get(request)
    
        def _post(self):
            post_data = QUrlQuery()
            post_data.addQueryItem("param1", "value")
            post_data.addQueryItem("param2", "value")
    
            request = QNetworkRequest(QUrl(self.url))
            request.setHeader(QNetworkRequest.ContentTypeHeader, "application/x-www-form-urlencoded")
    
             self.network_manager.post(request, post_data.toString(QUrl.FullyEncoded).toUtf8())
    
        def post_request(self, url, cookie_url):
            self.url = url
            self.cookie_url = cookie_url
    
            self._read_cookie()
    
        def request_finished(self, reply: QNetworkReply):
            reply.deleteLater()
    
            cookies = reply.header(QNetworkRequest.SetCookieHeader)
            if cookies:
                self.network_manager.cookieJar().setCookiesFromUrl(cookies, self.url)
    
            self._post()
    

    请注意,此实现不是线程安全的。

    另外,在 Python 中还有更简单的方法可以做到这一点,使用请求:

    How to send cookies in a post request with the Python Requests library?

    【讨论】:

    • 您要加载的页面有需要执行的javascript。请求这样做?我不这么认为。非常感谢您的关注,非常感谢您的支持。我现在将阅读这段代码。
    • 你应该写下所有的需求,比如你刚才描述的那个!否则很难提供帮助。也许你需要研究硒来做你想做的事。该代码将获得一个 cookie,您可以在 post 调用中重复使用该 cookie 以保持会话,但它不会运行任何 javascript,这是在客户端完成的。
    猜你喜欢
    • 2019-11-26
    • 1970-01-01
    • 1970-01-01
    • 2012-10-23
    • 2012-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多