为什么要在网页内存中使用多个网页分页符?

2024-09-28 22:56:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用PyQt4的QtWebKit在内存中呈现一个网页,因为我需要在检索嵌入的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秒),但是它只适用于一个页面。这意味着在第一个网页上,我的最终输出如下:

^{pr2}$

但在连续的尝试中,看起来是这样的:

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

我不知道这里发生了什么?在


Tags: fromimportselfappurl网页defsys
1条回答
网友
1楼 · 发布于 2024-09-28 22:56:27

看起来你的javascript解释器只在第一个页面启动;第二个页面被加载,但却永远无法运行它的javascript;但这与你真正的问题无关,那就是视频文件的名称隐藏在看起来像这样的代码块中

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

如果您调用一个javascript控制台并运行lxUTILsign.decode(googleCode);,您将得到

^{pr2}$

坏消息是lxUTILsign被彻底混淆了;好消息是,这无关紧要,因为它只是一个base64解码器,Python已经有了一个(包括电池,宝贝!)。在

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

相关问题 更多 >