2012-12-20 55 views
4

我正在使用PyQt(作爲Python初學者)。 我需要能夠在無頭系統上截取網站截圖。 我之前在另一個項目中使用PhantomJS,但他們在1.5版本中刪除了Flash支持,我不想依賴於我的新項目的已棄用1.4版本。等待延遲,然後用PyQt捕獲網站圖像

所以我使用PyQt做我自己的東西。 我可以使用給定的網址截圖網站,沒問題。

,但我一直有在閃光佔位符「藍色骰子」 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(可能與一個32/64位問題破)。

回答

5

如果您time.sleep你凍結整個應用程序,而不是,你可以使用一個QTimerQEventLoopQThread等。這裏是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 Screenshot

+1

我愛硒,但這實際上回答了被問到的問題 –

+0

謝謝隊友。這並不能解決我在Youtube上的奇怪問題,但這正是我一直在尋找的。乾杯。 –

4

我推薦使用selenium。它用於進行網頁自動化,截圖和測試。因爲它使用Firefox,所以擁有全面的Flash支持非常容易。它也可以在無頭模式下運行。下面的代碼用於使用像youtube視頻一樣的Flash網頁截圖。你可以看到它下面的截圖。有幾件事要記住。硒有一個save_screenshot方法,你可以看到在代碼中註釋掉了。我沒有使用它,因爲它沒有對Flash組件進行適當的截圖,你可以通過使用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

+0

這是網站+瀏覽器的屏幕截圖;) – 2012-12-20 19:11:09

+0

@ X.Jacobs這就是正確的,實際上截圖是全屏。我裁剪了張貼的圖像。 –

+0

我會用Selenium做一些測試。但是我不得不說,當你問「如何做Y on X」時總會有點困擾,而且有人回答說Z很容易。有時你必須堅持你的最初選擇並處理它。 但是,這絕對可以幫助我,所以謝謝你! –