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

2024-09-28 22:58:49 发布

您现在位置:Python中文网/ 问答频道 /正文

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

所以我用PyQt自己做我的事情。 我可以用给定的网址截图,没问题。

但我一直在flash占位符上显示“blue dice”flash插件图标(是的,javascript和插件被激活)

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

我正在Youtube视频页面上做一些测试,下面是我的问题示例:

image

第二部分,可能与第一部分有关: 我怎么能让PyQt在截图前等几秒钟? 正如您在示例中看到的,右侧的图像仍然是卸载的,因为它们是使用javascript和data属性加载的,在我的脚本中,我在loadFinishedsignal(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位问题有关)。


Tags: 项目self插件true示例settings页面javascript
2条回答

我建议使用selenium。它是为进行网络自动化、屏幕截图和测试而设计的。因为它使用firefox,所以很容易获得完整的flash支持。它也可以在无头模式下运行。下面的代码可以像youtube视频一样用flash截取网页截图。你可以看到下面的截图。有几件事要记住。selenium有一个save_屏幕截图方法,您可以看到它在代码中被注释掉了。我没有使用它是因为它没有对flash组件进行正确的屏幕截图,您可以使用Taking screenshot of flash object using Selenium with Webdriver中的技术来纠正这个问题。不过,我选择了使用imagemagic导入命令拍摄屏幕截图。这是一个屏幕截图工具,在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

如果您要冻结整个应用程序,则可以使用QTimerQEventLoopQThread

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

相关问题 更多 >