Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在使用PyQt捕获网站图像之前,请等待延迟_Python_Macos_Flash_Qt_Pyqt - Fatal编程技术网

Python 在使用PyQt捕获网站图像之前,请等待延迟

Python 在使用PyQt捕获网站图像之前,请等待延迟,python,macos,flash,qt,pyqt,Python,Macos,Flash,Qt,Pyqt,我正在使用PyQt(作为Python初学者)。 我需要能够采取无头系统上的网站截图。 我之前在另一个项目中使用了PhantomJS,但是他们在1.5中放弃了对Flash的支持,我不想在我的新项目中依赖一个不推荐的1.4版本 所以我用PyQt来做我自己的事情。 我可以用给定的url截图一个网站,没问题 但我一直在flash占位符上有“蓝色骰子”flash插件图标(是的,javascript和插件被激活) 我正在Youtube视频页面上做一些测试,以下是我的问题示例: 第二部分,可能与第一部分相关

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

所以我用PyQt来做我自己的事情。 我可以用给定的url截图一个网站,没问题

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

我正在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位问题有关)。

我建议使用。它是为实现web自动化、屏幕截图和测试而设计的。因为它使用firefox,所以完全支持flash非常容易。它也可以在无头模式下运行。下面的代码用于使用flash拍摄网页截图,就像您在youtube上看到的视频一样。你可以看到下面的截图。有几件事要记住。selenium有一个save_屏幕截图方法,您可以看到它在代码中被注释掉了。我没有使用它,因为它没有拍摄flash组件的正确屏幕截图,您可以使用中的技术来纠正这一点。我选择了使用imagemagic导入命令拍摄屏幕截图。这是一个在Linux中工作的屏幕截图工具。您可以查看并获取其他截图方法

代码

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()
屏幕截图


如果您
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_()

这是网站+浏览器的屏幕截图;)@雅各布斯没错,截图实际上就是整个屏幕。我剪切了发布的图像。我将使用Selenium进行一些测试。但我不得不说,当你问“如何在Y上做X”时,我总是有点困扰,有人回答说,在Z上,这很简单。有时候你必须坚持你最初的选择并处理它。但这肯定能帮到我,所以谢谢你@我知道你的意思。我首先尝试使用PyQt4,但我无法让flash正常工作,所以我转而使用selenium。@Marwan Alsabbagh flash video通过启用插件在Pyside/PyQt4中工作。。请查看我在这里的帖子。我正面临着一个拍摄这段youtube视频截图的问题。它显示了黑屏我爱硒,但这实际上回答了被问到的问题。这并不能解决我在Youtube上的奇怪问题,但这正是我一开始想要的。干杯
#!/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_()