requests默认允许最多30次重定向,易被反爬站点利用构造无限跳转循环而触发TooManyRedirects异常;应设allow_redirects=False手动控制,检查301/302响应及Location头,并用URL去重主动截断循环。

requests.get() 默认不处理重定向循环,得手动截断
requests 库默认允许最多 30 次重定向(max_redirects=30),但很多反爬站点会故意构造 Location: /same-path?x=1 → /same-path?x=2 → … 这类无意义跳转,触发 TooManyRedirects 异常,而非静默失败。更隐蔽的是,有些页面返回 302 后 Location 指向自身或登录页,形成逻辑循环,而 requests 仍会硬扛到上限才报错。
实操建议:
- 显式控制重定向行为:
requests.get(url, allow_redirects=False)先拿到原始响应,检查response.status_code in [301, 302, 307]和response.headers.get("Location") - 对
Location做简单去重:用set()缓存已访问的 URL 片段(如域名 + 路径哈希),超过 3 次相同路径就主动终止 - 避免依赖
Session自动跳转——它会默默吞掉中间态,掩盖真实跳转链,调试时反而更难定位问题
403 不是权限问题,是“你不像人”的明确拒绝
服务器返回 403,基本等于在说:“我认出你不是浏览器”。requests 默认发包太干净:User-Agent 是 python-requests/2.xx,没 Accept-Language,没 Sec-Ch-Ua,Referer 为空——这比穿睡衣进银行还扎眼。
关键动作不是堆参数,而是对齐真实浏览器请求特征:
立即学习“Python免费学习笔记(深入)”;
- 必须带全基础头:
User-Agent(选 Chrome 最新 Win 版)、Accept、Accept-Language、Referer(设成目标站首页,别填 google) - Cloudflare/Akamai 类站点要额外补
Sec-Ch-Ua、Sec-Ch-Ua-Mobile、Sec-Fetch-*字段,缺一个就卡在挑战页 -
fake_useragent库慎用:默认远程拉取已失效,必须加use_cache_server=False并指定本地 fallback,且返回值要.strip() - 别用固定 UA 字符串——高频请求下,单一 UA 本身就会成为指纹,被服务端标记为 bot
代理配置错误时,403 往往是假象
很多情况下,你以为用了代理,其实流量还是从本机 IP 出去。结果服务器看到的是你的真实出口 IP(可能已被封),却误判为“代理异常”,直接返回 403。
验证和修复步骤:
- 先用
requests.get("https://httpbin.org/ip", proxies=proxies)确认返回 IP 真是你配的代理,不是本机 - HTTPS 目标必须用支持 TLS 的代理;若 proxy URL 写成
http://user:pass@host:port访问 HTTPS 站,requests 会静默降级走 HTTP,握手失败后服务器记为异常行为 - 商用代理认证格式必须严格为
http://user:pass@host:port;漏掉user:pass@或误写https://前缀,requests 不报错但实际没走代理 - 免费代理大多已被标记,高匿 ≠ 可用;有些出口 IP 本身就在 Cloudflare 黑名单里,一发请求就 403
什么时候该放弃 requests 改用 Playwright?
当你已做完以下全部操作,仍持续 403 或返回空白页 + 重定向到验证页,说明目标站启用了高级防护(如 Cloudflare JS 挑战、Akamai Bot Manager)——这不是 header 能绕过的。
Playwright 比 Selenium 更可靠,因为:
- 默认禁用
navigator.webdriver,自动注入真实plugins、mimeTypes等浏览器指纹字段 - 能自动等待 JS 执行完成,处理动态插入的
Sec-*头和加密 token - 支持 context-level user agent 设置,且可模拟真实设备参数(如
deviceScaleFactor、isMobile) - 遇到 Cloudflare 挑战时,Playwright 可配合
playwright-extra+stealth插件绕过,成功率远高于裸 Selenium
真正棘手的不是 403 本身,而是它背后混杂了重定向策略、JS 挑战、IP 信誉、浏览器指纹多个维度的校验——单点修补大概率失效,必须按链路逐层验证。


















