Python requests库获取原始HTTP重定向状态码的教程


Python requests库获取原始HTTP重定向状态码的教程

在使用python的requests库进行http请求时,`requests.get`默认会自动跟随重定向,导致无法直接获取到301、302等原始重定向状态码。本教程将详细解释这一默认行为,并提供通过设置`allow_redirects=false`参数来禁用自动重定向,从而准确捕获并处理原始重定向响应的方法,帮助开发者更好地理解和控制http请求流程。

理解 requests 库的重定向行为

Python的requests库是一个功能强大且用户友好的HTTP客户端库。为了提供更便捷的使用体验,requests库在执行GET、OPTIONS、HEAD、POST、PUT、PATCH或DELETE请求时,默认会模拟浏览器的行为,自动处理HTTP重定向。这意味着,当一个请求的目标URL返回301(永久移动)、302(临时移动/找到)等3xx系列状态码时,requests库会自动发起一个新的请求到服务器指定的Location头部字段所指向的URL,直到达到最终的非重定向目标地址,或者重定向次数达到上限(默认为30次)。

这种默认行为虽然在大多数情况下简化了开发,但在某些特定场景下却可能带来困惑。例如,当开发者希望明确知道一个URL是否发生了重定向,或者需要获取原始的重定向状态码(如进行SEO链接检查、调试重定向链条等)时,requests.get()返回的response.status_code往往是最终目标URL的状态码(通常是200 OK),而非初始的3xx重定向状态码。这使得开发者无法直接从响应中识别出原始的重定向事件。

解决方案:禁用自动重定向

为了捕获原始的重定向状态码,我们需要明确指示requests库不要自动跟随重定向。这可以通过在requests.get()(或其他HTTP方法,如post()、head()等)调用中设置allow_redirects=False参数来实现。

当allow_redirects设置为False时,requests库在收到任何3xx重定向响应时,将立即停止并返回该重定向响应。此时,response.status_code将准确地反映服务器返回的301、302等原始重定向状态码。

AiTxt 文案助手 AiTxt 文案助手

AiTxt 利用 Ai 帮助你生成您想要的一切文案,提升你的工作效率。

AiTxt 文案助手 105 查看详情 AiTxt 文案助手

示例代码

下面是一个演示如何使用allow_redirects=False来获取原始重定向状态码的Python代码示例。我们将创建一个函数来检查URL状态,并对比启用和禁用自动重定向时的行为。

import requests
import csv

def check_url_status(url, allow_redirects_flag=True):
    """
    检查URL状态,并根据allow_redirects_flag参数控制是否跟随重定向。
    :param url: 待检查的URL。
    :param allow_redirects_flag: 是否允许requests库自动跟随重定向,默认为True。
                                 设置为False将捕获原始重定向状态码。
    :return: 描述URL状态的字符串。
    """
    try:
        # 关键在于设置 allow_redirects 参数
        response = requests.get(url, timeout=5, allow_redirects=allow_redirects_flag)
        status_code = response.status_code

        if 200 <= status_code < 300:
            return f"Alive ({status_code})"
        elif 300 <= status_code < 400:
            # 当allow_redirects_flag=False时,这里会捕获到3xx状态码
            # 如果allow_redirects_flag=True,则通常不会进入此分支,除非重定向链条最终返回3xx
            return f"Redirected ({status_code})"
        elif 400 <= status_code < 500:
            return f"Client Error ({status_code})"
        elif 500 <= status_code < 600:
            return f"Server Error ({status_code})"
        else:
            return f"Unknown Status ({status_code})"
    except requests.exceptions.Timeout:
        return "Error: Timeout"
    except requests.exceptions.ConnectionError:
        return "Error: Connection Failed"
    except requests.exceptions.RequestException as e:
        return f"Error: {e}"

# 模拟一个包含重定向URL的CSV文件
# urls.csv 内容示例:
# http://example.com
# http://httpbin.org/redirect-to?url=http://example.com
# http://httpbin.org/status/404
# http://www.google.com
# http://httpbin.org/absolute-redirect/1
# http://nonexistent-domain-12345.com

