HEAD请求比GET更高效检测死链,因其仅获取响应头、跳过响应体传输,大幅降低带宽与耗时;但需fallback至get处理405/501,设timeout=(3,3)、allow_redirects=False,并添加User-Agent头防拦截。

用 requests 发起 HEAD 请求比 GET 更高效
检测死链接本质是判断 URL 是否返回 200/3xx 状态码,而非下载全部内容。用 requests.head() 能跳过响应体传输,大幅降低带宽和耗时——尤其在扫描大量内网地址(如 http://192.168.1.10/admin、http://intranet/api/v1/status)时效果明显。
但要注意:部分内网服务(如某些老旧 IIS 或自定义 Web 服务)不支持 HEAD 方法,会直接返回 405 或 501。此时需 fallback 到 requests.get(timeout=3, stream=True) 并立即关闭连接,避免读取整个响应体。
- 始终设置
timeout=(3, 3)(连接+读取超时),防止卡在无响应主机上 - 禁用重定向(
allow_redirects=False),否则 302 会被自动跳转,掩盖原始状态 - 添加
headers={'User-Agent': 'intranet-link-checker'},避免被 WAF 或反爬中间件拦截
批量扫描时如何处理内网 DNS 和私有域名解析失败
内网常见情况:URL 中含未加入 DNS 的主机名(如 http://hr-app.local)、或仅在 hosts 文件中定义的别名。Python 默认调用系统 resolver,若解析失败会抛出 requests.exceptions.ConnectionError: Name or service not known,而非 HTTP 错误。
解决方法不是硬编码 IP,而是提前做 DNS 预检或捕获异常分类处理:
立即学习“Python免费学习笔记(深入)”;
- 用
socket.gethostbyname()单独测试域名可达性,失败则标记为 “DNS_UNRESOLVED” - 对已知私有域(如
.local、.intra),可预先加载本地/etc/hosts(Linux/macOS)或C:\Windows\System32\drivers\etc\hosts(Windows)并构建映射字典 - 在
requests中通过proxies={'http': '', 'https': ''}清空代理,防止公司全局代理干扰内网直连
识别真实死链的关键状态码与边界情况
不能只把非 200 当作死链。内网服务常返回非标准但可用的状态码,例如:
-
401 Unauthorized或403 Forbidden:服务存活,只是权限不足 —— 属于“活链”,不应归为死链 -
404 Not Found:需结合路径判断 ——/healthz返回 404 是问题,但/old-api/deprecated可能是预期行为 -
502 Bad Gateway/503 Service Unavailable:上游服务宕机,属于临时性故障,建议标记为 “UNSTABLE” 而非 “DEAD” - 空响应、ConnectionResetError、SSLError(内网自签名证书):这些才是典型死链信号,应统一归类为 “CONNECTION_FAILED”
建议用字典映射状态码到分类:{200: 'OK', 401: 'AUTH_REQUIRED', 404: 'NOT_FOUND', 503: 'SERVICE_DOWN', ...},后续按需过滤。
并发控制与日志输出要适配内网环境
内网交换机或老旧服务器往往对并发连接敏感。盲目用 asyncio 或线程池开 100 协程扫全段 IP,容易触发端口限速、TCP RST 或防火墙丢包。
实操建议:
- 用
concurrent.futures.ThreadPoolExecutor(max_workers=5)控制并发数,5 是多数千兆内网安全起点 - 每完成一个 URL,立刻写入 CSV 或 JSONL(每行一个 JSON 对象),避免内存积压;字段至少含:
url、status_code、reason、elapsed_ms、error_type - 对超时或连接失败的 URL,重试 1 次(间隔 1 秒),但不重试 4xx —— 它们是确定性响应
- 加
logging.getLogger().setLevel(logging.WARNING),屏蔽 requests 的 INFO 日志,防止刷屏
真正麻烦的是那些“半死不活”的服务:响应极慢(>10s)、偶发 500、HTTPS 握手卡住。这类需要单独加超时熔断和统计频次,不是一次脚本就能覆盖全貌。


















