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
相关产品推荐
相关产品推荐

