AWS Lambda(Python)运行requests.get返回403 Postman请求正常如何解决?
问题原因
Cloudflare的反爬虫机制会校验请求的多维度特征,相同请求Postman可正常返回、AWS Lambda环境触发403的常见原因如下:
- 请求头字段不全:Postman会自动补全
User-Agent、Accept、Accept-Encoding等默认请求头,你在Python代码中传入的headers通常缺失这些字段,Cloudflare识别到异常请求头特征直接拦截 - 出口IP被标记:AWS Lambda的默认出口IP属于AWS公共IP段,大量自动化恶意请求都会使用该类IP段发起,很容易被Cloudflare提前标记为风险IP,触发拦截规则
- TLS指纹不匹配:Python requests库默认的TLS握手指纹和正常浏览器、Postman的指纹特征存在差异,Cloudflare的TLS指纹校验会直接识别出自动化请求,返回403
解决方案
1. 补全完整请求头
将Postman中该请求的所有请求头完整复制到Python代码的headers参数中,重点补全User-Agent字段,参考示例:
headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8", "Accept-Encoding": "gzip, deflate, br", "Connection": "keep-alive" } r_payload = requests.get(url=url, headers=headers)
2. 更换适配Cloudflare的请求库
使用专门适配Cloudflare拦截规则的cloudscraper库替代原生requests,你需要提前将cloudscraper及其依赖打包为Lambda层,修改代码如下即可:
import cloudscraper scraper = cloudscraper.create_scraper() r_payload = scraper.get(url=url, headers=headers)
3. 解决IP拦截问题
如果上述两种方案都无效,说明Lambda当前的出口IP已经被Cloudflare拉黑,可通过以下方式处理:
- 为Lambda配置VPC + NAT网关,给NAT网关绑定专属弹性公网IP,保证请求出口为未被标记的静态IP
- 引入第三方代理池,将Lambda的请求通过代理转发到目标站点,避免使用AWS原生公共IP段发起请求
内容的提问来源于stack exchange,提问作者Zano
相关产品推荐
相关产品推荐

