
本文介绍如何使用 Python 的 requests 库高效识别短链接(如 t.ly)是否失效,避免自动重定向干扰,无需依赖 Selenium 等重量级工具。核心在于禁用自动跳转并检查首次响应的状态码与头部信息。
本文介绍如何使用 python 的 `requests` 库高效识别短链接(如 t.ly)是否失效,避免自动重定向干扰,无需依赖 selenium 等重量级工具。核心在于禁用自动跳转并检查首次响应的状态码与头部信息。
在自动化内容审核或链接健康度检查场景中,直接调用 requests.get(url) 并依赖最终响应的 status_code 和 url 往往会误判——因为 requests 默认启用自动重定向(allow_redirects=True),会一路跟随 301/302 跳转直至最终页面(例如跳转到 Google 搜索页),返回的是终端页面的状态码(如 200),而非短链服务本身的原始响应。
而浏览器访问过期短链时显示类似 https://short.ly/?ref=expired&url=... 的 URL,本质是短链平台在检测到目标失效后,主动返回一个 200 响应,并在 HTML 或 URL 参数中嵌入过期标识。但并非所有短链服务都如此设计;以 t.ly 为例,其行为更规范且可预测:
- ✅ 有效短链:首次请求返回 302 Found,Location 响应头指向目标长链接;
- ❌ 无效/过期短链:首次请求返回 200 OK,且响应体通常为平台首页(如 https://t.ly/ 主页),无有效跳转;
- ⚠️ 其他状态码(如 500、404)需按需记录并告警,但非常见情况。
因此,关键解决方案是:禁用自动重定向,仅检查初始响应。示例代码如下:
import requests
def is_short_url_valid(url: str) -> bool:
"""
判断 t.ly 类短链接是否有效(未过期/未删除)
返回 True 表示有效(将重定向至目标),False 表示已失效或不可达
"""
try:
r = requests.get(url, allow_redirects=False, timeout=5)
# t.ly 对有效链接返回 302,对无效链接返回 200(主页)
if r.status_code == 302 and 'Location' in r.headers:
return True
elif r.status_code == 200:
return False
else:
# 非预期状态码(如 400、503),保守视为无效或需人工核查
return False
except (requests.RequestException, UnicodeError):
return False # 网络异常、DNS 失败、URL 编码错误等均视为不可用
# 使用示例
print(is_short_url_valid("https://t.ly/4WEYb")) # True(假设有效)
print(is_short_url_valid("https://t.ly/nonexistent")) # False⚠️ 注意事项:
- 此方法适用于遵循标准 HTTP 重定向语义的短链服务(如 t.ly、bit.ly)。部分平台(如某些自建短链或 short.ly)可能返回 200 + 前端 JS 跳转或参数化 URL,此时需结合 r.url 解析查询参数(如 ref=expired)或检查响应 HTML 内容,但会显著增加复杂度;
- 务必设置 timeout,防止因短链服务响应缓慢拖慢整体流程;
- 生产环境建议添加请求头(如 User-Agent)避免被风控拦截;
- 若需支持多平台,可扩展为策略模式:针对不同域名(t.ly / bit.ly / is.gd)应用对应的状态码与响应特征判断逻辑。
总结:禁用重定向 + 分析首响状态码与 Header 是轻量、可靠、高性能的短链有效性检测基石。仅在遇到非标准行为(如纯前端跳转、无重定向的参数式过期页)时,才需谨慎评估是否引入 Selenium 或 Playwright 进行真实浏览器渲染分析——绝大多数主流短链服务,requests 完全胜任。

















