2013-05-22 51 views
1

我想使用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

回答

0

JavaScript需要一個運行時才能執行(python本身不會這樣做),最近流行的一個是PhantomJS。 不幸的是,PhantomJs不再支持python,所以你可以使用例如。 Ghost.py爲你做這個工作,讓你有選擇地執行你想要的JS。

0

您應該使用Selenium
它提供了不同的webdriver的,例如,PhantomJS,或其他常用的瀏覽器,如Firefox。

相關問題