1723 字
约 5 分钟
2
如何从真实网站提取媒体
2026-09-08
如何从真实网站提取媒体——可复现的手册
目标:把"一个网站到底怎么被提取到东西"这件事,整理成一份你以后照着就能复现/写提取器的操作手册。核心思想一句话:不是程序猜地址藏在哪,是人眼侦察后在代码里固定成"规则"。
一、先建立心智框架:提取的完整闭环
不管哪个网站,提取永远是这 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] 抠取规则的三个技巧:
- 用
({...})、([^"]+)、.*?这种"抓取组"把你要的包起来- 能解析 JSON/HTML 就别用纯字符串硬切,
json.loads/DOM 更稳- 万一正则/路径爬不到了 → 网站改版了,回去 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结尾,继承InfoExtractorid/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 重新看它改成了什么 |
六、一个最实用的提醒(复现时的心态)
别指望一次写对。 真实网站日常都在变,你的"规则"过阵子就会失效。遇到扣不动:
- 先去 F12 看它现在把地址藏哪了(不要瞎猜)
- 把新的"形态"总结成新规则
- 改代码,加个
_TESTS回归用例
你会反复经历"找 → 抠 → 失效 → 再找"这个循环——这不是你不行,而是真实网站就是这样。
七、一句话带走
提取媒体 = 用浏览器 F12 侦察出"地址藏在哪" → 把这条经验写成抠取规则 → 抠出来打包成 info dict。地址不是程序猜的,是人眼看出来的;网站改版就重新看一遍。这就是从真实网站"提取"到东西的全部真相。
相关深入学习库 → [[Extractor-Subsystem]] · [[Info-Dict-Contract]] · [[Startup-and-Registration]];反爬应对见根目录
04真实世界的脏与工程防线.md
评论
0 条
还没有评论,先写一条吧。