2013-05-22 2 views
1

자바 스크립트로 페이지를 다운로드하고 싶습니다. 파이썬을 사용하여 실행했습니다. 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() 실행 자바 스크립트없이 페이지를 반환한다는 것입니다. Downloader.loadStarted()Downloader.loadFinished()은 한 번만 호출됩니다. 완전한 페이지 다운로드를 기다리는 적절한 방법은 무엇입니까?

편집

def request_ended(reply): 
    print(reply.error(), reply.url().toString()) 

__init__()self.webView.page().networkAccessManager().finished.connect(request_ended)를 추가하고 정의하는 경우는 때때로 reply.error()==QNetworkReply.UnknownNetworkError 것으로 나타났다. 이 동작은 신뢰할 수없는 프록시를 사용하는 경우 일부 리소스 (일부는 js 파일)를 다운로드하지 못하기 때문에 작동하지 않습니다. 따라서 일부는 실행되지 않습니다. 프록시가 사용되지 않으면 (== 연결이 안정적), 모든 reply.error()==QNetworkReply.NoError.

따라서, 업데이트 된 질문은 :

  • reply.request()를 받고 다시 시도하고 그것이 self.webView에 적용 할 수 있습니까?

답변

0

JavaScript는 요즘 인기가있는 (파이썬만으로는 실행되지 않을 것입니다) 실행 시간을 요합니다. PhantomJS 요즘입니다. 유감스럽게도 PhantomJs에는 더 이상 파이썬 지원이 없으므로 예를 들어 Ghost.py이 작업을 수행하면 원하는 JS를 선택적으로 실행할 수 있습니다.

0

Selenium
다른 WebDriver (예 : PhantomJS) 또는 firefox와 같은 다른 일반 브라우저를 제공합니다.

관련 문제