requests-html能“自动”获取音视频链接,因其将html解析、javascript渲染(需显式调用.render())和相对url自动补全(via .absolute_links或urljoin)三者集成;但对js动态赋值的src、data-*懒加载属性、iframe嵌套页及xhr/fetch加载的流媒体(如m3u8),仍需手动处理或额外工具。

HTML解析引擎本身不主动抓取多媒体资源,它只负责解析结构、提取URL;真正下载要靠额外的HTTP客户端和逻辑控制。
requests-html 为什么能“自动”拿到音频视频链接
requests-html 的核心优势不是解析能力更强,而是把解析 + 渲染 + URL补全三件事打包了。它默认用 html.parser 解析静态 HTML,遇到 audio、video、source 标签时,会自动调用 .absolute_links 或 urljoin() 补全相对路径。但注意:它不会执行 JS,所以如果 src 是通过 document.querySelector('video').src = xxx 动态赋值的,response.html.find('video') 拿到的仍是空或初始值。
- 必须显式启用渲染:用
session.get(url, timeout=20).html.render()才能处理 JS 注入的媒体地址 - 渲染后仍需手动提取:比如
video = response.html.find('video', first=True); src = video.attrs.get('src') or video.find('source', first=True).attrs.get('src') - 不处理 Referer / Cookie 校验:即使拿到直链,直接
requests.get(src)可能返回 403,得复用原始 session 的 headers
BeautifulSoup 提取 source 和 data-src 的坑
很多页面用懒加载,img 或 video 的真实地址藏在 data-src、data-poster、data-video-src 这类属性里,而标准 src 是占位符(如 about:blank 或空字符串)。BeautifulSoup 不会自动识别这些语义,必须人工指定:
- 查所有可能字段:
tag.get('src') or tag.get('data-src') or tag.get('data-video-src') - 过滤无效值:
if src and not src.startswith(('javascript:', '#', 'data:')) - 补全 URL 时用原始页面 URL 做 base:
urllib.parse.urljoin(base_url, src),别用response.url—— 它可能是重定向后的地址,导致拼错
遇到 iframe 嵌套视频怎么递归提取
第三方视频(如 YouTube、Bilibili)常只给一个 iframe src="https://www.youtube.com/embed/xxx",这个地址本身不是视频文件,而是播放器页面。想拿到真实 MP4 地址,必须再发一次请求解析目标页:
- 先提取
iframe的src属性,确认是可访问的 HTML 页面(不是 jsapi 或 API 接口) - 用新 session 请求该 URL,再用同样逻辑找
video或source标签 - 警惕反爬:有些 iframe 目标页会检测 User-Agent 或 Referer,需复用上层页面的 headers
- 更稳妥的做法是跳过 iframe,直接监听 Network 中的 media 请求 —— 解析引擎做不到这点,得换方案
最易被忽略的一点:HTML 解析器永远看不到浏览器 Network 面板里那些由 Fetch/XHR 加载的流媒体地址(如 .m3u8、.mpd),它们根本不在 DOM 里。这类资源必须结合开发者工具或专用工具(如 yt-dlp)才能获取。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











