动态网页爬取为什么会遇到反爬:一次学习记录
爬虫与数据

动态网页爬取为什么会遇到反爬:一次学习记录

这篇文章只保留学习和工程理解角度:为什么有些网页必须执行 JS,为什么复杂站点会增加采集难度。

本文整理自早期学习笔记,发布时间按学习阶段归档。

本文只讨论网页渲染与数据获取的工程理解,实际采集应遵守网站协议、版权要求和法律法规。

正文

前言:

爬虫执行 JS(deno)场景:网页的核心数据是 JS 动态渲染的(比如 Ajax 加载、Vue/React 动态生成),爬虫只爬静态 HTML 拿不到数据,必须执行网页的 JS(用 deno/Pyppeteer 等),最终要么拿到渲染后的完整数据,要么拿不到(JS 执行失败)

图片占位:Pasted image 20260308183122.png

图片占位:Pasted image 20260308183232.png

1.

图片占位:Pasted image 20260308215319.png

  1. 粘贴为 txt:

图片占位:Pasted image 20260308215402.png

  1. 配置一下

图片占位:Pasted image 20260308215438.png

成功:

图片占位:Pasted image 20260308215240.png

But: 第一次见

Js n 挑战

图片占位:Pasted image 20260308220028.png

简单来说,这个反爬策略的核心就是 “让只有能正常执行我最新 JS 的客户端,才能拿到视频地址”,而你的问题是执行 JS 的环节(deno)掉链子了。

2. 关键细节拆解

  • 核心:混淆的 “n 函数”

YouTube 会把视频播放地址的核心验证参数(叫signature,签名)通过一段高度混淆的 JavaScript 代码保护起来,这段代码里的核心逻辑就是 “n 函数”。

真人浏览器会自动执行这段 JS,算出有效的签名;
而 yt-dlp 这类 Python 工具本身无法执行 JS,必须依赖外部的 deno / node.js 这类外部 JS 运行时来模拟执行。

  • 为什么会 “found 0 n function possibilities”?

这是因为 YouTube 近期更新了 JS 混淆方式(比如改了 n 函数的变量名、嵌套结构、加密逻辑),
你的 yt-dlp 版本或 deno 运行时没能识别出新的 n 函数结构,导致 “找不到可执行的 n 函数”
—— 签名计算失败,
自然拿不到真实的视频格式,最终报错 “Requested format is not available”。

  • 策略的 “进阶防护”

除了混淆 JS,这个反爬策略还包含:

✅ 环境检测:JS 会检测运行环境(比如是否是真实浏览器的 V8 引擎),deno/node 这类非浏览器环境容易被识别,导致执行失败;

✅ 动态更新:YouTube 会频繁修改 n 函数的混淆规则,让爬虫工具的适配永远 “慢一步”;

✅ 签名时效性:就算算出了签名,也只有短时间内有效,进一步增加爬虫难度。

什么是 deno?

1. Node.js(✅ 最推荐替代 deno 的工具)

  • 核心定位:和 deno 同属「JavaScript/TypeScript 独立运行时」,是目前最主流、生态最完善的 JS 执行工具(deno 就是 Node.js 创始人重新设计的替代品)。
  • 核心特点:
  • 兼容性极强,yt-dlp 对 Node.js 的适配远好于 deno;
  • 安装简单,跨平台(Windows/macOS/Linux);
  • 能稳定执行 YouTube 混淆的 JS 代码,解决 “n 挑战” 问题。
  • 为什么适合你的场景:之前 deno 执行失败,换成 Node.js 是解决 yt-dlp 中 JS 挑战最直接的方案,几乎能规避 90% 的 “JS 执行失败” 报错。

2. Bun(🚀 新兴高性能工具)

  • 核心定位:新一代 JS/TS 运行时,兼容 Node.js 生态,执行速度比 Node.js/deno 更快。
  • 核心特点:
  • 体积小、启动快,对混淆 JS 的解析效率更高;
  • 内置包管理、转译等功能,无需额外配置;
  • yt-dlp 最新版本已适配 Bun,可作为 Node.js 的替代。

图片占位:Pasted image 20260308221356.png

你可能也会喜欢...

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注