403通常因ip被临时封禁或请求头异常导致,需先用curl验证出口ip与目标站响应;若ip一致且均返回403,则大概率ip被拉黑,此时换ip或降频才是关键。

requests发请求直接返回403,先确认是不是IP被拉黑
403不等于服务器拒绝服务,而是它认出你是异常流量——但具体是“临时封IP”还是“头太干净”,得先区分。最快速判断方式:用curl绕过Python环境直连验证。
- 执行
curl -I https://httpbin.org/ip,记下返回的originIP,这是你当前出口IP - 再执行
curl -I -H "User-Agent: Mozilla/5.0" https://目标站.com,看是否也返回HTTP/1.1 403 Forbidden且无重定向、无Set-Cookie - 如果两个请求都403,且IP一致,基本可断定该IP已被目标站临时加入黑名单——这时候改
User-Agent没用,得换出口IP或降频
代理设了却还是本机IP出请求?检查这三处静默失效点
很多人加了proxies参数就以为万事大吉,结果请求根本没走代理,流量全从本机IP发出,反而加速被封。
Python 3.14.2是Python编程语言在2025年12月5日发布的稳定版本,属于3.14系列的第二个维护更新。该版本包含了18项修复,重点解决了多进程、数据类及正则表达式等模块的回归问题,并修复了CVE-2025-12084等安全漏洞。此版本标志着自由线程模式(移除GIL)正式获得官方支持,是Python发展的重要里程碑。
-
proxies字典里的URL必须严格为http://user:pass@host:port(商用代理),漏掉user:pass@或误写成https://前缀,requests会静默降级,走本机出口 - 访问HTTPS目标站时,代理必须支持TLS;若代理只支持HTTP,
requests尝试CONNECT握手失败,服务器可能记录为异常行为并返回403 - 务必验证代理是否真实生效:
requests.get("https://httpbin.org/ip", proxies=proxies)返回的origin必须是你期望的代理IP,而不是你本地公网IP
Header只填User-Agent远远不够,缺这些字段照样403
现代WAF(如Cloudflare、Akamai)不再单看User-Agent,而是校验整套请求头是否“像人”。空Referer、缺失Accept-Language、没有Sec-Ch-Ua等字段,都会触发拦截。
- 至少补全三个基础头:
User-Agent(建议用Chrome最新Win版)、Referer(设为目标站首页或Google搜索页)、Accept-Language(如zh-CN,zh;q=0.9) - 部分站点强校验
Sec-Fetch-Site、Sec-Fetch-Mode、Sec-Fetch-Dest,可从浏览器Network面板复制真实请求后,用curlconverter.com转成Python代码再精简 -
User-Agent字符串末尾可能带换行或空格,务必用.strip()清理后再塞进headers,否则某些WAF会因格式异常直接拒收
Session复用和随机延时不是可选项,是绕过连接指纹检测的刚需
默认requests.get()每次新建TCP连接,没有TLS会话复用、无ALPN协商、SNI顺序固定——这些“连接指纹”会被WAF识别为非浏览器行为,哪怕头全对,也容易被标记为可疑。
- 用
requests.Session()贯穿全程,自动复用连接、维持Cookie、保留TLS上下文 - 批量请求时加
time.sleep(random.uniform(1.2, 3.8)),避免固定间隔;连续5次无延迟访问,很多站会立刻403+IP记录 - 如果已做以上全部仍稳定403或跳转到Cloudflare验证页,说明目标站启用了JS挑战防护,此时
requests已无力应对,必须切换到Selenium或Playwright
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










