如何使用Python requests库测量重定向阶段的延迟?
测量HTTP重定向阶段的延迟时间
重定向延迟指的是从301重定向响应到200最终响应的耗时,或是两次301重定向之间的耗时,效果类似Chrome扩展中的测量:

用Python的requests库时,r.elapsed只能统计从发送请求到接收首个响应内容的总耗时,没法单独获取每个重定向阶段的延迟时间。比如你给出的这段代码:
import requests url = 'http://httpbin.org/redirect/3' r = requests.head(url, allow_redirects=True, stream=True) r.elapsed
只能拿到整个请求链的总耗时,看不到中间每一步跳转的延迟。
解决方法:手动处理重定向,逐阶段记录时间
要获取每个重定向阶段的延迟,需要禁用requests的自动重定向功能,手动追踪每个跳转步骤,记录每个请求的开始和结束时间:
import requests from datetime import datetime from urllib.parse import urljoin def measure_redirect_delays(url): session = requests.Session() current_url = url delays = [] while True: # 记录当前请求的开始时间 start_time = datetime.now() # 禁用自动重定向,获取当前请求的响应 response = session.head(current_url, allow_redirects=False, stream=True) # 计算当前请求的耗时 elapsed = datetime.now() - start_time delays.append({ 'url': current_url, 'status_code': response.status_code, 'delay': elapsed }) # 检查是否还有重定向 if 300 <= response.status_code < 400 and 'Location' in response.headers: current_url = response.headers['Location'] # 处理相对路径的重定向地址 if not current_url.startswith(('http://', 'https://')): current_url = urljoin(url, current_url) else: break return delays # 测试示例 url = 'http://httpbin.org/redirect/3' redirect_delays = measure_redirect_delays(url) for item in redirect_delays: print(f"URL: {item['url']} | 状态码: {item['status_code']} | 耗时: {item['delay']}")
代码说明
- 用
allow_redirects=False禁止自动跳转,这样能拿到每个重定向响应的详细信息 - 每次请求前记录
start_time,响应返回后计算时间差,得到当前阶段的延迟 - 检查响应状态码和
Location头,手动跳转到下一个地址,直到拿到非重定向响应 - 处理相对路径的重定向地址,避免出现无效URL
运行这段代码后,就能得到每个重定向步骤的单独耗时,和Chrome扩展的测量逻辑一致。
内容的提问来源于stack exchange,提问作者Sardar
相关产品推荐
相关产品推荐