# 假设从CSV读取URL列表
# 为了演示,我们直接定义一个列表
urls_to_check = [
    "http://example.com",
    "http://httpbin.org/redirect-to?url=http://example.com", # 这是一个会返回302的测试URL
    "http://httpbin.org/status/404",
    "http://www.google.com",
    "http://httpbin.org/absolute-redirect/1", # 会返回302
    "http://nonexistent-domain-12345.com"
]

print("--- 场景一:允许自动重定向 (默认行为) ---")
print("此时,重定向URL将显示最终状态码 (通常是200)。")
results_default = []
for url in urls_to_check:
    status = check_url_status(url, allow_redirects_flag=True)
    results_default.append((url, status))
    print(f"URL: {url}, Status: {status}")

print("\n--- 场景二:禁用自动重定向 (allow_redirects=False) ---")
print("此时,重定向URL将显示原始的3xx状态码。")
results_no_redirect = []
for url in urls_to_check:
    status = check_url_status(url, allow_redirects_flag=False)
    results_no_redirect.append((url, status))
    print(f"URL: {url}, Status: {status}")

# 将结果写入CSV文件的逻辑可以根据需要添加
# 例如:
# with open("url_status_default.csv", "w", newline="") as outfile:
#     writer = csv.writer(outfile)
#     writer.writerow(["URL", "Status"])
#     writer.writerows(results_default)
# print("\nURL状态 (默认重定向) 已写入 url_status_default.csv")

# with open("url_status_no_redirect.csv", "w", newline="") as outfile:
#     writer = csv.writer(outfile)
#     writer.writerow(["URL", "Status"])
#     writer.writerows(results_no_redirect)
# print("URL状态 (禁用重定向) 已写入 url_status_no_redirect.csv")

在上述代码中,check_url_status函数通过allow_redirects_flag参数控制是否跟随重定向。当allow_redirects_flag为False时,对于重定向的URL,我们将能捕获到302等原始状态码,而不是重定向后的最终200状态码。

注意事项

  1. 重定向目标获取:当allow_redirects=False时,如果你需要知道重定向的目标URL,可以检查响应头中的Location字段,例如response.headers.get('Location')。
  2. 重定向历史:即使allow_redirects=True,requests库也提供了response.history属性,它是一个包含所有中间重定向响应的列表。通过遍历这个列表,你可以获取重定向链条中每个步骤的URL和状态码,这对于分析复杂的重定向路径非常有用。
    import requests
    response = requests.get("http://httpbin.org/redirect/3", allow_redirects=True)
    print(f"最终URL: {response.url}, 最终状态码: {response.status_code}")
    print("重定向历史:")
    for resp_history in response.history:
        print(f"  - {resp_history.url} ({resp_history.status_code}) -> {resp_history.headers.get('Location', 'N/A')}")
  3. 超时处理:在进行网络请求时,设置timeout参数是良好的实践,可以避免程序长时间等待无响应的服务器。
  4. 异常处理:始终使用try-except块来捕获requests可能抛出的各种异常,如requests.exceptions.Timeout、requests.exceptions.ConnectionError、requests.exceptions.RequestException等,以增强程序的健壮性。

总结

requests库的allow_redirects参数是一个非常重要的功能,它赋予了开发者对HTTP重定向行为的精确控制。理解并正确使用allow_redirects=False对于需要获取原始重定向状态码的场景至关重要,例如SEO链接检查、API集成中对特定重定向码的处理,或者在调试网络请求流程时。通过禁用自动重定向,我们可以捕获到服务器返回的真实3xx状态码,从而更准确地分析和处理HTTP请求的响应。同时,利用response.history属性也能帮助我们追踪完整的重定向路径,为更复杂的应用场景提供数据支持。

以上就是Python requests库获取原始HTTP重定向状态码的教程的详细内容,更多请关注其它相关文章!


