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

标签 python python-3.x qt pyqt pyqt5

如何在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()

最佳答案

除非使用 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?

关于python - 如何在QWebEnginePage-pyqt5中使用POST方法打开URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54415536/

相关文章:

Windows 上 Visual Studio 2017 中的 Python 包(numpy/pandas/等)

sockets - python3 上的 Tornado

python类属性

python - 如何在 pylab 中的 nan 上插入行?

python - 为什么自定义对象在 python 中是可哈希的(并且可以在 dict 中使用)?

c++ - 在 Desktop Linux 中检测 HDMI 电缆何时插入

qt - 在路径/org/freedesktop/NetworkManager/ActiveConnection/的对象上没有这样的接口(interface) 'org.freedesktop.DBus.Properties'

qt - KDE平台开发

python - 使用 threading.Lock 作为上下文管理器

mysql - 无法在虚拟环境中为django安装mysqlclient