lesson-02
2.1 IP 封锁:最古老也最有效的防线
IP 封锁是反爬虫的第一道也是最普遍的防线。网站通过识别请求来源 IP 并将其列入黑名单来阻止自动化访问。
IP 封锁的几种形态
| 类型 | 触发条件 | 表现 |
|---|---|---|
| 单 IP 封锁 | 单一 IP 请求频率过高 | 返回 403/429 |
| ASN 封锁 | 封锁整个 IP 段(如云服务商 IP 段) | 整个数据中心 IP 无法访问 |
| 地区封锁 | 封锁特定国家/地区 | GeoIP 匹配后拒绝 |
| 住宅 vs 数据中心 | 检测 IP 类型 | 数据中心 IP 被直接拒绝 |
为什么你的服务器 IP 特别容易被封?
AWS、GCP、Aliyun 等云服务商的 IP 段是公开的,网站只需一行规则即可屏蔽所有云服务器:if ip in DATACENTER_IP_RANGES: block()
速率限制(Rate Limiting)
sequenceDiagram
participant Bot as 爬虫
participant WAF as WAF/CDN
participant Server as 源服务器
Bot->>WAF: GET /page (第1次)
WAF->>Server: 转发请求
Server-->>Bot: 200 OK
Bot->>WAF: GET /page (第50次/秒)
WAF->>WAF: 触发速率阈值
WAF-->>Bot: 429 Too Many Requests
Note over WAF: 滑动窗口计数器
或令牌桶算法
Bot->>WAF: GET /page (封锁期内)
WAF-->>Bot: 403 Forbidden (IP 被临时封禁)2.2 TLS 指纹识别:让你暴露的"握手仪式"
这是许多开发者不知道的高级反爬手段。TLS(HTTPS)握手本身就会泄露你是机器还是真实浏览器。
JA3 指纹
JA3 是一种对 TLS ClientHello 消息进行哈希的指纹算法,可以唯一标识一个 TLS 客户端:
JA3 = MD5(SSLVersion, Ciphers, Extensions, EllipticCurves, EllipticCurvePointFormats)
示例对比:
| 客户端 | JA3 哈希 |
|---|---|
| Chrome 120 (Windows) | cd08e31494f9531f560d64c695473da9 |
| Python requests | 3b5074b1b5d032e5620f69f9f700ff0e |
| curl | 7dc465ee29f9f4cde9001c75d09b1e65 |
Python 的 requests 库和 curl 都有固定的 JA3 签名,Cloudflare Bot Management 可在握手阶段就识别并拦截。
如何检测你的 TLS 指纹
# 检查你的 curl 指纹(访问专门的指纹检测服务)
curl https://tls.peet.ws/api/all | python3 -m json.tool | grep ja3
# 检查浏览器指纹
# 访问 https://browserleaks.com/tls 查看你的浏览器指纹
2.3 HTTP 头部分析
现代反爬系统会精密分析每一个 HTTP 请求头:
# ❌ 典型爬虫请求头(容易被识别)
headers = {
'User-Agent': 'python-requests/2.31.0' # 直接暴露工具
}
# ✅ 模拟真实 Chrome 浏览器的请求头
headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8',
'Accept-Language': 'en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7',
'Accept-Encoding': 'gzip, deflate, br',
'Connection': 'keep-alive',
'Upgrade-Insecure-Requests': '1',
'Sec-Fetch-Dest': 'document',
'Sec-Fetch-Mode': 'navigate',
'Sec-Fetch-Site': 'none',
'Sec-Fetch-User': '?1',
'sec-ch-ua': '"Not_A Brand";v="8", "Chromium";v="120", "Google Chrome";v="120"',
'sec-ch-ua-mobile': '?0',
'sec-ch-ua-platform': '"macOS"',
}
关键检测点:真实浏览器的
Sec-Fetch-*和sec-ch-ua头有严格的逻辑关系。
如果你伪造了 UA 但缺少这些安全头,或者头部顺序不符合 Chrome 规范,立即被识别。
2.4 课后问题
- 为什么将 User-Agent 设置为 Chrome 的 UA 字符串还是被检测到?
- JA3 指纹是什么?如何让 Python 程序生成与 Chrome 相同的 JA3?
- 云服务器 IP 和住宅 IP 在反爬检测中的本质区别是什么?