新闻中心
如何在Python Requests库中获取HTTP重定向状态码(3xx)

python `requests`库在默认情况下会自动跟随http重定向,导致无法直接获取到3xx系列的状态码,而是返回最终的200状态码。本教程将详细解释这一机制,并提供通过设置`allow_redirects=false`参数来禁用自动重定向的方法,从而准确捕获并处理原始的重定向响应码。
理解Requests库的重定向行为
在使用Python的requests库进行HTTP请求时,我们常常期望获取到网页的最终内容。为了实现这一目标,requests库在设计上默认会遵循HTTP重定向(例如301、302、303等状态码)。这意味着当您向一个会发生重定向的URL发起GET请求时,requests会自动跟踪这些重定向,直到达到一个非重定向的最终目标URL,并返回该最终URL的响应。
这种默认行为在多数情况下是方便的,因为它简化了获取目标资源的过程。然而,当我们需要精确地检测和处理重定向本身,例如识别一个URL是否是重定向链接,或者获取原始的重定向状态码(如302 Found、301 Moved Permanently),默认行为就会导致问题。此时,response.status_code将显示最终页面的状态码(通常是200 OK),而不是原始的重定向状态码。
捕获原始重定向状态码的方法
要捕获原始的HTTP重定向状态码,我们需要指示requests库不要自动跟随重定向。这可以通过在requests.get()(或其他HTTP方法,如post()、head()等)中设置allow_redirects=False参数来实现。
当allow_redirects设置为False时,requests库在收到任何3xx状态码的响应时,将不会继续发起新的请求,而是直接返回这个3xx响应。这样,我们就可以通过response.status_code获取到原始的重定向状态码。
Pinokio
Pinokio是一款开源的AI浏览器,可以安装运行各种AI模型和应用
232
查看详情
示例代码
下面是一个示例,演示如何使用allow_redirects=False来获取重定向状态码,并与默认行为进行对比:
import requests
def get_url_redirect_status(url: str, follow_redirects: bool = False) -> str:
"""
获取URL的HTTP状态码,并根据follow_redirects参数决定是否跟随重定向。
参数:
url (str): 待检测的URL。
follow_redirects (bool): 是否允许requests库自动跟随重定向。
设置为False可捕获原始的3xx状态码。
返回:
str: 包含状态码和描述的字符串。
"""
try:
# 核心:通过 allow_redirects 参数控制重定向行为
response = requests.get(url, timeout=5, allow_redirects=follow_redirects)
status_code = response.status_code
if 200 <= status_code < 300:
return f"正常响应 ({status_code})"
elif 300 <= status_code < 400:
# 如果是3xx状态码,表示发生了重定向
# response.headers['Location'] 可以获取重定向目标
redirect_target = response.headers.get('Location', '未知')
return f"重定向 ({status_code}) -> 目标: {redirect_target}"
elif 400 <= status_code < 500:
return f"客户端错误 ({status_code})"
elif 500 <= status_code < 600:
return f"服务器错误 ({status_code})"
else:
return f"其他状态 ({status_code})"
except requests.exceptions.Timeout:
return "错误: 请求超时"
except requests.exceptions.ConnectionError:
return "错误: 连接失败"
except requests.exceptions.RequestException as e:
return f"错误: {e}"
# 示例用法
if __name__ == "__main__":
# 使用 httpbin.org 提供的测试URL,它会发生302重定向到 /get
test_redirect_url = "http://httpbin.org/redirect-to?url=http://httpbin.org/get"
test_ok_url = "http://httpbin.org/status/200"
test_not_found_url = "http://httpbin.org/status/404"
print("--- 禁用自动重定向 (allow_redirects=False) ---")
print(f"URL: {test_redirect_url}")
print(f"状态: {get_url_redirect_status(test_redirect_url, follow_redirects=False)}\n")
print(f"URL: {test_ok_url}")
print(f"状态: {get_url_redirect_status(test_ok_url, follow_redirects=False)}\n")
print(f"URL: {test_not_found_url}")
print(f"状态: {get_url_redirect_status(test_not_found_url, follow_redirects=False)}\n")
print("\n--- 对比:默认行为 (自动跟随重定向) ---")
try:
response_default = requests.get(test_redirect_url, timeout=5)
print(f"URL: {test_redirect_url}")
print(f"默认行为状态码: {response_default.status_code}")
# 通过 response.history 可以查看重定向链
if response_default.history:
print(f"重定向历史: {[f'{r.status_code} -> {r.url}' for r in response_default.history]}")
print(f"最终URL: {response_default.url}")
else:
print("未发生重定向。")
except requests.exceptions.RequestException as e:
print(f"错误: {e}")运行上述代码,您会发现:
- 当follow_redirects=False时,test_redirect_url会返回重定向 (302) -> 目标: http://httpbin.org/get,这正是我们想要捕获的原始重定向状态。
- 当使用默认行为(即requests.get(url)或follow_redirects=True)时,test_redirect_url会返回最终的200状态码,并且response.history会记录重定向的路径。
注意事项
- 重定向目标获取:当allow_redirects=False且响应为3xx状态码时,重定向的目标URL通常可以在response.headers['Location']中找到。
- 重定向历史:即使禁用了自动重定向,如果您想了解一个URL是否会重定向以及重定向的路径,可以先设置allow_redirects=False获取原始3xx响应,然后手动发起对Location头中URL的请求。或者,如果您允许自动重定向 (allow_redirects=True),response.history属性会包含一个Response对象列表,按请求的顺序记录了所有重定向响应。
- HEAD请求:对于某些场景,如果只是想检查URL是否存在或是否重定向,而不关心响应内容,可以使用requests.head(url, allow_redirects=False)。HEAD请求通常比GET请求更快,因为它只请求响应头,但并非所有服务器都正确支持HEAD请求。
- 超时设置:在进行网络请求时,务必设置timeout参数,以防止程序因长时间等待响应而阻塞。
- 异常处理:网络请求容易遇到各种问题(如连接失败、超时等),因此良好的异常处理是必不可少的。requests.exceptions模块提供了多种具体的异常类型供捕获。
总结
requests库的allow_redirects参数是控制HTTP重定向行为的关键。通过将其设置为False,开发者可以精确地捕获并处理原始的3xx重定向状态码,这对于需要分析链接健康状况、构建爬虫策略或进行特定网络诊断的场景至关重要。理解并灵活运用这一参数,将使您的Python网络请求代码更加健壮和功能完善。
以上就是如何在Python Requests库中获取HTTP重定向状态码(3xx)的详细内容,更多请关注其它相关文章!
# 如何在
# 盐城湖南网站优化推广
# 岳阳网站优化工作室招聘
# 青岛seo系统效果乐云seo品牌
# 优化网站技术有哪些
# seo站长官网
# 发泄网站建设美丽
# 关键词排名绩效
# 运城网站建设收费标准
# 武汉网站推广哪家公司好
# 肥乡网站优化价格
# 是一个
# 如何实现
# python
# 解决方法
# 重写
# 自定义
# 库中
# 这一
# 设置为
# 重定向
# red
# 状态码
# 爬虫
# ai
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
C++如何实现异步操作_C++11使用std::future和std::async进行异步编程
如何在CSS中使用visited与link控制链接颜色_visited link伪类配合
c++如何使用折叠表达式(Fold Expressions)_c++17可变参数模板新技巧
2026春节假期时间安排 2026春节假日查询
b站怎么取消点赞_b站点赞取消操作方法
css链接悬停下划线样式如何自定义_使用::after结合content和transition
“音游” × “怪文书” 题材的节奏冒险游戏 《晕晕电波症候群》确定于2026年4月发售!
抓大鹅无需下载版 抓大鹅秒玩版入口
抖音网页版怎么|直播|_抖音网页版开播操作指南
妖精漫画网页版登录入口免费_妖精漫画官网主页直接阅读漫画
高德地图总提示网络异常怎么办 高德地图离线导航设置与网络排查方法
C++如何实现一个智能指针_手动实现C++ shared_ptr的引用计数功能
Golang如何处理RPC请求负载均衡_Golang RPC请求负载均衡策略与实践
如何提高微信支付的安全性_微信支付安全防护与设置建议
在J*a中如何隐藏复杂性_使用门面模式组织对象交互
mc.js官网登录入口 mc.js官方登录入口最新版
12306选座怎么选到特殊座位_12306特殊座位选择注意事项
PS5 Pro有点优势但不多! 《燕云十六声》PS5平台与PC性能画面对比
利用5118提升短视频内容效果_5118短视频关键词优化方法
在Go Martini框架中高效服务动态生成图像的实践指南
网易大神怎么保存别人动态的图片_网易大神动态图片保存方法
QQ邮箱官方登录入口_QQ邮箱网页版快捷使用平台
小红书商家版怎样在笔记嵌入商品卡路径_小红书商家版在笔记嵌入商品卡路径【挂载教程】
小米汽车11月交付量突破40000台!雷军:将继续努力
理解Python模块与全局变量的作用域管理
CSS子选择器:如何区分并样式化嵌套列表的子层级
Word2013如何插入视频和音频媒体_Word2013媒体插入的多媒体支持
拼多多赚钱渠道_拼多多收益来源
深入理解Go语言中的指针类型:以*string为例
怎么在html里运行vbs脚本_html中运行vbs脚本方法【教程】
lar*el怎么安全地存储和获取配置文件中的敏感信息_lar*el敏感信息安全存储方法
JUnit5/Mockito:优雅测试内部依赖与异常处理的实践
Python模块化编程:有效管理依赖与避免循环引用
必由学官方登录入口 必由学教师学生账号快速访问
React/Next.js中实现列表项的动态选择与移动
提升Kafka消费者健壮性:会话超时处理与消息处理语义
c++ 获取系统当前时间 c++时间戳获取方法
qq浏览器打开空白页怎么办 qq浏览器启动后显示白屏的解决教程
修复二维数组索引越界异常:一维循环到二维坐标的正确映射
QQ邮箱网页版登录入口 QQ邮箱官方在线使用平台
J*aScript数组对象转换:按指定键分组与值收集
网易大神账号申诉需要多久_网易大神账号申诉流程说明
ExcelARRAYTOTEXT函数怎么自定义分隔符输出数组文本_ARRAYTOTEXT实现动态生成SQL语句
Basecamp怎样用留言钉固定重点_Basecamp用留言钉固定重点【重点标记】
新手怎么开始学化妆 零基础化妆入门教程
iwriter统一登录平台 iwrite账号密码登录页面
豆包手机助手发布技术预览版:直接嵌入手机系统!努比亚样机发售
AO3镜像入口大全 AO3网页版内容访问全集
yy漫画网页版官方入口_yy漫画官网登录页面链接
千牛数据看板网页版_千牛数据看板网页版访问方法


2025-10-30
浏览次数:次
返回列表
# 通过 response.history 可以查看重定向链
if response_default.history:
print(f"重定向历史: {[f'{r.status_code} -> {r.url}' for r in response_default.history]}")
print(f"最终URL: {response_default.url}")
else:
print("未发生重定向。")
except requests.exceptions.RequestException as e:
print(f"错误: {e}")