无法获取<video>标签src,下载站点视频返回500状态码如何解决?
视频下载实现方案
- 首先明确站点的加载逻辑:你抓到的随机后缀文件就是视频分片,该站用
Video.js配合分片加载策略实现防爬,返回的206状态码是分片请求的标准响应,代表仅返回请求范围内的二进制内容,不存在单独的完整视频直链。 - 最简方案(无需写代码):安装浏览器视频嗅探扩展(如猫抓、Video DownloadHelper),在页面正常播放视频时,扩展会自动聚合所有分片为完整视频文件,直接点击下载即可。
- Python代码实现方案:
- 不要硬编码Cookie,先通过会话请求课程页面获取有效认证凭证:用
requests.Session()维持会话,先GET请求课程详情页,自动保存响应返回的XSRF-TOKEN、findow_session等必要Cookie,避免手工复制的Cookie过期失效。 - 动态构造Range请求头:首次请求带
Range: bytes=0-1048575(取1MB分片),从响应头的Content-Range字段提取完整视频的总大小,再按固定分片大小逐段构造Range头发起请求。 - 拼接所有分片的二进制内容写入本地文件,即可得到完整的MP4视频。
- 不要硬编码Cookie,先通过会话请求课程页面获取有效认证凭证:用
示例代码如下:
import requests import time def download_video(course_url, save_path): sess = requests.Session() # 先请求课程页拿有效cookie sess.headers.update({ 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36' }) sess.get(course_url) video_api = 'http://findow.ir/academy/playVideo/%D8%AA%D8%AD%D9%84%DB%8C%D9%84-%D8%AA%DA%A9%D9%86%DB%8C%DA%A9%D8%A7%D9%84-%DA%A9%D9%84%D8%A7%D8%B3%DB%8C%DA%A9?key=A6ovzaxPThTSp0vCC73DyTIMzIlI0C1p5RwtF3xr&course=true&type=medium' chunk_size = 1024 * 1024 # 1MB分片 start = 0 total_size = 0 video_content = b'' while True: range_header = f'bytes={start}-{start + chunk_size - 1}' resp = sess.get(video_api, headers={'Range': range_header}) if resp.status_code not in [206, 200]: break if not total_size: # 从第一次响应拿总大小 content_range = resp.headers.get('Content-Range', '') if content_range: total_size = int(content_range.split('/')[-1]) video_content += resp.content start += chunk_size # 加延迟避免被封 time.sleep(0.5) if start >= total_size: break with open(save_path, 'wb') as f: f.write(video_content) # 调用示例 download_video('http://findow.ir/academy/course/%D8%AA%D8%AD%D9%84%DB%8C%D9%84-%D8%AA%DA%A9%D9%86%DB%8C%DA%A9%D8%A7%D9%84-%DA%A9%D9%84%D8%A7%D8%B3%DB%8C%DA%A9', 'course_video.mp4')
- 补充注意事项:如果接口参数key存在时效,可从课程页的前端JS代码中动态提取最新key值,不要硬编码。
内容的提问来源于stack exchange,提问作者Sir-Sorg
相关产品推荐
相关产品推荐

