我想下载一个使用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
?