代码之家  ›  专栏  ›  技术社区  ›  marcelo.delta

如何在QWebEnginePage-pyqt5中使用POST方法打开URL

  •  1
  • marcelo.delta  · 技术社区  · 7 年前

    如何在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()
    
    1 回复  |  直到 7 年前
        1
  •  2
  •   Isma    7 年前

    QWebEnginePage 除非你使用Javascript。

    下面是一个如何使用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?