Python爬虫遇到403:先分清原因,再决定要不要用动态住宅代理
更新:2026年9月8日
Python数据采集遇到403时,最差的处理方式是立刻无限换IP。一个稳定的采集系统,通常先解决权限、频率、缓存、会话和重试,最后才决定是否需要动态住宅代理。
403先分成4类原因
| 类型 | 典型原因 | 优先动作 |
|---|---|---|
| 访问权限 | 站点不允许自动访问、需认证 | 查看API、robots与服务条款 |
| 请求行为 | 频率过高、并发过大 | 限速、队列、指数退避 |
| 会话问题 | Cookie / Session不完整 | 复用会话,减少无意义重建 |
| 网络出口 | 共享出口质量差、地域测试需求 | 在合规前提下测试代理 |
先把基础请求写稳
import time
import requests
session = requests.Session()
session.headers.update({"User-Agent": "Mozilla/5.0"})
url = "https://example.com/public-data"
for attempt in range(3):
response = session.get(url, timeout=20)
if response.status_code == 200:
print(response.text[:200])
break
time.sleep(2 ** attempt)
这段代码解决不了所有403,但它体现了三个原则:复用Session、设置超时、失败后退避。比“失败就立即重试100次”更可控。
代理应该放在系统的哪一层
代理只是网络出口层。更完整的采集结构应该是:
- 任务队列控制抓取顺序;
- 并发上限控制负载;
- 缓存和去重减少重复下载;
- 重试策略避免失败风暴;
- 最后才由代理池处理地域测试或出口分散。
什么时候动态住宅代理才真正划算
当你有权采集目标数据,并且已经优先使用API、限速和缓存,但仍需要大量不同地区的公开数据请求时,动态住宅代理才更匹配。按流量计费时,应避免无意义下载图片、视频和字体。
不要比较“$/GB”,要比较成功结果成本
更实用的KPI:每1000个成功请求成本 =(代理流量费用 + 重试带来的额外流量 + 计算成本)÷ 成功请求数 × 1000。
一个标价更低但失败率高、需要大量重试的套餐,最终可能更贵。
上线前检查表
- 目标数据是否允许采集;
- 是否有官方API或公开JSON接口;
- 是否设置合理限速;
- 是否缓存重复资源;
- 失败是否指数退避;
- 代理是否只用于确实需要的请求。
选购建议:拿同一批公开URL做小规模测试,记录成功率、平均流量和延迟,再决定供应商,而不是只看IP池数字。
想进一步比较动态住宅套餐,可以看Webshare动态住宅代理选型方法。
对比适合数据采集的动态代理 →