1

Google で翻訳されたページのスクリーンショットを撮るのに問題があります。以下のスクリプトは、Google 翻訳なしで正常に動作しています (スクリーンショットを撮ります)。

class Render(QWebPage):
    def __init__(self, url):
        self.web_page = QWebPage()
        self.finished = False
        s = self.web_page.settings()
        s.setAttribute(QWebSettings.JavascriptCanOpenWindows, False)
        s.setAttribute(QWebSettings.PluginsEnabled, True)
        self.web_page.mainFrame().setScrollBarPolicy(Qt.Horizontal, Qt.ScrollBarAlwaysOff)
        self.web_page.loadFinished.connect(self._loadFinished)  
        self.web_page.mainFrame().load(QUrl(url))

    def _loadFinished(self, result):
        frame = self.web_page.mainFrame()
        size = frame.contentsSize()
        size.setWidth(1000)
        self.web_page.setViewportSize(size)
        image = QImage(self.web_page.viewportSize(), QImage.Format_ARGB32)
        painter = QPainter(image)
        frame.render(painter)
        painter.end()
        self.filepath="screenshot_name.jpg"
        image.save(self.filepath)
        self.finished = True

def run(url):
    app=QApplication.instance()
    if not app:
        app = QApplication(sys.argv)
    r = Render(url)
    while not r.finished:
        app.processEvents()
        time.sleep(0.01)
    return r.filepath

news_url="http://arabic-media.com/arabicnews.htm"
news_url_google_translate = "http://translate.google.com/translate?hl=en&sl=auto&tl=en&u="+news_url
run(news_url_google_translate)

しかし、翻訳されたページのスクリーンショットを撮る必要があります。Google 翻訳ページは iframe を作成します。そこで、以下を使用して内側のフレーム (name=c) のスクリーンショットを撮りました。

frame = self.web_page.mainFrame().childFrames()[0]

残念ながら、私のスクリプトはまだ黒いスクリーンショットを撮っています。

4

2 に答える 2

1

この例が当てはまるかどうかを確認してください。ネットワーク マネージャーのfinishedシグナルは、ダウンロードが完了した URL をチェックするスロットに接続され、その中に見つかった場合はスクリーンショットをトリガーしますurlRequest

#!/usr/bin/env python
#-*- coding:utf-8 -*-

import sip
sip.setapi('QString', 2)
sip.setapi('QVariant', 2)

from PyQt4 import QtCore, QtGui, QtWebKit, QtNetwork

urlTranslate = "http://translate.google.com/translate?hl=en&sl=auto&tl=en&u=http://arabic-media.com/arabicnews.htm"
urlRequest   = "http://www.google.com/cse/intl/ar/images/google_custom_search_watermark.gif"

class myWindow(QtWebKit.QWebView):
    def __init__(self, parent=None):
        super(myWindow, self).__init__(parent)

        self.page().mainFrame().setScrollBarPolicy(QtCore.Qt.Horizontal, QtCore.Qt.ScrollBarAlwaysOff)
        self.page().mainFrame().setScrollBarPolicy(QtCore.Qt.Vertical, QtCore.Qt.ScrollBarAlwaysOff)

        self.page().networkAccessManager().finished.connect(self.on_networkAccessManager_loadFinished)

        self.load(QtCore.QUrl(urlTranslate))

    @QtCore.pyqtSlot(QtNetwork.QNetworkReply)
    def on_networkAccessManager_loadFinished(self, reply):
        if urlRequest in reply.url().toString():
            self.takeScreenshot()

    def takeScreenshot(self):
        fileName = self.title() + ".png"

        self.page().setViewportSize(QtCore.QSize(1000, 2000))

        image   = QtGui.QImage(self.page().viewportSize(), QtGui.QImage.Format_ARGB32)
        painter = QtGui.QPainter(image)

        self.page().mainFrame().render(painter)
        painter.end()

        if not image.isNull():
            image.save(fileName)
            print "Succesfully saved '{0}'".format(fileName)

        else:
            print "Failed to save '{0}'".format(fileName)

if __name__ == "__main__":
    import sys

    app = QtGui.QApplication(sys.argv)
    app.setApplicationName('myWindow')

    main = myWindow()
    main.show()

    sys.exit(app.exec_())

画像

于 2013-01-08T00:12:17.570 に答える
0

以下のコードを使用して、ページ全体の読み込みの問題を修正しました。このコードは 30 秒後に停止し、スクリーンショットを撮ります。

    self.web_page.networkAccessManager().finished.connect(self.on_networkAccessManager_loadFinished)
    self._error = None

    request = QNetworkRequest()
    request.setUrl(QUrl(url))

    self.timeout_timer = QTimer()
    self.timeout_timer.timeout.connect(self._request_timed_out)

    self.timeout_timer.start(30 * 1000)  #30 seconds
    self.web_page.mainFrame().load(request)

def _request_timed_out(self):
    self._error = 'Custom request timeout value exceeded.'
    print self._error
    self.timeout_timer.stop()
    self.web_page.killTimer(0)
    self.web_page.loadFinished.emit(False)
    self.takeScreenshot()
于 2013-01-08T06:54:46.527 に答える