Python使用requests时如何获取变更后的最终URL?
核心问题原因
requests模块无法获取目标变更URL,本质是两种URL跳转的实现层级完全不同:
- requests仅能识别、追踪服务端层面的HTTP重定向(即返回301/302状态码的跳转),这类跳转由服务端在响应头中明确指定,客户端收到响应后直接按指令切换访问地址。
- 案例中出现的地址变化,是页面加载完成后,由内置JavaScript脚本手动修改浏览器地址栏实现的前端路由跳转,整个过程无服务端重定向响应。requests没有内置JavaScript执行环境,拉取完静态HTML即停止处理流程,不会触发页面内的跳转逻辑,自然检测不到URL变化。
可行的实现方案
- 方案1:使用带JS渲染能力的无头浏览器工具
这类工具会完整模拟真实浏览器的全流程行为:加载页面资源、执行所有前端脚本、等待地址栏的跳转逻辑执行完成,再读取当前页面的实际URL,即可拿到目标地址。
以Playwright工具为例,示例代码:
from playwright.sync_api import sync_playwright with sync_playwright() as p: browser = p.chromium.launch(headless=True) page = browser.new_page() # 访问初始短链接 page.goto('https://www.instantstreetview.com/s/59.421688492195614,24.793857100774545') # 等待页面网络空闲、JS执行完成,确保URL跳转稳定 page.wait_for_load_state('networkidle') final_url = page.url print(f"最终变更后的URL:{final_url}") browser.close()
- 方案2:逆向前端URL转换规则
如果需要高频、批量获取这类URL,可以拆解站点前端JS的转换逻辑:分析短链接路径中的经纬度参数,是如何经过计算、拼接成带视角、缩放参数的@格式最终URL的。把这套计算逻辑用Python代码复现,不需要启动浏览器,即可在本地直接算出最终地址,运行效率会高很多。
补充说明:原有代码中判断
response.history的逻辑本身没有错误,只是它的适用范围仅覆盖服务端重定向场景,遇到JS触发的前端地址变更时,永远不会进入历史重定向的判断分支,这不是requests模块的功能缺陷。
内容的提问来源于stack exchange,提问作者Brooklyn_95
相关产品推荐
相关产品推荐

