使用Python下载网页视频无报错无输出文件问题求助
问题原因
- 你当前代码请求的
dwn_link是视频播放网页的HTML地址,不是视频文件的直链,你写入_video.mp4的内容本质是网页源码,并非视频流数据,所以自然无法正常作为视频打开。 - 你找不到文件是因为文件默认保存在Python脚本运行的当前工作目录下,你可以在代码开头加入以下代码打印工作目录,到对应路径下就能找到生成的文件:
import os print(os.getcwd())
你也可以直接给file_name写绝对路径,比如C:/users/xxx/desktop/_video.mp4,就能直接存到指定位置。
修复方案
第一步:提取真实视频直链
你需要先解析请求得到的HTML源码,从中提取真实的视频资源地址:
- 常规视频站的真实地址会存放在页面
<video>标签的src属性中,部分站点会把地址存在内嵌的JS变量里,你可以打开网页按F12查看元素搜索<video>标签确认。 - 解析HTML推荐使用
BeautifulSoup库,需要提前安装:pip install beautifulsoup4
第二步:添加反爬请求头
大部分站点会拦截无UA标识的请求,你需要构造带User-Agent的请求对象再发送,避免被反爬拦截返回无效数据。
修改后示例代码
try: import urllib.request as urllib2 except ImportError: import urllib2 from bs4 import BeautifulSoup import os # 打印工作目录确认存储位置 print("文件将保存在:", os.getcwd()) # 构造带UA的请求 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36' } page_url = 'https://www1.wdr.de/fernsehen/lokalzeit/ostwestfalen/videos/video-lokalzeit-owl---1304.html' req = urllib2.Request(page_url, headers=headers) # 请求页面解析视频直链 page_rsp = urllib2.urlopen(req) html = page_rsp.read() soup = BeautifulSoup(html, 'html.parser') video_tag = soup.find('video') if not video_tag: raise Exception("未找到视频标签,视频地址可能存在于JS中,需要调整解析逻辑") video_url = video_tag['src'] # 部分站点的src是相对地址,需要拼接域名前缀,这里根据实际情况调整 if video_url.startswith('/'): video_url = 'https://www1.wdr.de' + video_url # 请求视频流保存 video_req = urllib2.Request(video_url, headers=headers) video_rsp = urllib2.urlopen(video_req) file_name = '_video.mp4' with open(file_name, 'wb') as f: f.write(video_rsp.read()) print("视频下载完成")
额外注意
如果页面没有直接暴露<video>标签的src,说明站点做了视频地址加密或者动态加载,你需要抓包分析接口的请求逻辑,或者使用selenium等动态渲染工具拿到加载完成后的页面元素再解析。
内容的提问来源于stack exchange,提问作者KApril
相关产品推荐
相关产品推荐

