Python QWebView - 延迟

时间:2015-10-01 14:09:51

标签: python qt4 qwebview

我需要一个python脚本来截取网页的截图。我有以下代码运行良好:

class Screenshot(QWebView):
def __init__(self):
    self.app = QApplication(sys.argv)
    QWebView.__init__(self)
    self._loaded = False
    self.loadFinished.connect(self._loadFinished)

def capture(self, url, output_file):
    self.load(QUrl(url))
    self.wait_load()

    # set to webpage size
    frame = self.page().mainFrame()
    self.page().setViewportSize(QSize(900,1600))

    # render image
    image = QImage(self.page().viewportSize(), QImage.Format_ARGB32)
    painter = QPainter(image)
    frame.render(painter)
    painter.end()
    print 'saving', output_file
    image.save(output_file)

def wait_load(self, delay=0):
    # process app events until page loaded

    while not self._loaded:

        self.app.processEvents()
        time.sleep(delay)
    self._loaded = False

def _loadFinished(self, result):
    self._loaded = True

然而,在页面加载后立即截取屏幕截图,我试图截图的页面有一个JS界面,大约需要20秒才能加载所有内容(大图)。我如何推迟浏览器?

我知道我无法通过time.sleep()执行此操作,因为它会冻结包括Web浏览器在内的线程,从而生成相同的图像,因此我知道我需要使用QTimer()但我已经尝试过以下但它不起作用:

class Screenshot(QWebView):
def __init__(self):
    self.app = QApplication(sys.argv)
    QWebView.__init__(self)

def capture(self, url, output_file):

    self._file = output_file
    # set to webpage size
    frame = self.page().mainFrame()
    self.page().setViewportSize(QSize(900,1600))

    self.timerScreen = QTimer()
    self.timerScreen.setInterval(30000)
    self.timerScreen.setSingleShot(True)
    self.timerScreen.timeout.connect(self.grab)
    self.loadFinished.connect(self.timerScreen.start)

    self.load(QUrl(url))

def grab(self):

    # render image
    image = QImage(self.page().viewportSize(), QImage.Format_ARGB32)
    painter = QPainter(image)
    frame.render(painter)
    painter.end()
    print 'saving', self._file
    image.save(self._file)

相反,这会导致调用Screenshot.capture()立即返回,并且不会截屏。

此外,我无法使用app.exec_()方法,因为这导致我的应用程序挂起,因为这是一个更大的无头命令行程序的一部分,这是一个禁止的。

任何输入都表示赞赏。

干杯

0 个答案:

没有答案