Skip to content

常见反爬与JS处理

当你开始抓真实网站时,很快就会发现:真正难的往往不是“会不会发请求”,而是“目标网站并不希望你轻易抓到数据”。

所以这一节的重点,不是教你用暴力方式去对抗网站,而是帮助你建立正确分析思路:

  • 网站常见会做哪些限制
  • 为什么会抓不到内容
  • 页面里的 JavaScript 到底起了什么作用
  • 你该如何合法、理性地分析问题

本节目标

  • 理解常见反爬机制有哪些
  • 理解请求头、Cookie、Referer、User-Agent 为什么重要
  • 理解 JavaScript 动态渲染和参数生成的常见位置
  • 理解浏览器开发者工具在分析中的作用
  • 建立合规、理性的排查思路

先明确一个前提

很多网站设置限制并不是“针对你个人”,而是为了:

  • 防止服务器被高频抓取拖垮
  • 防止数据被恶意盗用
  • 防止滥用接口
  • 保护登录态和用户信息

所以学习这一节时,你要形成一个很重要的意识:

  • 先分析
  • 再判断是否有合理获取方式
  • 尽量使用公开接口、官方 API 或经过授权的方式

而不是把“反爬”理解成“必须绕过一切限制”。

常见反爬机制有哪些

1. 请求头检查

很多网站会检查这些头信息:

  • User-Agent
  • Referer
  • Cookie

如果它们明显不合理,网站可能直接拒绝请求,或者返回异常页面。

2. 访问频率限制

如果你请求过快,网站可能会:

  • 限速
  • 暂时封禁
  • 返回验证码页

3. 登录态校验

有些内容必须在已登录状态下才能看。

如果没有有效 Cookie 或会话状态,爬虫请求到的可能只是登录页。

4. JavaScript 动态渲染

有些页面最初返回的 HTML 很空,真正数据是后续通过 JavaScript 请求接口获得的。

5. 参数动态生成

有些请求参数、签名、时间戳并不是直接写死在页面里,而是浏览器执行脚本后生成的。

6. 验证码

常见形式包括:

  • 字符验证码
  • 滑块验证码
  • 点选验证码

这些本质上都属于行为验证或访问限制。

请求头为什么这么关键

很多初学者会觉得:

  • 我只是正常发了一个请求
  • 为什么网站不给我内容

原因之一就是请求头不符合正常浏览器特征。

User-Agent

它用来说明客户端身份。

如果你完全不带它,或者值非常异常,网站可能会怀疑不是正常浏览器访问。

Referer

表示请求来源页面。

有些网站通过它判断当前请求是不是“正常页面流程中的下一步”。

很多登录态、会话态、用户状态都依赖它。

如果 Cookie 不对,常见结果是:

  • 数据页变成登录页
  • 返回内容不完整
  • 接口直接拒绝

JavaScript 在反爬分析里为什么经常出现

不是因为 JavaScript 天生“反爬”,而是因为很多页面和请求逻辑确实依赖它。

例如:

  • 页面内容通过 JS 请求接口后再渲染
  • 请求参数通过 JS 计算生成
  • 某些签名逻辑写在前端脚本里

所以你学这部分,不是为了“和 JS 对抗”,而是为了看清楚:

  • 数据到底从哪里来
  • 参数到底怎么产生

浏览器开发者工具为什么重要

后面你会非常频繁地使用浏览器开发者工具,尤其是这些面板:

  • Elements
  • Console
  • Sources
  • Network

Network 面板

这是爬虫分析最常用的地方之一。

你可以观察:

  • 页面加载时发了哪些请求
  • 请求方法是什么
  • 请求头有哪些
  • 参数是什么
  • 返回内容是 HTML 还是 JSON

Sources 面板

这里常用于查看前端脚本文件和调试逻辑。

Console 面板

适合做一些简单变量观察和表达式验证。

动态渲染页面该怎么判断

一个简单思路是:

  1. 浏览器里看页面内容很多
  2. 查看页面原始 HTML 却很空
  3. 打开 Network 面板发现后续有接口请求

这通常说明:

  • 页面内容不是直接写在 HTML 中
  • 而是由 JavaScript 后续加载出来的

