Python代码下载HLS流转换为MP4时遭遇SSL验证失败与403禁止访问错误求助
Python代码下载HLS流转换为MP4时遭遇SSL验证失败与403禁止访问错误求助
我最近写了一段代码想从网站下载视频,Chrome的视频下载插件能正常检测并下载,但我的代码却遇到了两个棘手的错误,想请大家帮忙看看怎么解决:
我的代码如下:
from bs4 import BeautifulSoup import requests from subprocess import check_output video_url = 'https://www.dimakids.com/ab6al-aldigetal-s3-1415387355-21011.html#sets' headers = {'User-Agent': 'Mozilla/5.0'} url = requests.get(video_url, headers=headers) page = url.content soup = BeautifulSoup(page, "html.parser") result = str(soup.find_all('video')[0]) result = result.split('src="')[1].split('" type=')[0] print(result) # seg = requests.get(result) # """ # Error: requests.exceptions.SSLError: HTTPSConnectionPool(host='stream.foupix.com', port=443): Max retries exceeded with url: /animeios/1415387355/ab6al_aldigetal_s3_01.mp4/index.m3u8?tkn=jja4Czj-AzbJx1JmvDvQeA&tms=1733079050 (Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1108)'))) # """ # print(seg) print(check_output(f'ffmpeg -i "{result}" -codec copy file.mp4', shell=True)) """ Error: https://stream.foupix.com/animeios/1415387355/ab6al_aldigetal_s3_01.mp4/index.m3u8?tkn=SWf7n3qH8MwFLlq18wngIQ&tms=1733079103: Server returned 403 Forbidden (access denied) """
遇到的两个问题:
- 用
requests.get()请求提取到的HLS链接时,触发SSL证书验证失败错误 - 直接用ffmpeg下载转换时,返回403禁止访问
补充说明:这个HLS链接其实是有效的,用专门的HLS下载工具能正常抓取视频,只是每次请求的tkn和tms参数会动态变化。
解决方案建议
针对这两个问题,我整理了修改后的代码和思路,你可以试试:
from bs4 import BeautifulSoup import requests from subprocess import check_output, CalledProcessError video_url = 'https://www.dimakids.com/ab6al-aldigetal-s3-1415387355-21011.html#sets' # 模拟真实浏览器的完整请求头 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', 'Referer': video_url, 'Accept-Language': 'zh-CN,zh;q=0.9' } # 使用会话保持请求上下文,和浏览器访问状态一致 session = requests.Session() session.headers.update(headers) try: # 获取页面内容并检查请求状态 url_response = session.get(video_url) url_response.raise_for_status() page = url_response.content soup = BeautifulSoup(page, "html.parser") # 更可靠地提取视频src属性 video_tag = soup.find('video') if not video_tag: print("页面中未找到video标签") exit(1) hls_url = video_tag.get('src') if not hls_url: print("video标签中没有src属性") exit(1) print(f"提取到的HLS链接: {hls_url}") # 构造解决SSL和403问题的ffmpeg命令 ffmpeg_cmd = ( f'ffmpeg -hide_banner ' f'-headers "Referer: {video_url}\\r\\nUser-Agent: {headers["User-Agent"]}" ' f'-ssl_verify false ' f'-i "{hls_url}" ' f'-codec copy file.mp4' ) # 执行命令并捕获结果 output = check_output(ffmpeg_cmd, shell=True, stderr=check_output.STDOUT) print("视频下载并转换成功!") except requests.exceptions.RequestException as e: print(f"请求页面时出错: {e}") except CalledProcessError as e: print(f"ffmpeg执行失败,错误信息:\n{e.output.decode('utf-8')}") except Exception as e: print(f"未知错误: {e}")
修改要点说明
解决SSL验证失败:
- 在ffmpeg命令中添加
-ssl_verify false参数,跳过目标网站的SSL证书验证(如果能获取到该网站的合法CA证书,建议用-ca_file参数指定证书路径,更安全) - 若用requests请求HLS链接,可添加
verify=False参数,但需注意安全风险
- 在ffmpeg命令中添加
解决403禁止访问:
- 使用
requests.Session()保持会话,确保请求上下文和浏览器一致 - 补充完整请求头,尤其是
Referer(告诉服务器请求来自原页面)和User-Agent(模拟真实浏览器) - 在ffmpeg中通过
-headers传递这些请求头,让服务器识别为浏览器发起的请求
- 使用
代码健壮性提升:
- 直接通过
video_tag.get('src')提取链接,避免字符串分割的脆弱性 - 添加多阶段异常捕获,方便定位不同环节的错误
- 直接通过
额外提醒
- 跳过SSL验证存在安全风险,优先考虑使用合法CA证书
- 若仍出现403,可尝试从浏览器复制当前页面的Cookie,添加到session的headers中
tkn和tms是动态生成的,每次刷新页面都会变化,务必使用最新提取的HLS链接
备注:内容来源于stack exchange,提问作者Maad A.Galil
相关产品推荐
相关产品推荐

