Python 在使用PyQt捕获网站图像之前,请等待延迟
我正在使用PyQt(作为Python初学者)。 我需要能够采取无头系统上的网站截图。 我之前在另一个项目中使用了PhantomJS,但是他们在1.5中放弃了对Flash的支持,我不想在我的新项目中依赖一个不推荐的1.4版本 所以我用PyQt来做我自己的事情。 我可以用给定的url截图一个网站,没问题 但我一直在flash占位符上有“蓝色骰子”flash插件图标(是的,javascript和插件被激活) 我正在Youtube视频页面上做一些测试,以下是我的问题示例: 第二部分,可能与第一部分相关: 如何让PyQt在截图前等待几秒钟? 正如您在示例中所看到的,右侧的图像仍然被卸载,因为它们是使用javascript和data属性加载的,在我的脚本中,我在loadFinished信号(onLoad()javascript等效)上截图 我的第一个猜测就是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视频页面上做一些测试,以下是我的问题示例: 第二部分,可能与第一部分相关
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_()