反爬与反反爬技术总结
做爬虫的人,几乎都会接触“反爬”。
早期的网站反爬其实很简单,很多时候改个User-Agent就能继续抓数据。但这些年随着前端技术、风控系统以及 AI 的发展,现代网站的反爬已经越来越复杂,很多大型网站甚至已经把“反爬”做成了一套完整的风控体系。
本文从实际开发角度,总结一下常见的反爬机制,以及开发中常见的绕过思路。
一、反爬的核心是什么
很多人刚接触爬虫时,会觉得反爬就是“禁止程序访问网站”。
实际上并不是。
网站真正想做的是:
- 识别异常访问行为
- 防止数据被批量采集
- 降低恶意请求对服务器的压力
所以反爬的本质,其实是:
网站判断你是不是“正常用户”而反反爬,则是:
让程序尽量表现得像真人现代反爬越来越像风控系统,而不只是简单地拦截请求。
二、最基础的反爬:请求特征检测
最早期的反爬,基本都是围绕 HTTP 请求本身展开的。
1. User-Agent 检测
浏览器访问网站时,会携带:
User-Agent比如 Chrome:
Mozilla/5.0 Chrome/136.0而很多初学者直接用:
requests.get(url)请求头里会暴露:
python-requests网站很容易识别。
因此最基础的做法,就是伪装浏览器请求头:
headers={"User-Agent":"Mozilla/5.0 ..."}不过现在大部分网站已经不会只靠这个判断。
2. Cookie 与 Referer 校验
很多网站会检查:
- 请求是否携带 Cookie
- Session 是否连续
- 请求来源是否合法
例如图片防盗链、登录态验证,本质上都是这个思路。
如果请求:
- 没有 Cookie
- Referer 异常
- Session 不连续
就容易被识别。
因此很多爬虫都会使用:
requests.Session()维护会话状态。
三、限流与 IP 封禁
这是最常见的一类反爬。
真人访问网站时:
- 有阅读时间
- 有停顿
- 不会每秒几十次请求
但程序天然倾向于高频访问。
因此网站通常会:
- 限制请求频率
- 返回 429
- 临时封 IP
- 拉黑异常 IP 段
尤其很多网站会重点限制:
- 云服务器 IP
- 数据中心 IP
因为大量爬虫都部署在云服务器上。
常见绕过方式
1. 降低请求频率
例如:
time.sleep(random.uniform(1,3))通过随机等待,让行为看起来更自然。
2. 控制并发
使用:
- asyncio Semaphore
- 请求队列
- 限速器
避免瞬时请求过高。
3. 代理池
这是大规模爬虫最常见的方案。
包括:
- HTTP 代理
- SOCKS5
- 动态住宅 IP
本质上是:
让请求来源不断变化避免单 IP 被封。
四、动态渲染带来的变化
以前很多网站都是服务端渲染。
requests + BeautifulSoup基本就能完成大部分采集。
但现在大量网站使用:
- React
- Vue
- Next.js
页面数据往往是 JavaScript 动态生成的。
这时你会发现:
requests.get()拿到的 HTML 基本没内容。
五、浏览器自动化
为了解决 JS 渲染问题,后来开始大量使用浏览器自动化工具。
主流方案包括:
- Selenium
- Playwright
其中:
Playwright 官方文档
这几年越来越流行。
因为它本质上是真实浏览器:
- 页面会真正渲染
- JS 会执行
- Cookie 自动维护
- 行为更接近真人
所以很多复杂网站:
- requests 已经无法处理
- 必须使用浏览器自动化
六、现代重点:浏览器指纹
现在很多网站真正重点检测的,其实已经不是请求,而是:
浏览器环境网站会收集:
- 分辨率
- 时区
- 字体
- GPU 信息
- Canvas
- WebGL
- 浏览器属性
然后生成所谓的:
浏览器指纹即使换 IP,也可能被识别成同一个设备。
因此现代反爬已经从:
识别请求变成了:
识别设备七、自动化浏览器检测
很多网站会专门检测:
navigator.webdriver如果为 true,基本就说明:
- Selenium
- Playwright
- Headless 浏览器
除此之外,还会检测:
- Headless 特征
- 浏览器行为
- DevTools 痕迹
常见处理方式
例如:
使用 stealth 插件
隐藏自动化特征。
非 Headless 模式
headless=False更接近真实浏览器。
修改浏览器环境
包括:
- 分辨率
- 时区
- 字体
- 语言
核心思路都是:
尽量伪装成真实用户环境八、行为检测
这是近几年越来越常见的一类反爬。
网站开始关注:
你“像不像真人”例如会分析:
- 鼠标轨迹
- 页面停留时间
- 滚动行为
- 点击间隔
- 输入速度
真人访问网站时:
- 会停顿
- 会阅读
- 会滚动页面
- 行为随机
而程序通常:
- 点击极快
- 没有停顿
- 行为路径固定
所以很多高级爬虫会开始模拟:
- 鼠标移动
- 页面滚动
- 随机等待
本质上是在模拟真实用户行为。
九、接口加密与前端逆向
很多网站现在已经不会直接暴露真实接口。
请求里经常会出现:
- sign
- token
- timestamp
这些参数通常是前端 JS 动态生成的。
这时仅仅抓包已经不够了,还需要分析前端逻辑。
常见工具包括:
- 浏览器开发者工具
- Fiddler
- Charles
- mitmproxy
mitmproxy 官方网站
很多时候,真正困难的并不是“发送请求”,而是:
搞清楚参数怎么生成十、为什么现在反爬越来越难
因为现代网站已经不再单独依赖某一种检测方式。
通常会综合分析:
- IP
- 浏览器环境
- Cookie
- 访问频率
- 用户行为
- 设备特征
很多大型网站甚至已经接入完整风控系统。
例如:
Cloudflare 官方网站
本质上已经不是“防爬虫”,而是在做:
- 风险识别
- 异常流量检测
- 自动化行为分析
十一、总结
反爬和反反爬,本质上是一场持续对抗。
早期爬虫:
requests + BeautifulSoup基本就能解决问题。
但现在的网站:
- JS 动态渲染
- 浏览器指纹
- 行为分析
- 风控系统
已经让简单爬虫越来越难生存。
因此现代爬虫技术也逐渐发展成:
- 浏览器自动化
- 代理池
- 行为模拟
- 分布式采集
未来随着:
- Agent
- 自动化网页操作
- AI 数据采集
的发展,“网页自动化”会越来越像一种综合工程能力,而不只是简单写几个 requests。