1723 字
约 5 分钟
2
如何从真实网站提取媒体

如何从真实网站提取媒体——可复现的手册

目标:把"一个网站到底怎么被提取到东西"这件事,整理成一份你以后照着就能复现/写提取器的操作手册。核心思想一句话:不是程序猜地址藏在哪,是人眼侦察后在代码里固定成"规则"。


一、先建立心智框架:提取的完整闭环

不管哪个网站,提取永远是这 3 步骨架:

① URL 进来 → 认脸(这个 URL 归哪个提取器管)
② 把整页内容抓回来(变成一大坨文本/JSON)
③ 按"人研究的规则"抠出关键字段 → 拼成 info dict

记住:地址藏在哪,不是程序发现的,是开发者用浏览器工具"看"出来的,然后写死成规则。


二、工具准备(你侦察网站时要用)

工具 用途
浏览器开发者工具(F12) 核心侦察工具:Network 看请求、Elements 看结构
Network 面板 看视频请求、发现真实媒体 URL、看请求头
Copy as cURL 把浏览器请求原样导出,方便复现(会带 cookie/header)
Python(requests/curl_cffi) 复现请求、试验解析

[!important] 侦察原则:Follow 浏览器能干什么,脚本就能干什么——因为脚本本质是在模仿浏览器拿到同一个地址。你要做的只是"看清浏览器从哪个请求/哪个字段拿到的地址"。


三、标准侦察流程(复现时的操作步骤)

第 1 步:认清楚你要找的"宝贝"是什么

先明确:这个网站的视频/音频地址,最后藏在哪个形态里? 常见四类:

形态 长相 例子
直接 URL 一个 <video src="http..."> 或直链 老站、文件站
页面内嵌 JSON 一段脚本 var DATA={...},地址在 JSON 里 现代单页应用
跨接口请求 页面还得再发 AJAX 请求拿数据 需要 API 调用的站
加密/签名 地址是别人看不懂的,要先跑一段 JS YouTube / TikTok(进阶)

先搞清楚它是哪一类,决定后面怎么抠。

第 2 步:抓回"源料"(怎么拿到这块内容)

  • 如果直接可见(<video src>):requests.get(url) 就行。
  • 如果要先发个 AJAX:用 F12 的 Network 找到那个接口,curl -X 复现它。
  • 反爬或需要登录:带上 cookie、换 curl_cffi 伪装(见 04真实世界的脏 那篇)。

第 3 步:设计"抠取规则"(核心,也最需要练)

拿到那块内容后,用正则JSON 解析把它抠出来:

# 情况 A:地址在 <video src="..."> 里
video_url = re.search(r'<video[^>]+src="([^"]+)"', html).group(1)

# 情况 B:地址藏在一段 JS 的 DATA 对象里
data_str = re.search(r'var DATA = ({.*?});', html, re.S).group(1)
import json
data = json.loads(data_str)          # 转成字典
video_url = data['stream']['src']    # 再按 key 取

[!tip] 抠取规则的三个技巧:

  1. ({...})([^"]+).*? 这种"抓取组"把你要的包起来
  2. 能解析 JSON/HTML 就别用纯字符串硬切,json.loads/DOM 更稳
  3. 万一正则/路径爬不到了 → 网站改版了,回去 F12 重新看(提取器失效的常见原因)

第 4 步:打包成统一结构(info dict)

不管是哪个网站抠出来的,最后都变成同一套 dict 返回给上层:

return {
    'id': video_id,                    # 必填:唯一标识
    'title': title,                    # 必填
    'formats': [                       # 必填:可选清晰度(或给单个 url)
        {'url': video_url, 'ext': 'mp4', 'format_id': 'mp4-1080'},
    ],
    'description': desc,               # 可选:描述
    # ...其他元数据,能填就填,没有也无所谓
}

四、对应成"写一个提取器"的完整模板(可复用)

# --- 你要放进 yt_dlp/extractor/ 的提取器骨架 ---
class ExampleSiteIE(InfoExtractor):
    IE_NAME = 'example.com'
    # ① 认脸:这个 URL 归我管(命名组 (?P<id>...) 抓视频ID)
    _VALID_URL = r'https?://(?:www\.)?example\.com/v/(?P<id>[0-9a-zA-Z]+)'

    def _real_extract(self, url):
        # ② 拿视频 ID
        video_id = self._match_id(url)

        # ③ 抓回页面(一大坨文本)
        webpage = self._download_webpage(url, video_id)

        # ④ 设计规则抠字段(你 F12 研究出来的)
        title = re.search(r'<title>(.*?)</title>', webpage).group(1)
        video_url = re.search(r'<video[^>]+src="([^"]+)"', webpage).group(1)

        # ⑤ 打包成 info dict
        return {
            'id': video_id,
            'title': title,
            'formats': [{
                'url': video_url, 'ext': 'mp4', 'format_id': 'mp4-1080',
            }],
        }

[!important] 编写要点(对应 Extractor-Subsystem 笔记):

  • 类名以 IE 结尾,继承 InfoExtractor
  • id/title/formats 必填;其余元数据非致命(抠不到就跳过,别让整个提取崩掉)
  • _match_id / _search_regex / _download_webpage 这些基类现成辅助,别自己重写网络逻辑

五、常见状况 & 对策清单(复现时对照)

状况 现象 对策
直链 <video src> 或 http 直连 普通抓取 + 正则自够
藏在 JS/JSON 页面 script 里有 DATA={...} 正则抠出 JSON 段 → json.loads
要另发请求 光抓页面没有地址 F12 Network 找到接口,复现那个请求
需要登录/地区 拿到的是空/受限 加 cookie(浏览器导出)或带地区参数
反爬 403 / 指纹 普通库抓被拦 curl_cffi 伪装浏览器(见 04 那篇)
地址是签名/加密的 看着像乱码、拼不出来 找到签名 JS,用 JS 解释器跑(见 04 那篇)
网站改版 昨天还能,今天地址抠不到 别硬调正则,回去 F12 重新看它改成了什么

六、一个最实用的提醒(复现时的心态)

别指望一次写对。 真实网站日常都在变,你的"规则"过阵子就会失效。遇到扣不动:

  1. 先去 F12 看它现在把地址藏哪了(不要瞎猜)
  2. 把新的"形态"总结成新规则
  3. 改代码,加个 _TESTS 回归用例

你会反复经历"找 → 抠 → 失效 → 再找"这个循环——这不是你不行,而是真实网站就是这样。


七、一句话带走

提取媒体 = 用浏览器 F12 侦察出"地址藏在哪" → 把这条经验写成抠取规则 → 抠出来打包成 info dict。地址不是程序猜的,是人眼看出来的;网站改版就重新看一遍。这就是从真实网站"提取"到东西的全部真相。

相关深入学习库 → [[Extractor-Subsystem]] · [[Info-Dict-Contract]] · [[Startup-and-Registration]];反爬应对见根目录 04真实世界的脏与工程防线.md

如何从真实网站提取媒体
http://clxhxhhr.top/posts/530/
作者
clxstart
发布于
2026-09-08
许可协议
CC BY-NC-SA 4.0
评论
0 条
还没有评论,先写一条吧。