4

我正在使用 PyQt(作为 Python 初学者)。我需要能够在无头系统上截取网站的屏幕截图。我之前在另一个项目中使用 PhantomJS,但他们在 1.5 中放弃了 Flash 支持,我不想在我的新项目中依赖已弃用的 1.4 版本。

所以我使用 PyQt 自己做我的事情。我可以截取具有给定网址的网站的屏幕截图,没问题。

但我一直在 Flash 占位符上显示“蓝色骰子”Flash 插件图标(是的,javascript 和插件已激活)

self.settings.setAttribute(QtWebKit.QWebSettings.PluginsEnabled,True) 
self.settings.setAttribute(QtWebKit.QWebSettings.JavascriptEnabled,True) 

我正在 Youtube 视频页面上进行一些测试,这是我的问题的一个示例:

图片

第二部分,可能与第一部分有关:如何告诉 PyQt 在截屏前等待几秒钟?正如您在示例中看到的,右侧的图像仍然未加载,因为它们是使用 javascript 和 data 属性加载的,在我的脚本中,我截取了loadFinished信号(onLoad() javascript 等效项))。

我的第一个猜测是

time.sleep(2) 

在调用我的捕获方法之前,它不起作用。我假设 Webkit 加载在此睡眠时间内也处于睡眠状态,从而防止页面上加载任何内容。

我试图创建一个自定义信号,但是我仍然不知道如何在不睡觉的情况下触发它。

我最后的猜测是我需要线程化我的应用程序。我对吗?

如果您有任何提示/脚本来帮助我显示 Flash 内容和/或添加类似 setTimeout 的信号,我将不胜感激!

提前感谢您的帮助。

编辑: 只需快速编辑即可添加我的解决方案:

timeoutTimer = QTimer()
timeoutTimer.setInterval(3000) # wait for 3secs
timeoutTimer.setSingleShot(True)
timeoutTimer.timeout.connect(theMethodToCallOnTimeout)

关于 flash 的事情:看起来 flash 播放器在 OSX 上坏了(可能与 32/64 位问题有关)。

4

2 回答 2

6

如果您time.sleep要冻结整个应用程序,则可以使用QTimer, QEventLoop,QThread等。这是 PyQt4 版本:

#!/usr/bin/env python
#-*- coding:utf-8 -*-

from PyQt4.QtCore import *
from PyQt4.QtGui import *
from PyQt4.QtWebKit import *

class browser(QWebView):
    def __init__(self, parent=None):
        super(browser, self).__init__(parent)

        self.timerScreen = QTimer()
        self.timerScreen.setInterval(2000)
        self.timerScreen.setSingleShot(True)
        self.timerScreen.timeout.connect(self.takeScreenshot)

        self.loadFinished.connect(self.timerScreen.start)
        self.load(QUrl("http://www.google.com/ncr"))    

    def takeScreenshot(self):    
        image   = QImage(self.page().mainFrame().contentsSize(), QImage.Format_ARGB32)
        painter = QPainter(image)

        self.page().mainFrame().render(painter)

        painter.end()
        image.save(self.title() + ".png")

        sys.exit()

if __name__ == "__main__":
    import  sys        
    app  = QApplication(sys.argv)
    main = browser()
    app.exec_()

QWebView 截图

于 2012-12-20T18:53:37.040 回答
4

我建议使用selenium。它是为进行 Web 自动化、屏幕截图和测试而设计的。因为它使用 Firefox,所以很容易获得完整的 Flash 支持。它也可以在无头模式下运行。下面的代码可用于使用 Flash 截取网页的屏幕截图,例如您拥有的 youtube 视频。您可以在下面看到它拍摄的屏幕截图。有几件事要记住。selenium 有一个 save_screenshot 方法,你可以看到它在代码中被注释掉了。我没有使用它,因为它没有正确截取 flash 组件的截图,您可以使用使用 Selenium 和 Webdriver 截取 flash 对象中的技术来纠正这个问题. 我选择使用 imagemagic import 命令截取屏幕截图。这是一个适用于 Linux 的屏幕截图工具。您可以查看通过 python 脚本截取屏幕截图。[Linux]使用 Python 在 Windows 上获取屏幕截图?对于其他截屏方法。

代码

import time, selenium.webdriver, subprocess
browser = selenium.webdriver.Firefox()
browser.get('http://www.youtube.com/watch?v=bFEoMO0pc7k')
time.sleep(6)
#browser.save_screenshot('test.png')
subprocess.check_output('import -window root screen.png', shell=True)
browser.quit()

截屏

在此处输入图像描述

于 2012-12-20T16:05:53.910 回答