lesson-02

⏱ 预计阅读 7 分钟 更新于 2026/5/13
💡 进群学习加 wx: agentupdate
(申请发送: agentupdate)

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 课后问题

  1. 为什么将 User-Agent 设置为 Chrome 的 UA 字符串还是被检测到?
  2. JA3 指纹是什么?如何让 Python 程序生成与 Chrome 相同的 JA3?
  3. 云服务器 IP 和住宅 IP 在反爬检测中的本质区别是什么?