1

我想下载一个使用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?
4

2 回答 2

0

JavaScript 需要一个运行时来执行(仅 python 不行),如今流行的一个是PhantomJS。不幸的是,PhantomJs 不再支持 python,所以你可以求助于例如Ghost.py来为你完成这项工作,它允许你有选择地执行你想要的 JS。

于 2013-05-22T13:10:22.383 回答
0

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

于 2016-10-06T07:28:46.963 回答