Я хочу загрузить страницу с javascript, выполненную с использованием python. 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)
Проблема заключается в том, что иногда downloader.load()
возвращает страницу без JavaScript выполняется. Downloader.loadStarted()
и Downloader.loadFinished()
вызываются только один раз. Каков правильный способ дождаться полной загрузки страницы?
EDIT
Если добавить 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
?