蜘蛛来抓取入口頁之前,做的第一件事不是發 HTTP 請求,而是解析域名。這一步在大多數运营者的视野之外,因為它平时几乎不出問题。但一旦 DNS 或 IP 层面出現抖動,表現會相当隐蔽:日誌里看不到 404 或 503,只有连接失敗、超时,或者干脆什么都没有。
蜘蛛有自己的 DNS 缓存
蜘蛛不會每次抓取都重新做一次完整解析。它和浏览器一样,會把域名對應的 IP 缓存一段時間,缓存的依據就是 DNS 记錄的 TTL。這意味着你改了 A 记錄,蜘蛛不一定马上知道。
如果 TTL 是 3600 秒,那最坏情况下,蜘蛛可能在一個小时内仍然去訪問舊 IP。舊 IP 已经下线的情况下,這段時間的抓取全部落空。
多 A 记錄:方便,但也可能让蜘蛛踩空
给一個域名配多條 A 记錄,本意是做负载或冗余,但蜘蛛拿到的地址可能是其中的某一條。
- 如果其中一台机器响應慢或者已经下线,蜘蛛可能正好拿到它,這次抓取就失敗了。
- 多台机器返回的内容不一致,蜘蛛可能把它当成不同的頁面,造成内容判断上的混乱。
- 其中一台只监听 HTTPS 而另一台只有 HTTP,還會牵扯到跳轉和證书的問题。
如果要用多 A 记錄,至少要保證每一條记錄指向的服務器都能獨立、完整地响應蜘蛛的請求,並且内容一致。否則不如只留一條稳定的记錄。
TTL 的取舍
TTL 太長,迁移时切換慢;TTL 太短,解析請求變多,對權威 DNS 是压力,對蜘蛛也不是好事。一個折中的做法是:
- 平时用 600 到 3600 秒之間的值,够稳定也够灵活。
- 計划迁移前,提前一天把 TTL 降到 300 秒甚至更低。
- 等舊 TTL 完全過期之後,再正式切換。
- 切換完成後,观察一段時間再考虑把 TTL 調回去。
CNAME 與 CDN:蜘蛛解析到的是节点,不是源站
接入 CDN 後,蜘蛛解析到的是 CDN 节点的 IP。它並不知道源站在哪,也不關心。所以你在源站上做的很多調整,蜘蛛看到的是节点返回的结果。
常见的解析层問题包括:某些地区的节点回源失敗,返回的頁面和源站不一致;节点缓存了错誤的响應;或者节点在源站不可達时返回了一個預設的错誤頁。這些問题在日誌里往往表現為大面积失敗,而不是單條记錄。
排查时不要只看源站日誌,也要看 CDN 的命中情况。如果源站日誌里没有對應請求,說明請求根本没到源站。
IPv6 與双栈
部分蜘蛛支持 IPv6,也可能優先尝试。如果你的服務器只有 IPv6 地址,而蜘蛛所在环境只能走 IPv4,那么這次抓取會直接失敗。反過来,只监听 IPv4 通常是安全的。
建议的做法是保證 IPv4 始终可達,IPv6 作為补充。不要為了赶技術潮流,把唯一的入口放在 IPv6 上。
解析抖動與超时
DNS 解析本身也可能超时。在蜘蛛的视角里,這表現為连接失敗,或者拿到一個 0 字节的响應。日誌里可能只留下一條含混的记錄,看不出是解析的問题。
如果你用的是自建 DNS 或者一些小众的解析服務,稳定性值得专门观察一下。權威解析的可用性,往往决定了蜘蛛能不能走到你的服務器门口。
換 IP 的實操顺序
- 新 IP 先部署好,用命令行工具或浏览器確認頁面能正常返回。
- 提前降低 TTL,並等待至少一個完整的舊 TTL 周期。
- 切換 A 记錄,观察解析是否已经生效。
- 舊 IP 不要立刻释放,繼續保留一段時間並保持服務可用。
- 翻看蜘蛛日誌,確認訪問已经落到新 IP,再考虑下线舊机器。
几個常见誤区
- 以為改了解析就立刻生效。蜘蛛的缓存和运营者本地的不一样,生效時間取决于 TTL。
- 把 TTL 设成 0 或极短。這會给解析服務和蜘蛛都增加不必要的负担,未必換来更快的收敛。
- 用泛解析把所有子域都指過去。蜘蛛一旦抓到大量相似頁面,容易当成重复内容。
- 多 A 记錄里混入了測試机或废弃机器。這類地址迟早會拖垮某一次抓取。
DNS 是蜘蛛訪問的起点。這里出的問题,在後面的頁面层面完全看不出来,但结果是一样的:蜘蛛没進来。
把 DNS 和 IP 当成入口站基础设施的一部分来维護,不需要多复杂,但需要有意识。记錄 TTL、保留舊 IP、保證多记錄的一致性,這几件事做到位,就已经避開了大部分因解析導致的抓取损失。