Python Requests - 处理重定向

2025年1月5日 | 阅读 4 分钟

Python 的 requests 库是一个强大且流行的发送 HTTP 请求的工具。它一项有用的功能是自动处理重定向。重定向在网络上很常见,服务器通过将客户端重定向到另一个 URL 来响应客户端的请求。这可能出于多种原因,例如 URL 重构、负载均衡或内容迁移。理解如何使用 requests 库处理这些重定向对于构建健壮高效的网络抓取或网络交互工具至关重要。

理解 HTTP 重定向

在深入研究 requests 库处理重定向的具体细节之前,了解 HTTP 重定向的基础知识非常重要。HTTP 重定向通过服务器响应中的 3xx 状态码来指示。常见的 3xx 状态码包括:

  • 301 已永久移动:资源已永久移动到新的 URL。未来的请求应使用新 URL。
  • 302 找到:此资源临时位于不同的 URL。未来的请求应继续使用原始 URL。
  • 303 另请参阅:请求的响应可以在另一个 URL 上使用 GET 方法找到。
  • 307 临时重定向:资源暂时位于不同的 URL 下,并且请求方法不应更改。
  • 308 永久重定向:与 301 类似,但请求方法和正文不会改变。

当客户端收到这些状态码之一时,它需要按照响应中的 Location 标头提供的重定向到新 URL。

使用 requests 处理重定向

requests 库简化了重定向的处理。默认情况下,它会自动跟踪重定向。以下是其工作原理的基本示例:

输出

https://github.com
200

在此示例中,如果您访问 http://github.com,您会注意到它会重定向到 https://github.com。requests 库会自动跟踪此重定向,并打印最终 URL。

控制重定向行为

虽然默认的跟踪重定向行为很方便,但在某些情况下,您可能希望对重定向过程有更多的控制。requests 库提供了几种管理此行为的方法。

禁用重定向

要禁用自动重定向,可以使用 allow_redirects 参数:

输出

301
https://github.com/

在这种情况下,requests 不会跟踪重定向。响应将包含原始状态码(例如 301)和 Location 标头,其中包含请求将被重定向到的 URL。

限制重定向次数

默认情况下,requests 会跟踪多达 30 次重定向。您可以使用自定义会话和 max_redirects 属性来更改此限制:

输出

http://example.com/

在此示例中,会话将跟踪最多 5 次重定向。如果重定向链超过各自所需的限制,将引发 TooManyRedirects 异常。

检查重定向历史记录

requests 库允许您检查请求过程中发生的重定向历史记录。这可以通过响应对象的 history 属性访问:

输出

[]
301 http://github.com

history 属性是重定向过程中创建的响应对象列表。您可以遍历此列表以查看每个中间步骤。

实际应用

网页抓取

抓取网站时,处理重定向至关重要,因为许多网站使用重定向来管理其内容。例如,网站可能会在从移动设备访问时将用户重定向到该网站的移动版本。以下是如何处理此类场景:

输出

Redirected History:
301 http://example.com
200 https://www.iana.org/domains/example
Example Domain

在此示例中,该脚本会自动处理重定向,然后使用 BeautifulSoup 解析最终内容。

API 请求

一些 API 使用重定向在不同服务器之间进行负载均衡。在处理此类 API 时,处理重定向至关重要,以确保您的请求到达正确的服务器:

输出

Request failed with status code: 404

在这种情况下,脚本会跟踪重定向以确保 API 请求成功完成。

结论

借助 requests 库的内置自动重定向支持,在 Python 中使用 requests 库处理重定向非常简单。通过了解 HTTP 重定向的基础知识,并利用 requests 库提供的各种功能和自定义选项,您可以有效地管理网络抓取和网络交互任务中的重定向。无论您是需要自动跟踪重定向、禁用它们、限制重定向次数,还是实现自定义重定向处理逻辑,requests 库都提供了满足您需求的灵活性和功能。