403错误不等于ip被封,但持续403且同一ip多次失败大概率已被临时拉黑;需用curl实测httpbin.org/ip确认出口ip,并对目标站发极简请求验证响应头;requests代理未生效、fake_useragent初始化失败、waf启用客户端挑战时需换selenium/playwright。

403 错误本身不等于 IP 被封,但持续 403 + 同一 IP 多次失败,大概率说明你的 IP 已进入目标站的临时黑名单——这时候光改 User-Agent 没用,得先确认是不是真被封了,再决定是换 IP 还是调策略。
怎么快速判断 IP 是否已被封禁?
别猜,用最干净的请求实测:
- 新开一个终端,执行
curl -x "http://your-proxy:port" https://httpbin.org/ip(如有代理)或直接curl https://httpbin.org/ip(直连),看返回的 IP 是不是你本机/代理出口 IP - 再对目标站点发一次极简请求:
curl -I -H "User-Agent: Mozilla/5.0" https://target.com,观察响应头里是否有HTTP/1.1 403 Forbidden且无重定向、无 Cookie 设置 - 关键信号:如果同一 IP 下,所有路径(首页、API、静态资源)全部 403,且
curl和requests表现一致,基本可断定 IP 被标记
requests 里代理没生效却以为“用了代理”
这是最隐蔽的坑——你以为加了 proxies 就安全了,其实请求根本没走过去:
- 检查代理 URL 格式:必须是
http://user:pass@host:port(商用代理),https://前缀或漏掉认证会导致 requests 静默降级,甚至走本机出口 - HTTPS 目标站必须配支持 TLS 的代理;若代理只支持 HTTP,requests 会尝试 HTTP CONNECT,握手失败后服务器可能记为异常行为并返回 403
- 务必验证代理是否真实生效:
requests.get("https://httpbin.org/ip", proxies=proxies)返回的origin必须是你期望的代理 IP,而不是你本地公网 IP
fake_useragent 库默认配置导致启动即崩
很多人 pip install 后直接写 ua = UserAgent(); headers = {"User-Agent": ua.random},结果第一次运行就抛 fake_useragent.errors.FakeUserAgentError:
- 原因:新版
fake_useragent默认依赖已失效的外部 API(https://www.php.cn/link/),首次初始化必失败 - 修复方式:初始化时强制关闭远程拉取 ——
UserAgent(use_cache_server=False, path="ua.json"),并确保ua.json文件存在或提供 fallback 字符串 - 额外注意:
ua.random可能带换行或空格,必须.strip()后再塞进 headers,否则某些 WAF 会因格式异常直接拒收
什么时候该放弃 requests 改用 Selenium/Playwright?
当你已经做完以下全部动作,仍稳定返回 403 或跳转到 Cloudflare 验证页,说明目标站启用了客户端挑战防护,纯 HTTP 请求无法绕过:
- Header 完整复制自浏览器 Network 面板(含
Sec-Ch-Ua、Sec-Ch-Ua-Mobile等字段) - Referer 合理(比如先 GET 首页再 GET 列表页)
- 代理 IP 经
httpbin.org/ip验证确实生效 - 请求间隔随机(如
time.sleep(random.uniform(1.2, 3.8))),非固定秒数
这种情况下,requests 再怎么伪装也只是“看起来像人”,而 Selenium 或 Playwright 是真正在跑浏览器环境——它能执行 JS、生成指纹、通过 navigator 校验,这才是突破高级 WAF 的实际路径。别在 header 上死磕了。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











