我想下载一个使用python执行的javascript页面。QT 是解决方案之一,代码如下:
class Downloader(QApplication):
__event = threading.Event()
def __init__(self):
QApplication.__init__(self, [])
self.webView = QWebView()
self.webView.loadFinished.connect(self.loadFinished)
def load(self, url):
self.__event.clear()
self.webView.load(QUrl(url))
while not self.__event.wait(.05): self.processEvents()
return self.webView.page().mainFrame().documentElement() if self.__ok else None
def loadFinished(self, ok):
self.__ok = ok
self.__event.set()
downloader = Downloader()
page = downloader.load(url)
问题是有时会downloader.load()
返回一个没有执行 javascript 的页面。Downloader.loadStarted()
并且Downloader.loadFinished()
只被调用一次。等待完整页面下载的正确方法是什么?
编辑
如果添加self.webView.page().networkAccessManager().finished.connect(request_ended)
到__init__()
定义
def request_ended(reply):
print(reply.error(), reply.url().toString())
然后事实证明,有时reply.error()==QNetworkReply.UnknownNetworkError
。当使用不可靠的代理时,会出现这种行为,即无法下载某些资源(其中一部分是 js 文件),因此某些 js 没有被执行。当不使用代理时(== 连接稳定),每个reply.error()==QNetworkReply.NoError
.
所以,更新的问题是:
- 是否可以重试获取
reply.request()
并将其应用于self.webView
?