做蜘蛛池和站点运营时,经常遇到一种情况:自己用浏览器打开入口页,目标链接整整齐齐;但搜索蜘蛛的抓取日志里,这个页面要么返回 403、503,要么返回一个内容完全不同、里面没有任何目标链接的页面。多数时候问题不在入口页本身,而在它前面那一层——CDN、WAF、防火墙或安全插件。
为什么会出现“你看到 A,蜘蛛看到 B”
CDN 和 WAF 的判断依据通常是 IP 归属、ASN、UA、请求频率、请求头完整度、Cookie 有无等。搜索蜘蛛的 IP 段是公开的,但这些中间层如果规则配得比较粗,很容易把它们当成可疑的自动化流量处理。常见表现包括:
- 直接返回 403、406 或 503,蜘蛛拿不到任何 HTML;
- 返回一个人机校验页或等待跳转页,里面没有目标链接;
- 返回 200,但内容是精简版或缓存旧版本,目标链接被裁掉;
- 只放行部分 IP 段,其他蜘蛛节点被拦,抓取时有时无。
还有一种情况是回源失败:CDN 缓存里存的是错误页,你本地刷新看到的是新版本,蜘蛛拿到的却是那份旧的缓存副本。
怎么确认是不是中间层的问题
- 先看原始服务器日志。如果源站日志里根本没有蜘蛛的请求记录,说明请求在到达源站之前就被拦掉了,问题大概率在 CDN/WAF 这一层。
- 对比 CDN 后台的访问日志和源站日志,看两边记录的搜索蜘蛛请求数量是否对得上。
- 确认蜘蛛来源的真实性。不要只看 UA,UA 可以随意伪造;用反向解析或官方公布的 IP 段核对来源 IP,再判断是不是被误拦。
- 检查缓存策略。入口页这类需要及时反映链接变化的页面,缓存时间过长,就会把旧版本反复喂给蜘蛛。
- 用搜索平台自带的抓取测试工具查看“实际返回”的 HTML,而不是你自己浏览器里看到的 HTML。
调整时的几个注意点
- 别整站无条件放行。按 IP 段放行通常比按 UA 放行更可靠,但建议保留基本的频率限制,别为了放行把防护完全关掉。
- 给入口页单独设缓存规则。可以短缓存甚至不缓存,其余静态资源照旧处理。
- 别用 JS 校验后再放行。多数搜索蜘蛛不执行这类校验,结果就是永远看不到内容。
- 不要对不同来源返回差异过大的页面。即使出于防护目的,也要保证蜘蛛拿到的是包含目标链接的正常页面。
判断标准可以很简单:把蜘蛛当成普通访客对待。它拿到的 HTML,应该和你自己访问时基本一致。
小结
入口页“蜘蛛看不到”,未必是链接写法的问题,先确认请求有没有顺利穿过 CDN、WAF 这一层。排查顺序建议是:源站日志 → 中间层日志 → 缓存版本 → 放行与限速规则。把中间层的误拦和旧缓存处理掉之后,再去看 URL 发现和抓取量的变化,才不容易被错误的排查方向带偏。