You need to enable JavaScript to run this app. Python requests.get响应与Burp、浏览器结果差异排查
优惠活动
大模型
产品
解决方案
定价
更多

Python requests.get响应与Burp、浏览器结果差异排查

常见问题排查与解决

首先排查代码本身的低级笔误

你在直连版本的代码中存在一处非常容易被忽略的错误:

  • 代码前序定义了请求头字典变量headers(复数形式),但在调用requests.get()时,传参写的是header(单数形式),这会导致所有自定义的请求头完全不会被携带到请求中。
  • 这个笔误的直接影响是:服务端收到的请求会使用requests默认的特征(默认User-Agent为python-requests/版本号,无Referer、X-Requested-With等标识),会直接被前置网关/WAF识别为非浏览器的爬虫流量,触发那个带JS种Cookie的拦截页面。
  • 你通过Burp代理运行的代码片段中,传参写的是headers=headers(和定义的变量名一致),所有自定义请求头正常生效,因此能拿到正确响应——这也是为啥同样的目标地址,走Burp就正常、直连就异常的核心原因。

关于你观察到的行为差异的原理

你收到的拦截页面是非常典型的前置WAF/反向代理的反爬校验逻辑:

  • 当WAF识别到请求特征不符合浏览器行为时,不会直接拦截,而是返回一段JS脚本,要求浏览器执行后写入指定的临时校验Cookie,再重新发起请求,只有带了正确临时Cookie的请求才会被放行,返回真正的业务JSON数据。
  • Burp能直接拿到正常响应,本质是因为它默认会自动维护所有经过代理请求的Cookie缓存,遇到WAF下发的Cookie会自动存储,后续请求自动携带;且Burp转发请求时会保留你自定义的全部请求头特征,WAF会直接判定为合法流量,不会触发校验流程。
  • 你观察到的“直连触发重定向、走Burp不触发重定向”的差异,也是上述逻辑的直接结果:直连时因为请求头缺失,被WAF判定为可疑流量,触发了整套校验流程;走Burp时请求特征合规、Cookie完整,WAF直接放行,自然不会触发重定向。

对应的解决步骤

  • 第一时间修正传参的笔误,确保自定义请求头能正常传递,不要因为变量名拼写错误导致请求头丢失。
  • 优先使用requests.Session()会话对象替代独立的get请求,它会自动跨请求维护Cookie,模拟浏览器的行为逻辑:
import requests

url = "internal_url"
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:78.0) Gecko/20100101 Firefox/78.0",
    "Accept": "*/*",
    "Accept-Language": "en-GB,en;q=0.5",
    "X-Requested-With": "XMLHttpRequest",
    "Referer": "internal url"
}

# 初始化会话,自动管理Cookie
session = requests.Session()
session.headers.update(headers)

# 第一次请求会拿到WAF的校验页,会话会自动保存响应中下发的Cookie
session.get(url, verify=False)
# 第二次请求自动携带校验Cookie,即可拿到正常的业务响应
resp = session.get(url, verify=False)
print(resp.text)
  • 移除冗余的自定义请求头:
    • 不要手动设置Connection: close,该头会强制每次请求断开TCP连接,是非常明显的爬虫特征,容易被WAF拦截。
    • 不需要手动设置Accept-Encoding: gzip, deflate,requests默认会携带该头并自动完成解压,手动设置反而可能引发解压异常。
  • 如果使用Session请求后依然拿到带JS的校验页面,说明WAF的校验Cookie是完全通过前端JS逻辑写入的,requests没有内置JS执行引擎无法自动获取Cookie,这时候可以从Burp的抓包记录中找到浏览器/正常请求携带的校验Cookie值,手动通过session.cookies.update({"校验Cookie名": "Cookie值"})写入会话,即可完成访问。
  • 如果配置公司代理后依然无法正常访问,检查代理地址的书写格式:必须给代理地址加上明确的协议前缀,比如proxies = {"http": "http://内网代理IP:端口", "https": "http://内网代理IP:端口"},很多人写代理时漏了http://前缀,导致requests把代理地址当目标主机解析,根本无法通过公司网络通道正常出网。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.25 13:45:05