我想使用python執行的javascript下載頁面。 QT是解決方案之一,這裏是代碼:使用javascript執行的下載頁面
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)
的問題是不執行的JavaScript,有時downloader.load()
返回頁面。 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
?