等待延迟,然后使用PyQt捕获网站图像

时间:2012-12-20 13:42:20

标签: python macos flash qt pyqt

我正在使用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视频页面上进行一些测试,这是我的问题的一个例子:

image

第二部分,可能与第一部分有关: 如何告诉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事物:看起来OSX上的flash播放器坏了(可能与32/64位问题有关)。

2 个答案:

答案 0 :(得分:5)

如果您time.sleep冻结整个应用程序,则可以使用QTimerQEventLoopQThread等。以下是PyQt4版本:< / p>

#!/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 Screenshot

答案 1 :(得分:4)

我建议使用selenium。它用于进行Web自动化,屏幕截图和测试。因为它使用firefox,所以很容易获得全闪存支持。它也可以在无头模式下运行。下面的代码用于截取带有Flash的网页截图,就像您拥有的YouTube视频一样。你可以看到下面的截图。要记住一些事情。 selenium有一个save_screenshot方法,你可以在代码中注释掉它。我没有使用它,因为它没有采用闪存组件的正确屏幕截图,你可以使用Taking screenshot of flash object using Selenium with Webdriver中的技术来纠正这个问题。我选择使用imagemagic import命令截取屏幕截图。这是一个适用于Linux的截图工具。您可以查看Take a screenshot via a python script. [Linux]Get screenshot on Windows with Python?以了解截屏的其他方法。

<强>码

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()

<强>截图

enter image description here