首页资讯中心技术实践 › 正文

用 Python 批量检测链接状态并生成清理报告

摘要:介绍如何用 Python 脚本批量检测内容库中链接的可访问性,自动标记死链、重定向与超时链接,并输出结构化清理报告,适用于运营人员定期维护外链质量。

运营团队维护的内容库中,外链会随时间推移逐渐失效:目标页下架、域名过期、路径变更都会导致读者点击后看到 404 或空白页。本文记录一套用 Python 批量检测链接状态并生成清理报告的技术方案,适合每周或每月跑一次,把死链和异常链接从内容中剥离出来。

需求与适用场景

这套方案面向以下典型场景:

  • 内容库中有数百到数千条外链,人工逐一检查成本过高
  • 需要区分「完全失效」「跳转重定向」「响应超时」三类问题,分别处理
  • 检测结果要能直接交给编辑或运营做清理决策,而不是只给一堆状态码

技术选型上,使用 Python 标准库 urllib 加第三方库 requests,不依赖浏览器渲染,适合检测静态链接的可访问性。

核心实现思路

整体流程分三步:

  1. 从内容源(CSV、Markdown 文件或数据库)提取所有外链 URL
  2. 对每个 URL 发起 HEAD 请求(必要时降级为 GET),记录状态码、最终 URL 与耗时
  3. 按规则分类后输出 CSV 报告,标注处理建议

关键设计点:

  • 使用 HEAD 请求减少带宽消耗,但对返回 405 的站点自动降级为 GET
  • 设置超时阈值(默认 10 秒),避免单个链接阻塞整体进度
  • requests.Session 复用连接,对同一域名的连续请求提升效率
  • 记录重定向链,区分「301 永久跳转」与「302 临时跳转」

代码结构与关键片段

以下为核心检测逻辑的简化版本,可直接在本地运行:

import requests
import csv
from urllib.parse import urlparse

def check_link(url, timeout=10):
    result = {
        "original_url": url,
        "status": None,
        "final_url": None,
        "redirect_count": 0,
        "elapsed_ms": 0,
        "category": "unknown"
    }
    session = requests.Session()
    try:
        resp = session.head(url, timeout=timeout, allow_redirects=True)
        if resp.status_code == 405:
            resp = session.get(url, timeout=timeout, allow_redirects=True, stream=True)
        result["status"] = resp.status_code
        result["final_url"] = resp.url
        result["redirect_count"] = len(resp.history)
        result["elapsed_ms"] = int(resp.elapsed.total_seconds() * 1000)

        if resp.status_code >= 200 and resp.status_code < 300:
            result["category"] = "ok"
        elif resp.status_code in (301, 302, 307, 308):
            result["category"] = "redirect"
        elif resp.status_code >= 400:
            result["category"] = "dead"
    except requests.exceptions.Timeout:
        result["category"] = "timeout"
    except requests.exceptions.ConnectionError:
        result["category"] = "unreachable"
    except Exception as e:
        result["category"] = "error"
        result["error_msg"] = str(e)
    return result

批量执行与报告生成

实际使用时,把待检测链接放入 links.csv,每行一个 URL。主程序读取后逐条调用 check_link,结果写入 report.csv,包含以下字段:

  • original_url:原始链接
  • status:HTTP 状态码
  • final_url:最终落地 URL(有重定向时与原始不同)
  • category:分类标签(ok / redirect / dead / timeout / unreachable / error)
  • suggestion:处理建议(保留、替换为 final_url、人工复核、直接删除)

分类规则建议:

  • ok:状态码 2xx,保留
  • redirect 且最终页 2xx:替换为 final_url 或保留原链接(视业务需求)
  • dead:状态码 4xx,标记待删除或替换
  • timeout / unreachable:人工复核,可能是临时网络问题

注意事项与优化方向

落地时容易踩的几个点:

  • 部分站点会屏蔽非浏览器 User-Agent,需要在请求头中设置合理的 User-Agent
  • 高频请求可能触发限流,建议对同一域名做间隔控制(如每域名每秒不超过 2 次请求)
  • HTTPS 证书校验失败时,verify=False 可临时绕过,但生产环境不推荐,应记录为异常
  • 大规模检测(万级以上)建议用异步方案(aiohttp + asyncio),吞吐量可提升 5-10 倍

后续可扩展的方向:接入 Slack 或企业微信 webhook,检测完成后自动推送摘要;或把结果写回内容管理系统的对应字段,实现半自动清理。

照着教程做一遍

在本站,用一个真实链接走一遍流程,印象更深。

了解本站 违规举报