死链检测需综合状态码、重定向终点、响应内容及content-type:403/410/503属死链,200可能为伪装404,301/302须追踪至终点;requests.head()须设allow_redirects=true与max_redirects=5,并捕获toomanyredirects;405时fallback至get+stream;200响应须校验content-type是否为text/html及页面内容是否含404关键词。

死链检测不能只看 status_code == 404 就标记为失效——真实场景里,403/410/503 是死链,200 却可能是“伪装的 404 页面”,而 301/302 后的终点才决定链接是否有效。
requests.head() 必须配 allow_redirects=True 和 max_redirects
用 requests.head() 省带宽、提速度,但它默认不跳转(allow_redirects=False),很多死链卡在 302 → 404 这一跳里,直接被当成“有效”漏掉。
- 务必显式设置
allow_redirects=True,否则拿不到重定向链末端的状态码 - 同时传
max_redirects=5(别用默认的 30),防止遇到配置错误的循环跳转卡死或超时 - 捕获
requests.TooManyRedirects异常,这类链接基本可判为死链 - 若目标站返回
405 Method Not Allowed,要 fallback 到requests.get(url, stream=True)并立刻调用response.close()
状态码之外,必须校验响应内容和 Content-Type
不少 CMS 或 CDN 会把 404 页面统一返回 200 + HTML 模板,光靠状态码会严重误判。
SkillSub Pro - Python 题解与代码注释双功能技能功能概述SkillSub Pro - Python 题解与代码注释双功能技能是一项面向实际任务的技能,主要用于SkillSub Pro 是一个 Python 题解生成与代码注释的 双功能合体技能 ,专为学生、算法学习者和开发者设计;✅ 一个技能,两种用途 :;核心要点📝 题解模式 :输入题目/题号,自动生成完整 Python 题解(含详细注释、解题思路、复杂度分析);💬 注释模式 :输入 Python 代码,自动添加详细中。它将相关步骤、
- 对所有
status_code == 200的响应,先检查response.headers.get("Content-Type", "")是否以"text/html"开头 - 再取
response.content[:2048](不是response.text,避免解码开销),用正则匹配r"404|not found|page does not exist|does not exist"(忽略大小写) - 若匹配成功,且页面长度
字节,大概率是假 200,应归为死链 - 避免用
BeautifulSoup全量解析——IO 密集任务混入 CPU 密集操作,吞吐量直接腰斩
并发请求必须限流、设超时、做异常兜底
不加约束的并发不是快,是自爆:本地文件描述符耗尽、DNS 缓存打崩、目标站返回 429 或直接 ConnectionRefusedError。
- 从
max_workers=5起步,观察平均响应时间后再逐步上调;别迷信“越多越快” - 每个
requests调用必须设timeout=(3, 7):3 秒连不上就放弃,7 秒内读不到响应也中断 - 捕获
requests.exceptions.ConnectionError、TimeoutError、requests.exceptions.ReadTimeout,记入待重试队列,只重试 1 次(加jitter延迟) - 对
403、401、429不标记为死链,单独归类为“受限”,它们往往只是反爬策略触发
URL 规范化和去重是报告可信的前提
没做归一化的报告,统计结果全是噪音:https://a.com/ 和 https://a.com/index.html 被算作两条,HTTP 和 HTTPS 版本重复探测,带参/不带参链接反复报错。
- 用
urllib.parse.urlparse()解析后,统一转小写、移除默认端口(80/443)、标准化路径(os.path.normpath()处理../) - 剥离空查询参数(
?a=&b=1→?b=1),但保留有意义的参数(如分页、过滤) - 内部链接必须先用
urllib.parse.urljoin(base_url, relative_path)补全为绝对 URL,再规范化——base_url 是原始页面 URL,不是首页 - 不要用
set()存原始字符串;用归一化后的字符串做 key,才能真正去重
最易被忽略的点是:死链判定从来不是单维度的。它依赖重定向终点状态码、响应体片段、Content-Type、跳转深度四者交叉验证,缺一不可。少做一层校验,报告里的“死链数”就可能偏差 30% 以上。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