这时真正该研究的,往往不是页面 HTML,而是对应的数据接口。

参数动态生成该怎么分析

有些请求会带:

  • 时间戳
  • 签名
  • token
  • 加密串

这时正确思路通常是:

  1. 先观察这个参数在请求里长什么样
  2. 再去 Sources 或前端脚本中找它的生成位置
  3. 判断它是固定值、简单拼接,还是脚本计算结果

注意,这里的重点是“分析和理解逻辑”,而不是用盲目试错代替分析。

断点调试的意义

断点的价值在于:

  • 让你看到某个参数是在什么时机、通过什么逻辑得到的

这比你肉眼硬猜脚本流程有效得多。

所以当页面 JS 逻辑比较复杂时,断点调试往往比纯阅读代码更高效。

浏览器自动化工具的定位

如果页面严重依赖浏览器环境,单纯请求 HTML 拿不到有效数据,这时才会考虑浏览器自动化工具。

例如:

  • Selenium
  • Playwright

它们的价值更偏向于:

  • 模拟真实浏览器环境
  • 让页面完整渲染
  • 辅助分析前端行为

但它们通常更重、速度更慢、成本更高。

所以正常思路应该是:

  • 能直接抓接口,就不要上浏览器自动化
  • 必须渲染页面时,再考虑自动化工具

验证码怎么理解

验证码本质上不是“页面花样”,而是一种明确的人机区分机制。

它出现时,通常表示网站已经在主动限制自动化访问。

所以遇到验证码时,你首先应该意识到的是:

  • 目标站点对自动采集有明确限制

而不是把它仅仅当成“技术障碍”。

加密与混淆为什么会出现

有些前端代码会做:

  • 混淆
  • 压缩
  • 参数加密

这些通常是为了:

  • 降低直接分析难度
  • 保护前端逻辑
  • 增加接口调用门槛

你现在不需要把加密算法都学透,但至少要知道:

  • 有些参数不是明文出现
  • 有些参数是脚本执行后生成的

一个正确的排查顺序

当你抓不到数据时,不要一上来就怀疑所有东西。更合理的顺序是:

  1. 看响应状态码
  2. 看响应内容是不是目标内容
  3. 看请求头是否合理
  4. 看是否需要 Cookie 或登录态
  5. 看数据是不是动态加载
  6. 看参数是不是脚本生成

这比盲目改代码有效得多。

常见错误

1. 页面抓不到就只怀疑 XPath

其实很可能根本不是解析问题,而是:

  • 请求没拿到真实内容
  • 页面是动态渲染的
  • 返回的是登录页或验证页

2. 一看到 JS 就慌

你不需要先把整份前端代码全部看懂,先定位:

  • 请求在哪里发
  • 参数在哪里生成

比从头硬啃整个脚本有效得多。

3. 一遇到限制就只想着“怎么绕过”

更成熟的思路应该是:

  • 先确认是否有官方接口
  • 先确认是否有公开数据获取方式
  • 先确认请求频率和目标是否合理

4. 把浏览器自动化当成万能方案

自动化工具很强,但也更重,不应该替代基础分析。

练习题

练习 1

打开一个普通网页,使用浏览器 Network 面板观察它加载时发了哪些请求。

练习 2

找出一个请求里的 User-AgentRefererCookie 字段,并解释它们分别可能在做什么。

练习 3

找一个页面,比较“页面源码”和“最终渲染后的页面内容”是否一致。

练习 4

自己总结:当爬虫抓不到目标数据时,应该先排查哪些层面。

练习 5

思考:为什么网站会设置验证码、频率限制和签名参数?

本节小结

这一节最重要的,不是让你学会某种激进的绕限制方式,而是让你建立对真实网页采集环境的判断力。

你最重要的收获应该是:

  • 知道常见反爬机制有哪些
  • 知道请求头、Cookie 和登录态为什么重要
  • 理解 JavaScript 动态加载和参数生成的常见位置
  • 会用浏览器开发者工具做基础分析
  • 建立合规、理性的排查思路

只要这层判断力建立起来,后面你面对真实网站时,就不会只会机械发请求,而会先分析问题到底出在哪一层。

Built with VitePress.