Python requests设置allow_redirects=True仍无法获取重定向URL怎么办
问题描述
尝试从基准URL获取对应重定向目标URL时,请求始终返回原始基准URL,无法获取跳转后的目标地址,相关实现代码如下:
url = apiurl.de/apiexample' servers = session.get(url, headers=headers).result().json()['results'] for server in servers: server_id = server['id'] invite_url = f'apiurl.com/api' user_agent = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.131 Safari/537.36' s = requests.Session() s.headers['User-Agent'] = user_agent r = s.get(invite_url, allow_redirects=True, timeout=10) print(f'[redirected url]: {r.url}')

可行解决思路
- 先修复代码基础错误:
第一行URL字符串开头缺失单引号,且url、invite_url两个地址都没有加http://或https://协议前缀,requests无法识别无协议头的地址为合法请求地址;另外代码中提取了server_id但没有拼接到invite_url中,请求的根本不是对应服务的专属邀请地址,自然拿不到正确跳转结果。 - 先确认跳转类型:
临时将allow_redirects参数设为False发起请求,打印响应状态码和响应头中的Location字段:
如果返回301/302/303/307/308这类3xx状态码,且Location字段有值,属于标准HTTP重定向,开启r = s.get(invite_url, allow_redirects=False, timeout=10) print(r.status_code) print(r.headers.get('Location'))allow_redirects=True后requests会自动跟进跳转,最终r.url就是目标地址;如果返回200状态码,说明跳转逻辑写在返回的HTML页面中(JS跳转、meta标签跳转),不属于HTTP层重定向,requests不会自动解析执行前端代码,自然不会跳转 - 绕过站点反爬校验:
大部分站点不会仅靠User-Agent判定请求合法性,需要补全Accept、Accept-Language、Referer等常规浏览器请求头;涉及Cookie校验的场景,先请求站点首页拿到合法Cookie再发起目标地址请求,避免被反爬拦截返回原页面、不触发跳转逻辑。 - 针对性处理非HTTP重定向场景:
对于前端跳转的情况,直接用正则从响应HTML文本中匹配目标跳转URL即可,不需要额外执行JS;如果跳转链路有加密参数、JS校验,再使用支持JS渲染的请求工具模拟浏览器访问。 - 前置校验链路:
先把目标URL复制到浏览器隐身窗口手动访问,确认实际跳转流程,再将代码中的请求头、Cookie、请求参数和浏览器真实请求参数逐一比对,排查代理、域名拦截、重定向死循环等环境问题。
内容的提问来源于stack exchange,提问作者tim
相关产品推荐
相关产品推荐

