单元 4 · 反爬与动态页面 — 预计 60 分钟
反爬对抗
📍 本课路径
- 理解常见反爬机制
- 学会 UA 与请求头伪装
- 掌握延时与频率控制
- 了解代理与 IP 池的原理
🎯 学习节奏:① 看目标 → ② 先思考再动手 → ③ 在运行器写代码 → ④ 失败时按提示重试 → ⑤ 通过后看思路
网站不希望被爬,于是设关卡。反爬不是攻防秀,而是在合规前提下让请求像正常用户。
一、常见反爬机制
| 机制 | 表现 | 应对 |
|---|---|---|
| UA 检测 | 没 UA 直接 403 | 伪装浏览器 UA |
| 频率限制 | 太快返回 429 | time.sleep 控频 |
| 登录校验 | 需 Cookie 才给数据 | Session 带登录态 |
| 验证码 | 行为异常弹验证 | 降速模拟真人 |
二、随机 UA
固定一个 UA 容易被识别。准备一组真实 UA,每次随机挑:
import random
uas = [
"Mozilla/5.0 (Windows NT 10.0; Win64; x64)",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)",
"Mozilla/5.0 (X11; Linux x86_64)",
]
# TODO: 用 random.choice(uas) 随机选一个 UA 并打印
ua = random.choice(uas)
print("本次 UA:", ua)
print("放进 headers={'User-Agent': ua} 即可")三、随机延时
固定延时也像机器。用随机区间更像真人:
import random
# TODO: 用列表推导式生成 3 个随机延时(保留 2 位小数)
delays = [round(random.uniform(1, 2), 2) for _ in range(3)]
print("本轮延时(秒):", delays)
# TODO: 遍历打印等待信息
for d in delays:
print(f"等待 {d}s ...")四、代理原理(进阶)
proxies = {"http": "http://1.2.3.4:8080"}
resp = requests.get(url, proxies=proxies, timeout=5)
代理来源务必合规,免费代理常不稳定且有安全风险。
五、小结
- 反爬四板斧:伪装 UA、带请求头、控频、必要时代理
- 随机 UA + 随机延时比固定更安全
- 重试配合退避策略,别死循环