1

PyQt4 の QtWebKit を使用して Web ページをメモリにレンダリングしています。これは、埋め込まれた Flash ビデオ要素を取得する必要があるときに JavaScript を実行する必要があるためです。現在、私が使用しているコードは次のようになります。

import sys
from PyQt4.QtGui import *
from PyQt4.QtCore import *
from PyQt4.QtWebKit import QWebSettings, QWebPage

class Render(QWebPage):
    def __init__(self, url):
        self.app = QApplication(sys.argv)
        QWebPage.__init__(self)

        # Settings
        s = self.settings()
        s.setAttribute(QWebSettings.AutoLoadImages, False)
        s.setAttribute(QWebSettings.JavascriptCanOpenWindows, False)
        s.setAttribute(QWebSettings.PluginsEnabled, True)

        self.loadFinished.connect(self._loadFinished)
        self.mainFrame().load(QUrl(url))
        self.app.exec_()

    def _loadFinished(self, result):
        self.frame = self.mainFrame()
        self.app.quit()

def get_page_source(url):
    r = Render(url)
    html = r.frame.toHtml()
    return html

これで問題なく動作しますが、初期化には非常に時間がかかります (開始に 5 ~ 30 秒かかります) が、単一のページでのみ問題なく動作します。つまり、最初の Web ページでは、最終的な出力は次のようになります。

<div>
    <embed type="application/x-shockwave-flash" src="/player.swf" width="560" height="440" style="undefined" id="mediaplayer" name="mediaplayer" quality="high" allowfullscreen="true" wmode="opaque" flashvars="width=560&amp;height=440&amp;autostart=true&amp;fullscreen=true&amp;file=FILELINK"></embed>
</div>

しかし、連続して試行すると、次のようになります。

<div>
    <font>
        <u>
            <b>
                <a href="http://get.adobe.com/flashplayer/">ATTENTION:<br>This video will not play. You currently do not have Adobe Flash installed on this computer. Please click here to download it (it's free!)
                </a>
            </b>
        </u>
    </font>
</div>

私が気付いていないここで何が起こっているのですか?

4

1 に答える 1

1

JavaScript インタープリターが最初のページでのみ起動するようです。2 番目のページは読み込まれますが、JavaScript が実行されることはありません。しかし、それはあなたの本当の問題とは無関係です。それは、ビデオファイルの名前が次のようなコードのチャンクに隠されているということです

<script type="text/javascript">
    var googleCode = 'czEuYWRkVmFyaWFibGUoImZpbGUiLCJodHRwOi8vd2lsbGlhbS5yaWtlci53aW1wLmNvbS9sb2FkdmlkZW8vMDA5YzUwMzNkZmYyMDQ3MmJiYzBjMjk2NmJjNzI2MjIvNGZmNGQ2ZDYvd2ViLXZpZGVvcy9iZTVjYWI2YjcxNmU0OWExZjFiYzc3NGNlMjVlZDg0Yl93YWtlci5mbHYiKTs=';
    eval(lxUTILsign.decode(googleCode));
</script>

JavaScriptコンソールを呼び出して実行lxUTILsign.decode(googleCode);すると、

"s1.addVariable(\"file\",\"http://worf.wimp.com/loadvideo/2e368b70f8577ad167087530fc73748d/4ff4f5df/web-videos/35e78d1932b24f80ae3a9210fce008c4_titanic.flv\");"

悪いニュースは、lxUTILsign が完全に難読化されていることです。良いニュースは、これは単に base64 デコーダーであり、Python には既に 1 つある (バッテリーが含まれている、ベイビー!) ため、関係がないということです。

import base64
import urllib2
import re

def get_video_url(page_url):
    html = urllib2.urlopen(url).read()
    match = re.search("googleCode = '(.*?)'", html)
    if match is None:
        raise ValueError('googleCode not found')
    googleString = base64.b64decode(match.group(1))
    match = re.search('","(.*?)"', googleString)
    if match is None:
        raise ValueError("didn't find video url")
    return match.group(1)

url = 'http://www.wimp.com/titanicpiano/'
print get_video_url(url)

戻り値

http://worf.wimp.com/loadvideo/8656607f77689f759d54b4ec7207152d/4ff4ff9c/web-videos/35e78d1932b24f80ae3a9210fce008c4_titanic.flv
于 2012-07-05T02:45:04.233 に答える