You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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}")

修改要点说明

  1. 解决SSL验证失败:

    • 在ffmpeg命令中添加-ssl_verify false参数,跳过目标网站的SSL证书验证(如果能获取到该网站的合法CA证书,建议用-ca_file参数指定证书路径,更安全)
    • 若用requests请求HLS链接,可添加verify=False参数,但需注意安全风险
  2. 解决403禁止访问:

    • 使用requests.Session()保持会话,确保请求上下文和浏览器一致
    • 补充完整请求头,尤其是Referer(告诉服务器请求来自原页面)和User-Agent(模拟真实浏览器)
    • 在ffmpeg中通过-headers传递这些请求头,让服务器识别为浏览器发起的请求
  3. 代码健壮性提升:

    • 直接通过video_tag.get('src')提取链接,避免字符串分割的脆弱性
    • 添加多阶段异常捕获,方便定位不同环节的错误

额外提醒

  • 跳过SSL验证存在安全风险,优先考虑使用合法CA证书
  • 若仍出现403,可尝试从浏览器复制当前页面的Cookie,添加到session的headers中
  • tkn和tms是动态生成的,每次刷新页面都会变化,务必使用最新提取的HLS链接

备注:内容来源于stack exchange,提问作者Maad A.Galil

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 15:47:58