4

私は(Pythonの初心者として)PyQtを使用しています。ヘッドレスシステムでウェブサイトのスクリーンショットを撮れるようにする必要があります。以前に別のプロジェクトでPhantomJSを使用していましたが、1.5でFlashのサポートが終了したため、新しいプロジェクトで非推奨の1.4バージョンに依存したくありません。

だから私は自分で自分の仕事をするためにPyQtを使っています。指定されたURLでウェブサイトのスクリーンショットを撮ることができます。問題ありません。

しかし、フラッシュプレースホルダーに「青いサイコロ」のフラッシュプラグインアイコンが表示され続けます(はい、JavaScriptとプラグインがアクティブになっています)

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

私はYoutubeビデオページでいくつかのテストを行っています。これが私の問題の例です:

画像

最初の部分に関連している可能性のある2番目の部分:スクリーンショットを撮る前に数秒待つようにPyQtに指示するにはどうすればよいですか?例でわかるように、右側の画像はjavascriptとdata属性を使用してロードされているため、まだアンロードされています。私のスクリプトでは、loadFinishedシグナル(onLoad()javascriptと同等)のスクリーンショットを撮ります。

私の最初の推測は単に

time.sleep(2) 

キャプチャメソッドを呼び出す前ですが、機能していません。このスリープ時間中はWebkitの読み込みもスリープ状態であり、ページに何も読み込まれないと想定しています。

カスタム信号を作成しようとしましたが、それでもスリープせずにトリガーする方法がわかりません。

私の最後の推測は、アプリケーションをスレッド化する必要があるということです。私は正しいですか?

フラッシュコンテンツの表示やsetTimeoutのようなシグナルの追加に役立つヒント/スクリプトがあれば、本当にありがたいです。

よろしくお願いします。

編集: 私のソリューションを追加するための簡単な編集:

timeoutTimer = QTimer()
timeoutTimer.setInterval(3000) # wait for 3secs
timeoutTimer.setSingleShot(True)
timeoutTimer.timeout.connect(theMethodToCallOnTimeout)

フラッシュについて:OSXでフラッシュプレーヤーが壊れているようです(おそらく32/64ビットの問題に関連しています)。

4

2 に答える 2

6

time.sleepアプリケーション全体をフリーズする場合は、代わりに、、、などを使用できます。PyQt4QTimerバージョンQEventLoopQThread次のとおりです。

#!/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スクリーンショット

于 2012-12-20T18:53:37.040 に答える
4

セレンの使用をお勧めします。これは、Web自動化、スクリーンショット、およびテストを行うために作成されています。Firefoxを使用しているため、フラッシュを完全にサポートするのは非常に簡単です。ヘッドレスモードで実行することもできます。以下のコードは、あなたが持っていたyoutubeビデオのようなフラッシュ付きのWebページのスクリーンショットを撮るのに役立ちます。下のスクリーンショットをご覧ください。覚えておくべきいくつかのこと。seleniumにはsave_screenshotメソッドがあり、コードでコメントアウトされていることがわかります。フラッシュコンポーネントの適切なスクリーンショットを撮っていなかったため、使用しませんでした。これは、SeleniumとWebdriverを使用してフラッシュオブジェクトのスクリーンショットを撮るテクニックを使用して修正できます。。ただし、imagemagicimportコマンドを使用して画面のスクリーンショットを撮ることを選択しました。これは、Linuxで動作するスクリーンショットツールです。Pythonスクリプトを介してスクリーンショットを撮るをチェックアウトできます。[Linux]そしてPythonを使ったWindowsでスクリーンショットを取得しますか?スクリーンショットを撮る他のアプローチについて。

コード

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

スクリーンショット

ここに画像の説明を入力してください

于 2012-12-20T16:05:53.910 に答える