0

0

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

心靈之曲

心靈之曲

发布时间:2025-10-30 13:30:12

|

901人浏览过

|

来源于php中文网

原创

如何在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获取到原始的重定向状态码。

立即学习Python免费学习笔记(深入)”;

云从科技AI开放平台
云从科技AI开放平台

云从AI开放平台

下载

示例代码

下面是一个示例,演示如何使用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会记录重定向的路径。

注意事项

  1. 重定向目标获取:当allow_redirects=False且响应为3xx状态码时,重定向的目标URL通常可以在response.headers['Location']中找到。
  2. 重定向历史:即使禁用了自动重定向,如果您想了解一个URL是否会重定向以及重定向的路径,可以先设置allow_redirects=False获取原始3xx响应,然后手动发起对Location头中URL的请求。或者,如果您允许自动重定向 (allow_redirects=True),response.history属性会包含一个Response对象列表,按请求的顺序记录了所有重定向响应。
  3. HEAD请求:对于某些场景,如果只是想检查URL是否存在或是否重定向,而不关心响应内容,可以使用requests.head(url, allow_redirects=False)。HEAD请求通常比GET请求更快,因为它只请求响应头,但并非所有服务器都正确支持HEAD请求。
  4. 超时设置:在进行网络请求时,务必设置timeout参数,以防止程序因长时间等待响应而阻塞。
  5. 异常处理:网络请求容易遇到各种问题(如连接失败、超时等),因此良好的异常处理是必不可少的。requests.exceptions模块提供了多种具体的异常类型供捕获。

总结

requests库的allow_redirects参数是控制HTTP重定向行为的关键。通过将其设置为False,开发者可以精确地捕获并处理原始的3xx重定向状态码,这对于需要分析链接健康状况、构建爬虫策略或进行特定网络诊断的场景至关重要。理解并灵活运用这一参数,将使您的Python网络请求代码更加健壮和功能完善。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
location.assign
location.assign

在前端开发中,我们经常需要使用JavaScript来控制页面的跳转和数据的传递。location.assign就是JavaScript中常用的一个跳转方法。通过location.assign,我们可以在当前窗口或者iframe中加载一个新的URL地址,并且可以保存旧页面的历史记录。php中文网为大家带来了location.assign的相关知识、以及相关文章等内容,供大家免费下载使用。

232

2023.06.27

http500解决方法
http500解决方法

http500解决方法有检查服务器日志、检查代码错误、检查服务器配置、检查文件和目录权限、检查资源不足、更新软件版本、重启服务器或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

495

2023.11.09

http请求415错误怎么解决
http请求415错误怎么解决

解决方法:1、检查请求头中的Content-Type;2、检查请求体中的数据格式;3、使用适当的编码格式;4、使用适当的请求方法;5、检查服务器端的支持情况。更多http请求415错误怎么解决的相关内容,可以阅读下面的文章。

450

2023.11.14

HTTP 503错误解决方法
HTTP 503错误解决方法

HTTP 503错误表示服务器暂时无法处理请求。想了解更多http错误代码的相关内容,可以阅读本专题下面的文章。

3573

2024.03.12

http与https有哪些区别
http与https有哪些区别

http与https的区别:1、协议安全性;2、连接方式;3、证书管理;4、连接状态;5、端口号;6、资源消耗;7、兼容性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2914

2024.08.16

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

1

2026.03.13

Python异步编程与Asyncio高并发应用实践
Python异步编程与Asyncio高并发应用实践

本专题围绕 Python 异步编程模型展开,深入讲解 Asyncio 框架的核心原理与应用实践。内容包括事件循环机制、协程任务调度、异步 IO 处理以及并发任务管理策略。通过构建高并发网络请求与异步数据处理案例,帮助开发者掌握 Python 在高并发场景中的高效开发方法,并提升系统资源利用率与整体运行性能。

39

2026.03.12

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

140

2026.03.11

Go高并发任务调度与Goroutine池化实践
Go高并发任务调度与Goroutine池化实践

本专题围绕 Go 语言在高并发任务处理场景中的实践展开,系统讲解 Goroutine 调度模型、Channel 通信机制以及并发控制策略。内容包括任务队列设计、Goroutine 池化管理、资源限制控制以及并发任务的性能优化方法。通过实际案例演示,帮助开发者构建稳定高效的 Go 并发任务处理系统,提高系统在高负载环境下的处理能力与稳定性。

47

2026.03.10

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.5万人学习

Django 教程
Django 教程

共28课时 | 5万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号