You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python requests请求Amazon返回503但bash POST返回200原因排查

核心差异原因

你遇到的503拦截,本质是Python requests发出的请求和bash工具发出的请求存在多个HTTP明文头之外的底层特征差异,亚马逊反爬系统会基于这些特征识别爬虫流量,核心差异点如下:

  • TLS指纹(JA3/JA4)差异:这是触发拦截的最核心原因。requests库依赖urllib3和系统OpenSSL栈完成TLS握手,握手阶段上报的支持TLS版本列表、密码套件排序、TLS扩展字段的顺序和值,和bash端的HTTP客户端、真实浏览器存在明显区别,这些特征会生成唯一的JA3标识。requests默认的JA3指纹属于公开的爬虫库特征,亚马逊WAF在TLS握手阶段就可以直接标记拦截,根本不会走到后续HTTP请求解析环节。
  • HTTP协议版本差异:从你贴的Python调试日志可以看到,requests默认仅用HTTP/1.1协议发请求,而你用的bash HTTP客户端默认优先协商HTTP/2协议。当前亚马逊搜索接口对HTTP/1.1请求的反爬校验强度远高于HTTP/2请求,仅支持HTTP/1.1本身就是高风险爬虫特征。
  • 请求头排序差异:HTTP协议规范没有强制要求请求头的排列顺序,但反爬系统会统计正常客户端的头顺序特征做校验。requests会按照自身内置逻辑自动排列所有请求头(包括自动追加的默认头和你手动传入的头),和bash工具、真实浏览器的头顺序存在明显差异,比如你Python请求里Content-Length头被放在Content-Type头之后,不符合常规客户端的排序逻辑。
  • ALPN协商差异:requests在TLS握手的ALPN(应用层协议协商)阶段仅声明支持HTTP/1.1,而常规浏览器、CLI HTTP工具的ALPN列表会同时包含h2(HTTP/2)、http/1.1,优先匹配HTTP/2,这个特征也是TLS阶段的核心识别点。
  • 空请求体的发送逻辑差异:你发的是无body的POST请求,requests发送空body时的TCP包拆分边界、分段发送逻辑和bash客户端存在细微区别,这类底层传输特征也会被反爬系统采集识别。
修复方案
  • 替换原生requests库:改用curl_cffi库发起请求,该库可以直接模拟Chrome、curl等客户端的TLS指纹,从底层绕过JA3检测,是目前解决这类WAF拦截成本最低的方案;如果要保留类requests的调用习惯,也可以用开启HTTP/2支持的httpx库,配合TLS指纹修改配置使用。
  • 替换伪造的User-Agent:你当前传入的User-Agent: Chrome是非常明显的爬虫伪造特征,正常浏览器的UA会包含完整的版本号、运行系统标识等信息。
  • 手动固定请求头顺序:如果继续使用requests,可以通过自定义HTTPAdapter的方式手动指定请求头排列顺序,匹配真实浏览器的头排序逻辑。
  • 携带会话Cookie:从bash请求的响应可以看到,接口首次访问时会种下多个会话Cookie,后续请求必须携带这些Cookie,否则也会触发拦截。

内容的提问来源于stack exchange,提问作者Jupri

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 22:24:23