因此,我一直在开发一个使用PyQt6-WebEngine进行身份验证的系统,该系统可以在javascript重定向之后发出web请求,因为Python中的请求不支持这一点。我制作了一个简单的请求脚本:
import sys
import json
# import PyQt6
import PyQt6
from PyQt6.QtCore import QUrl, QByteArray
from PyQt6.QtWidgets import QApplication
from PyQt6.QtWebEngineCore import QWebEnginePage, QWebEngineHttpRequest
class __Page__(QWebEnginePage):
def __init__(self, app, url=None, method=None, headers=None, data=None) -> None:
# Initiate the application
self.app = app
super().__init__()
# Make sure the necessary variables aren't empty
if url == None:
raise ValueError("Passed url variable cannot be empty")
if method == None:
raise ValueError("Passed method variable cannot be empty")
# Creates the main request variable
self.req = QWebEngineHttpRequest()
# Assign the variables used to setup the request later in self.setupRequest()
self.method = method
self.qurl = url
self.headers = headers
# Only assign this if the method is post
if self.method == "post":
self.postData = data
else:
self.postData = None
# Setup the request
self.setupRequest()
# Create a new html variable and stuff, then load the request and launch the app
self.html = ""
self.loadFinished.connect(self.finish)
self.load(self.req)
self.app.exec()
def setupRequest(self):
# Assign the method variable
if self.method == "get":
method = QWebEngineHttpRequest.Method.Get
elif self.method == "post":
method = QWebEngineHttpRequest.Method.Post
else:
raise ValueError(
"Expected 'get' or 'post' methods, but received '{}'".format(
self.method
)
)
# Assign the method variable to the request method
self.req.setMethod(method)
self.req.setUrl(QUrl(self.qurl))
# Assign the headers
if self.headers != None:
for i in self.headers:
self.req.setHeader(
QByteArray(list(i.keys())[0].encode("ascii")),
QByteArray(list(i.values())[0].encode("ascii")),
)
# Assign the postData if the method is post
if self.method == "post":
self.req.setPostData(bytes(self.postData, "utf-8"))
# This part is a bit over my head
def finish(self):
self.html = self.toHtml(self.callHtml)
self.url = self.url()
self.deleteLater()
self.app.quit()
def callHtml(self, html_str):
self.html = html_str
class app:
def __init__(self) -> None:
self.app = QApplication(sys.argv)
def requestPage(self, url=None, method=None, headers=None, data=None):
page = __Page__(
app=self.app, url=url, method=method, headers=headers, data=data
)
return page
def main():
webapp = app()
request = webapp.requestPage(url="https://google.com", method="get")
if __name__ == "__main__":
main()这方面的问题是,它一直在输出中给我JS错误,它突然开始执行,而且没有明显的原因。对于Google.com,它给出了1-2个错误,比如:js: Error with Permissions-Policy header: Unrecognized feature: 'ch-ua-full-version-list'.和其他网站,它已经把我交给了30+。
除了混乱之外,这本身不会那么烦人,但我还有另一个问题(我不太确定这是这个脚本的错误,但它几乎与JS错误问题相同),在这个问题上,所请求的网站根本不会返回任何html。
有什么想法吗?
发布于 2022-06-02 14:19:50
我最终解决了这个问题: JS错误与请求失败无关。我刚刚发出了无效的请求(标题问题等等)。我仍然不知道为什么这些错误似乎是随机出现的,也许我只是错误地得出了这个结论。
https://stackoverflow.com/questions/71878869
复制相似问题