2013-05-22 4 views
1

Я хочу загрузить страницу с 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?

ответ

0

JavaScript требует, чтобы исполняемое время выполнялось с (один python не будет делать), популярным является PhantomJS в эти дни. К сожалению, у PhantomJs больше нет поддержки python, поэтому вы можете прибегнуть к, например, Ghost.py, чтобы выполнить эту работу для вас, которая позволяет вам выборочно выполнять JS, который вы хотите.

0

Вы должны использовать Selenium
Он обеспечивает различное WebDriver, например, PhantomJS или другие распространенные браузеры, как светлячок.

Смежные вопросы