Python requests调用Cloudflare防护的网站API返回403异常问题咨询
排查方向与解决方案
1. 优先校验TLS指纹(JA3)匹配
Cloudflare反爬机制会识别客户端TLS握手阶段的JA3指纹特征,原生requests底层依赖的urllib3默认的加密套件顺序、TLS扩展配置和正常浏览器/客户端差异明显,即使请求头完全复刻也会被识别拦截。另一台同IP设备可以正常请求,大概率是该设备的Python依赖版本的默认JA3特征未被Cloudflare标记拦截:
- 直接使用适配Cloudflare校验的
cloudscraper库替换原生requests,调用逻辑和requests完全兼容:
# 安装命令:pip install cloudscraper import cloudscraper # 选择和你使用的UA匹配的浏览器类型 scraper = cloudscraper.create_scraper(browser='firefox') headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:45.0) Gecko/20100101 Firefox/45.0'} # 注意参数分隔符要使用&而非第二个?,示例地址为修正后的格式 r = scraper.get("https://webapi.somesite.com/req?option1=XXX&option2=YYY", headers=headers) print(r.status_code)
- 如果要保留原生requests调用,将另一台正常设备的
requests、urllib3、pyopenssl依赖版本完全同步到当前设备,版本一致的情况下JA3指纹会保持相同。
2. 检查请求参数与Cookie配置
- 你提供的示例请求地址中第二个参数拼接错误使用了
?,正常多参数分隔需使用&,先确认实际请求时的地址拼接是否符合规范 - 浏览器访问API时会自动携带Cloudflare下发的
cf_clearanceCookie,你可以从浏览器开发者工具的网络请求中复制有效cf_clearance值,添加到请求头的Cookie字段中即可通过校验,注意Cookie失效后需要重新获取:
headers = { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:45.0) Gecko/20100101 Firefox/45.0', 'Cookie': 'cf_clearance=从浏览器获取的有效cf_clearance值;其他必要的业务Cookie' }
3. 排查设备层面网络配置差异
- 确认当前设备的系统代理、防火墙、VPN规则和另一台正常设备完全一致,排除本地网络工具篡改请求特征的情况
- 可以在当前设备上直接用curl命令发起带相同请求头的请求测试,如果curl可以拿到200响应但Python requests不行,即可确定是Python环境的TLS指纹问题。
内容的提问来源于stack exchange,提问作者Scarface
相关产品推荐
相关产品推荐

