搜索抓取

搜索蜘蛛抓取:DNS 解析抖动与多 IP 线路差异的排查顺序

服务器状态码正常,日志里却总有一部分抓取连不上?问题未必在限流,也可能出在 DNS。本文从连接层失败的特征入手,梳理多 A 记录、AAAA 记录、CNAME 链、TTL 与 NS 冗余的排查顺序,并给出修复与长期观察办法。

搜索抓取

搜索蜘蛛抓取:DNS 解析抖动与多 IP 线路差异的排查顺序

抓取日志里出现“同一时段一部分请求成功、一部分连不上”的情况时,很多人的第一反应是限流或防火墙拦截。但在排除 5xx、403 与 robots 规则之后,还有一类更隐蔽的原因:域名解析结果不稳定,或者同一个域名解析出多个 IP,其中只有一部分线路对搜索蜘蛛可达。这类问题不会在服务器访问日志里留下明显痕迹,因为请求根本没到达应用层。

一、先看清失败发生在哪一层

把失败请求按“有没有到达服务器”分成两类,能省掉大量无效排查。

  • 连接层失败:表现为连接超时、连接被重置、TLS 握手失败,没有 HTTP 状态码。服务器访问日志里往往完全没有这条记录。
  • 响应层失败:有明确状态码,比如 503、403、502。这类要看限流、WAF 与后端服务状态。

如果同一个 URL 在几分钟内被反复尝试,有时成功有时失败,且失败集中在连接阶段,那么优先怀疑线路与解析,而不是抓取配额。

二、解析层常见的几种情况

  • 多 A 记录里有一条指向已下线的旧机房,或指向尚未放行的 IP,健康检查没有及时摘除。
  • CNAME 链过长,中间某一跳解析耗时明显偏高,偶尔超时。
  • 域名发布了 AAAA 记录,但服务器未监听 IPv6,蜘蛛走 IPv6 直接失败,而 IPv4 请求正常。
  • TTL 设置过短,解析结果在短时间内频繁变化,抓取窗口内拿到的 IP 不一致。
  • 权威 NS 只有一个,或 NS 与主站部署在同一台机器上,机房抖动时解析整体不可用。
  • 智能解析按来源返回不同节点,而其中某个节点对特定区域或特定网络不友好。

三、按这个顺序排查

  1. 用多个公共解析器分别查询 A、AAAA、CNAME,对比结果是否一致,记录差异出现的频率。
  2. 对每个返回的 IP 逐一做连通性测试:端口是否可达、TLS 握手是否正常、返回头是否符合预期。
  3. 确认 AAAA 记录是否有对应的监听服务,没有明确支持就暂时不要发布。
  4. 查看 CNAME 链长度与每一跳的解析耗时,去掉不必要的中间层。
  5. 检查 TTL 设置与 NS 冗余,避免解析记录频繁变更或单点解析。
  6. 与 CDN 或负载均衡侧核对节点健康检查与自动摘除逻辑,确认故障 IP 是否被排除在调度之外。

四、修复与长期观察

修复的思路不是“把所有 IP 换一遍”,而是让调度结果稳定且可解释。

  • 下线长期不可达的 IP,多 IP 场景必须配合健康检查自动摘除。
  • TTL 保持适度,不要在短时间内反复调整,变更期间保留旧 IP 一段时间再回收。
  • 把抓取日志按解析到的 IP 分组统计成功率,这样线路问题会以“某一 IP 成功率明显偏低”的形式暴露出来,而不是被整体平均值掩盖。
一个实用的区分方法:如果失败请求在服务器日志中完全查不到,优先查 DNS 与网络;如果日志里有记录但状态码异常,再去查限流、WAF 与后端服务。两类问题的处理顺序不要混在一起。

URL 发现和抓取路径的维护,最终都要落在“蜘蛛能不能稳定地连上并拿到内容”这件事上。解析层的抖动看起来琐碎,但它影响的是每一次握手的成功率,长期累积下来会明显影响新入口被发现的速度。把解析结果、健康检查与日志统计三件事固定成例行检查项,比事后逐条翻日志要省力得多。