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

Python requests如何获取响应头中缺失的location字段?

核心原因

你拿不到location响应头的本质原因是:location头仅会出现在301/302/303/307这类重定向状态码的响应中,你当前用Python发请求拿到的是200状态码的普通页面响应,自然不会携带该字段。
你提到的Access-Control-Expose-Headers是浏览器端跨域请求的相关配置,仅限制前端JavaScript读取响应头的权限,Python作为后端发请求完全不受该规则约束,这个方案对你的场景无效,不需要考虑。

排查&解决步骤
  • 第一步:先校验响应状态码,确认服务器是否返回了重定向响应
    requests中直接打印print(response.status_code),如果返回值不是30x开头,说明你的请求参数和浏览器请求不一致,服务器没有触发重定向逻辑。
  • 第二步:完全模拟浏览器请求头
    把浏览器开发者工具中该请求的所有请求头(包括User-Agent、Cookie、Referer、Accept等)完整复制到你的Python请求中,很多网站会校验请求特征,非浏览器特征的请求会直接返回200状态的普通页面,不走重定向逻辑。
  • 第三步:禁用自动重定向(你requests已经做了,但urllib默认没做)
    默认的urllib.urlopen会自动跟随重定向,你拿到的是跳转后页面的响应头,自然没有location字段,需要手动配置禁用自动重定向。
正确代码示例

requests版本

import requests

# 完整复制浏览器中该请求的所有Headers
HEADERS = {
    "User-Agent": "你浏览器的UA字符串",
    "Cookie": "你浏览器中该网站的Cookie字符串",
    "Referer": "对应请求的Referer",
    # 把其他浏览器里的Header也补全
}

response = requests.post(
    'https://petdogs.net/search/?input=abcdefgh', 
    headers=HEADERS, 
    allow_redirects=False
)
# 先确认状态码是30x
print(response.status_code)
# 两种方式都可以读取,requests.headers大小写不敏感
print(response.headers.get("Location"))
print(response.headers.get("location"))

urllib版本(禁用自动重定向)

import urllib.request

# 同样补全所有浏览器请求头
headers = {
    "User-Agent": "你浏览器的UA字符串",
    "Cookie": "你浏览器中该网站的Cookie字符串",
    # 补全其他Header
}

# 自定义opener,禁用自动重定向
class NoRedirectHandler(urllib.request.HTTPRedirectHandler):
    def redirect_request(self, req, fp, code, msg, headers, newurl):
        return None

opener = urllib.request.build_opener(NoRedirectHandler)
urllib.request.install_opener(opener)

req = urllib.request.Request('https://petdogs.net/search/?input=abcdefgh', headers=headers, method='POST')
response = urllib.request.urlopen(req)
print(response.getcode())
print(response.headers.get("Location"))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.13 15:54:03