执行javascript的下载页面

时间:2013-05-22 12:43:22

标签: python-3.x pyqt4 qtnetwork

我想下载一个使用python执行javascript的页面。 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()会在没有执行javascript的情况下返回页面。 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

2 个答案:

答案 0 :(得分:0)

JavaScript需要执行运行时(仅python不会执行)这些天流行的是PhantomJS。 不幸的是,PhantomJs已经不再支持python了,所以你可以求助于Ghost.py为你做这项工作,让你有选择地执行你想要的JS。

答案 1 :(得分:0)

您应该使用Selenium
它提供了不同的WebDriver,例如PhantomJS,或其他常见的浏览器,如firefox。