1096 字
约 3 分钟
2
真实世界有多脏——反爬 / JS 签名 / 伪装 / 懒加载
④ 真实世界有多脏——反爬 / JS 签名 / 伪装 / 懒加载
目标:看见"真实互联网有多不配合",以及成熟的工程怎么防御。这四样全都是面试和工作里高频遇到的东西,而且是 yt-dlp 最能"秀肌肉"的地方。
一、脏在哪里:站点不想让你"自动拿视频"
正经网站防的是脚本批量抓取,手段分几层:
| 层级 | 站点做什么 | 想拦住谁 |
|---|---|---|
| 请求头侦测 | 看 User-Agent 是不是浏览器 | 无脑脚本 |
| ** TLS 指纹 ** | 看 TCP/TLS 握手特征(JA3) | 所有 Python 库(urllib/requests) |
| JS 签名 | 让你"必须执行一段 JS 才能算出下载地址" | 不能跑 JS 的纯下载程序 |
| 风控/登录 | 要求 Cookie / 地区 / 年龄验证 | 非浏览器 |
单个站点可能几层一起上 → 这就是那个"下载个视频怎么这么难"的真相。
二、四道工程防线(对应四样技术)
🛡 A. 防"请求头 + TLS 指纹" → 浏览器伪装(impersonation)
只改 User-Agent 没用——反爬会检测 TLS 握手指纹(JA3/JA4),普通 Python 库的握手一眼是"bot"。yt-dlp 用 curl_cffi 复现真实 Chrome 的手握手参数 + 匹配的 UA,让站点以为是真浏览器。
# 关键机制:给请求加一个"伪装目标",该后端 +1000 分碾压其他后端
ydl_opts = {'impersonate': 'chrome'} # yt-dlp 这么开启
- 意义:这是对付 Cloudflare 之类"行为像脚本就拦截"的最常用招。
- 详见学习库 → [[Networking-Layer]]。
🛡 B. 防"必须算签名" → JS 解释器(jsinterp)
不少站点把媒体 URL 加密,链接里藏签名参数,地址要执行它下发的 JS 才能得到。yt-dlp 两种打法:
- 内置一个纯 Python 写的 JS 解释器,现场执行那段签名函数;
- 更重的直接外接 Node / Deno / QuickJS 真去跑。
js = JSInterpreter('function salt(){...}') # 解析站点函数
salt = js.extract_function('salt')() # 算出签名
- 意义:证明"客户端要跑 JS 才能解"这条防线,是可以被"复刻一个 JS 运行时"击穿的。
🛡 C. 现实数据缺字段/易变 → 契约分级(致命 vs 非致命)
站点 JSON 结构常变、字段常缺。yt-dlp 把 info dict 分成必须的(id/url/formats)和可选的(其余全 fatal=False)——可选字段拿不到就跳过,绝不拖垮整个下载。
🛡 D. 防"启动加载 1800 个模块卡死" → 懒加载(lazy)
如果启动就把 1800 个站点模块全 import,会超慢、占内存爆炸。yt-dlp 用懒加载:启动只加载一堆轻量"桩",到真要下载某站时才 import 那个真实模块。
# 伪模式:首次用到才真导入
def real_class(cls):
if '_real_class' not in cls.__dict__:
cls._real_class = importlib.import_module(cls._module)
return cls._real_class
- 详见学习库 → [[Startup-and-Registration]]。
三、把这四样抽成"通用工程意识"
| 真实世界的脏 | 通用的应对思维 |
|---|---|
| 别人故意不让你自动抓 | 理解"他挡在哪一层",用对应工具补那层 |
| 指纹/行为检测 | 不要只改表面参数,要模仿到"协议/握手"层 |
| 需要执行对方的代码 | 准备一个"能执行对方代码的运行时" |
| 现实数据不完美 | 契约分级,缺字段降级而非崩溃 |
| 依赖海量 | 懒加载/按需 import,别一把梭 |
四、对应源码 & 学习库入口
| 技术 | 源码 | 学习库笔记 |
|---|---|---|
| 伪装 | networking/impersonate.py、_curlcffi.py |
[[Networking-Layer]] |
| JS 解释 | jsinterp.py、utils/_jsruntime.py |
[[Support-Layer-JS-Plugins-Utils]] |
| 懒加载 | devscripts/make_lazy_extractors.py、extractor/lazy_extractors.py |
[[Startup-and-Registration]] |
五、一句话带走
真实互联网默认不配合自动抓取(反爬/签名/风控),但每道防线都有对应的工程打法:伪装对指纹、JS 运行时对签名、分级契约对脏数据、懒加载对海量依赖。看懂这四道,你才算真正走进"真实世界做系统"的现场。
真实世界有多脏——反爬 / JS 签名 / 伪装 / 懒加载
http://www.clxhxhhr.top/posts/523/ 评论
0 条
还没有评论,先写一条吧。