Python HTTP重定向处理:301/302跳转与循环检测

71 阅读2分钟

在Python中进行HTTP请求时,经常会遇到服务器返回301(永久重定向)或302(临时重定向)状态码的情况。这些重定向用于告知客户端资源已移动到新的位置,需要客户端重新发起请求。合理处理这些重定向对于确保请求的成功和数据的准确性至关重要,同时还需要注意检测并避免重定向循环。

处理301/302重定向****

Python的requests库是处理HTTP请求的常用工具,它默认会自动处理301和302重定向。当接收到重定向响应时,requests库会自动获取Location头中的新URL,并重新发起请求。例如:

python复制代码

 import requests
  
 response = requests.get('example.com/old-url')
 print(response.url) # 输出重定向后的最终URL

如果需要手动控制重定向行为,可以通过设置allow_redirects参数为False来禁用自动重定向,然后手动解析Location头并重新发起请求。

检测重定向循环****

重定向循环是指一系列重定向请求形成了一个闭环,导致客户端陷入无限循环。为了避免这种情况,可以在代码中实现一个简单的循环检测机制。

一种方法是记录请求过程中访问过的所有URL,并在每次重定向前检查新URL是否已在记录中。如果是,则认为发生了重定向循环,并终止请求。以下是一个简单的示例:

python复制代码

 import requests
  
 visited_urls = set()
  
 def fetch_with_redirect_check(url):
 while url:
 if url in visited_urls:
 print("检测到重定向循环")
 return None
 visited_urls.add(url)
  
 response = requests.get(url, allow_redirects=False)
 if 300 <= response.status_code < 400:
 url = response.headers.get('Location')
 else:
 return response