如何使用Python urllib从指定URL下载目标视频
问题说明
你当前的代码无法正常下载Facebook视频,核心原因如下:
- 代码中传入的链接是Facebook的视频播放网页地址,并非视频文件的直链地址,直接请求该地址只会返回HTML页面内容,保存为
.mp4文件无法正常播放 urllib默认请求头会被Facebook反爬机制识别为爬虫程序,请求会被拦截,返回登录提示或错误页面,拿不到有效内容- 链接中携带的
__cft__、__tn__属于临时鉴权参数,有效期极短,硬编码在代码中很快就会失效 - 代码仅写
import urllib时,部分Python3版本直接调用urllib.request.urlretrieve会抛出模块属性错误,正确导入方式应为import urllib.request
可行实现方法
不要直接请求网页地址下载文件,按以下步骤处理即可:
- 给请求添加真实浏览器的请求头,模拟正常用户访问,绕过基础反爬校验
- 请求视频播放页拿到源码后,从源码中解析出真实的视频文件直链地址
- 对解析到的直链发起流式请求,将内容写入本地mp4文件
参考实现代码如下,运行前先安装依赖:pip install requests beautifulsoup4
import re import requests from bs4 import BeautifulSoup # 替换为目标视频的页面地址,不需要带临时鉴权参数 page_url = "https://www.facebook.com/cofidis/videos/1518507675176091/" # 模拟Chrome浏览器的请求头 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36" } # 请求视频页面源码 page_resp = requests.get(page_url, headers=headers) page_resp.raise_for_status() # 优先匹配高清视频直链,匹配不到则取标清源 hd_video_match = re.search(r'"playable_url_quality_hd":"(.*?)"', page_resp.text) sd_video_match = re.search(r'"playable_url":"(.*?)"', page_resp.text) video_url = "" if hd_video_match: video_url = hd_video_match.group(1).replace("\\/", "/") elif sd_video_match: video_url = sd_video_match.group(1).replace("\\/", "/") else: raise RuntimeError("解析视频直链失败,若视频为非公开内容,请在headers中添加你账号登录后的Cookie后重试") # 流式下载视频,避免大文件占用过多内存 video_resp = requests.get(video_url, headers=headers, stream=True) video_resp.raise_for_status() with open("video.mp4", "wb") as f: for chunk in video_resp.iter_content(chunk_size=2*1024*1024): if chunk: f.write(chunk) print("视频已成功保存为video.mp4")
提示:如果下载的是需要登录才能查看的非公开视频,只需要在headers字典中添加
"Cookie": "你自己Facebook账号登录后的Cookie字符串"即可正常解析下载。
内容的提问来源于stack exchange,提问作者oakka sliki
相关产品推荐
相关产品推荐

