Python爬虫:爬取网课swf文件后,播放仅有声音,视频异常如何解决?

爬取如下网页的播放内容,http://cqsj365.com/play.aspx?id2=157

爬取的内容是一个 swf 文件,下载后尝试各种播放器,播放效果都是只有声音,没有画面,画面显示内容为some of the files needed to play radio or video are missing or corrupt,如下图

求大佬帮忙解答


Python爬虫:爬取网课swf文件后,播放仅有声音,视频异常如何解决?

18 回复

swf 是那个播放器,不是视频源文件


这个问题很典型,通常是SWF文件本身不完整,或者它需要依赖网络上的其他资源(比如视频流分片、配置文件)才能正常播放,你只爬了主文件,没拿到关键数据。

核心思路是:用专业的工具分析这个SWF的网络请求,找到真正的视频源。别跟SWF本身较劲。这里给你一个用 mitmproxy 配合 requests 的实战方案。

1. 抓包分析真实地址 别用浏览器开发者工具看SWF了,直接抓包看它运行时到底请求了什么。用 mitmproxy 最直接。

pip install mitmproxy

启动 mitmdump 并设置好代理,然后去播放页面让它加载。仔细看 mitmdump 控制台输出的所有请求URL,重点找包含 .mp4.flv.m3u8 或者带有 videostream 等关键词的链接,那才是真正的视频文件或流。

2. 找到地址后直接下载 如果找到的是直接视频链接(比如 .mp4),直接用 requests 下载:

import requests

video_url = "你抓包找到的真实视频地址"
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
}

response = requests.get(video_url, headers=headers, stream=True)
with open('course_video.mp4', 'wb') as f:
    for chunk in response.iter_content(chunk_size=1024):
        if chunk:
            f.write(chunk)
print("下载完成")

如果是 m3u8 流,你需要用 m3u8 库解析并下载所有 .ts 分片,然后合并。这里给个关键代码片段:

import requests
import m3u8

m3u8_url = "你抓到的m3u8地址"
playlist = m3u8.load(m3u8_url)

for segment in playlist.segments:
    # 下载每一个 segment.uri
    # 注意:uri可能是相对路径,需要拼接基础URL
    pass
# 下载后用ffmpeg或简单二进制合并ts文件

总结:放弃处理SWF,直接抓包找真正的视频源文件。

一般网站根网址有个 crossdomain.xml 的,你看它有没有加载

需要这个 swf 文件当播放器
http://cqsj365.com/flash/play.swf

麻烦请教一下您,怎么使用这个 swf 文件当播放器呢

FFmpeg 解开看看吧。

音频是 mp3,视频是存储的偏移量。


解开之后有办法转换为别的格式么?

我对 Flash 不熟悉。用 FFDec 看了一下,里面有每一帧调用的方法,但是这个 SWF 里没有定义,你找找是不是还有另外一个 SWF 吧。

以上是我的猜测。

另外还有一个 play.swf, http://cqsj365.com/flash/play.swf ,请问这个如何导入然后转换呢

上一条忘了 了

我在想 不行就用 win10 录像得了

然后再自己压缩 剪辑一下

#11 win10 怎么录像?自带的?

对这个不熟悉,只知道照着原样写一个 HTML 可以,但是估计不是你想要的答案

WIN + G 启动录像

你好,你这个是自己在写一个 html 来播放吗,能麻烦具体讲一下吗

反编译一下他的 flash 如图,然后把对应的文件传到服务器上

回到顶部