蜘蛛访问一个入口页,第一步不是发 HTTP 请求,而是做 DNS 解析。解析这一步出问题,后面所有优化都无从谈起。很多“蜘蛛不来”“抓取量突然掉”的情况,最后追到 DNS 上,只是平时不容易注意到。
解析失败时,蜘蛛看到的是什么
当 DNS 解析失败,蜘蛛得到的是无法解析域名,通常不会像浏览器那样弹提示,而是直接记录一次失败。失败次数多了,抓取频次会下降,甚至暂停对该域名的访问。和 404、500 不同,这类失败不会出现在页面状态码统计里,需要从抓取日志的失败原因或 DNS 监控里看。
常见的失败形态有几种:
- 解析超时:DNS 服务器响应慢,蜘蛛在超时时间内拿不到结果。
- NXDOMAIN:域名或子域名不存在,通常是拼写错误、记录被删或解析商侧未生效。
- SERVFAIL:解析商故障、DNSSEC 配置错误等。
- 多地解析不一致:部分地区能解析,部分地区不能,蜘蛛来自不同节点时表现不同。
TTL 不是越短越好,也不是越长越好
TTL 决定解析记录在递归 DNS 里的缓存时间。蜘蛛背后的递归解析节点也会遵守这个缓存。
TTL 设得很短,比如 60 秒,好处是切换 IP 或换服务器时生效快,坏处是解析请求量变大,解析商如果限速或抖动,反而更容易出现间歇性失败。TTL 设得很长,比如 24 小时,解析压力小,但一旦要换 IP、下线入口域名,旧记录会在缓存里留很久,蜘蛛可能继续访问已经不可用的地址。
比较稳妥的做法是按用途区分:
- 长期稳定的入口域名,TTL 可以设 600 到 3600 秒,减少解析波动。
- 正在切换或准备退役的域名,提前把 TTL 调低,比如 300 秒,等切换完成、观察几天后再调回。
多 IP 与 CNAME 链路的注意点
有些蜘蛛池会给一个入口域名配多个 A 记录,做简单的轮询或容灾。这本身没问题,但要注意几点:
- 多个 IP 最好都能正常响应,不要有“挂着的旧 IP”。蜘蛛解析到不可用 IP 后,会记为一次失败。
- 不同 IP 返回的内容如果有明显差异,可能造成蜘蛛对同一 URL 看到不同版本,增加判断成本。
- CNAME 链路不要太长,层层跳转会增加解析时间和失败概率。能用 A 记录直接指向的地方,不必绕 CNAME。
如果入口域名数量多,建议把“解析是否正常”纳入日常巡检,而不是等抓取量掉了才回头查。
怎么排查 DNS 层面的抓取问题
可以从三个方向入手:
- 用 dig 或在线 DNS 查询工具,分别查 A、AAAA、CNAME 记录,确认返回是否符合预期。
- 用多个地区的解析节点查询,看是否存在地域差异。蜘蛛来自不同网络,单点查询正常不代表全局正常。
- 对照抓取日志中的失败记录。如果失败集中在某些时间段或某些入口域名,且页面本身可用,就要怀疑解析。
另外,IPv6 记录如果配置了但实际不可用,也可能让支持 IPv6 的蜘蛛优先尝试 AAAA 记录然后失败。要么把 AAAA 配好,要么干脆不配。
和蜘蛛池运营有关的几个小建议
- 入口域名尽量使用同一家稳定的解析商,批量管理时改记录更快,也便于统一监控。
- 解析商的控制台告警、到期提醒要打开,域名过期或解析被暂停往往没有任何页面层信号。
- 换 IP、换服务器前,先降 TTL,再切换,再观察抓取日志,最后恢复 TTL。
- 不要把 DNS 解析和 HTTP 状态混在一起判断。解析失败的日志里通常没有状态码,看到大量“无状态”失败时,先查解析。
DNS 属于基础设施层,平时不出问题就没人注意,一出问题往往影响所有入口页。把它纳入巡检和切换流程,比出了事再临时救火省力得多。