# 设置为  # 代理ip与营销推广  # 橘子seo综合查询  # 网站建设费用支付流程  # 母婴类带货关键词排名  # 网站建设开发怎样收费的  # 免费注册网站推广软件  # 江苏建设网站找哪家  # seo1毛片  # 泰州网站推广有哪些平台  # 白象营销推广方案设计  # 也能  # 你可以  # 如果你  # 这一  # 默认为  # python  # 几种  # 浮点  # 是一个  # 重定向  # red  # csv文件  # 状态码  # google  # ai  # csv  # app  # 浏览器  # seo  # go 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894 】


相关推荐: WPS文字如何进行简繁转换  在Django单元测试中优雅处理信号:基于环境的条件执行策略  解决Windows上Composer PATH变量冲突导致的命令无法识别问题  todesk如何添加信任设备_todesk信任设备设置教程  《三国:谋定天下》平民全阶段通用阵容  江苏大剧院会员卡购买步骤  实现可重用自定义Python Range类  j*a中ArrayBlockingQueue的使用  《360浏览器》自动保存账号密码设置方法  如何配置VS Code作为您Git操作的默认编辑器  win11如何运行chkdsk命令 Win11检查和修复磁盘逻辑错误教程【修复】  人教版电子教材在线获取指南  智云Q3和Q2有什么升级_智云Q3与Q2手持云台功能与性能对比分析  解决PHP MySQL数据库更新无响应:SQL查询语法错误解析  无人机考证官网 中国民航无人机考证官网登录入口  163邮箱网页版官方登录入口 163邮箱网页版访问页面  cad视图选项卡不见了怎么办_cad视图标签恢复显示方法  12306售票时间最新规定 | 网上订票和车站窗口时间一样吗  composer licenses 命令:如何检查项目依赖的许可证?  123平台官方登录入口 123邮箱网页端在线沟通工具  ao3入口镜像地址 ao3镜像入口可靠跳转  PPT智能排版生成入口 免费PPT内容自动生成平台  《原神》月之一版本新增书籍一览  申通快件单号查询平台 申通包裹物流动态跟踪  海棠阅读网页版_进入海棠网页版在线阅读中心  C#中的Record类型有什么优势?C# 9新特性Record与Class的用法区别  极兔快递官网查询入口手机版 手机极兔快递登录查询入口官方  实现二叉树的层序插入:基于树大小的路径导航  《优志愿》修改手机号方法  画质怪兽120帧安卓和平精英免费版  在XML中嵌入二进制数据(如图片)的最佳实践是什么? Base64编码与解析注意事项  FotoBalloon图片左右镜像教程  163邮箱网页版入口 163邮箱在线使用  BunnyStream TUS视频上传指南:解决401认证错误与参数配置  顺丰快递单号查询寄件人 顺丰寄件人查询入口  Mac如何开启画中画模式_Mac Safari浏览器视频画中画功能  word表格如何按某一列内容进行排序_Word表格按列排序方法  苹果手机聊天记录删除了如何恢复  吃完饭就犯困是什么原因 餐后嗜睡如何缓解  《金山词霸》语音翻译方法  狙击外星人小游戏在线链接_狙击外星人小游戏网页链接  《小宇宙》标记不友善评论方法  cad怎么隐藏指定的图层_cad隐藏或冻结图层方法  在VS Code中利用AI辅助进行代码迁移  PHP中获取HTTP响应状态消息:方法与限制  荣耀 Magic10 Pro 系统更新提示失败_荣耀 Magic10 Pro 升级修复  Sublime怎么配置YAML文件格式化_Sublime YAML Formatter插件教程  如何在mysql中使用索引提示_mysql索引提示优化方法  Golang如何使用gRPC拦截器实现日志收集_Golang gRPC拦截器日志收集实践  使用逻辑应用(Logic Apps)自动处理邮件附件中的XML到Excel 

 2025-10-30

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.