使用Python从.swf中提取视频

使用Python从.swf中提取视频,python,screen-scraping,web-scraping,Python,Screen Scraping,Web Scraping,我已经编写了代码,生成了视频链接,如下面的视频。 一旦获得,我尝试以以下方式下载: import urllib.request import os url = 'http://www.videodetective.net/flash/players/?customerid=300120&playerid=351&publishedid=319113&playlistid=0&videokbrate=750&sub=RTO&pversion=5.2

我已经编写了代码,生成了视频链接,如下面的视频。 一旦获得,我尝试以以下方式下载:

import urllib.request
import os

url = 'http://www.videodetective.net/flash/players/?customerid=300120&playerid=351&publishedid=319113&playlistid=0&videokbrate=750&sub=RTO&pversion=5.2%22%20width=%22670%22%20height=%22360%22'
response = urllib.request.urlopen(url).read()
outpath = os.path.join(os.getcwd(), 'video.mp4')
videofile = open(outpath , 'wb')
videofile.write(response)
videofile.close()   

我得到的只是那个目录中一个58kB的文件,无法读取。有人能给我指出正确的方向吗?

根据您的代码,您不是在这里下载编码的视频文件,而是用于播放视频的flash应用程序(CWS格式)。它在浏览器中执行,并动态加载和播放视频。您需要应用一些反向工程来找出实际的视频源。以下是我的尝试:

解压缩SWF文件

首先,将您提到的58K文件保存在硬盘上,名称为
test.swf
(或类似名称)。 然后,您可以使用小型Perl脚本:

perl cws2fws test.swf
这将在同一目录中产生一个名为
test.fws.swf
的新文件

在FWS文件中搜索配置URL

我用了一个简单的

strings test.fws.swf | grep http
这将产生:

...
cookieOhttp://www.videodetective.net/flash/players/flashconfiguration.aspx?customerid=
...
有趣。让我们尝试将已知的
customerid
playerid
publisherDID
参数添加到此URL:

http://www.videodetective.net/flash/players/flashconfiguration.aspx?customerid=300120&playerid=351&publishedid=319113
如果我们在浏览器中打开它,我们可以看到播放器配置XML,这反过来又指向

http://www.videodetective.net/flash/players/playlist.aspx?videokbrate=450&version=4.6&customerid=300120&fmt=3&publishedid=&sub=
现在,如果我们打开它,我们最终可以看到源URL:

http://cdn.videodetective.net/svideo/mp4/450/6993/293732.mp4?c=300120&r=450&s=293732&d=153&sub=&ref=&fmt=4&e=20111228220329&h=03e5d78201ff0d2f7df9a
现在我们可以下载这个h264视频文件,我们完成了

在Python脚本中自动化整个过程


这是一项完全不同的任务(留给读者作为练习)。

尝试以下代码:@Sologoub:这与问题有什么关系?如果他想弄明白,我链接的代码可以作为工作的开始。。。尽管如此,正如您所指出的,这个错误似乎更为明显。事实证明,perl脚本使用zlib,而且它相当简单。这个可以吗,但实际上我认为您不需要提取文件来自动获取配置XML和所有这些东西。这只是为了得到它所在位置的初始信息。玩得开心。当我使用脚本将cws转换为fws时,它会告诉我:
zlib.error:error-3而解压缩数据时:错误的头检查
。这是否意味着我的swf文件有一些错误或其他什么?顺便说一下,你的脚本链接断了。