蜘蛛池做的是把 URL 摆到蜘蛛可能经过的位置,但蜘蛛最终能不能打开页面、拿到什么状态码,取决于从 DNS 解析到源站返回这一整条链路。CDN、缓存层、WAF、负载均衡,任意一层出问题,前面做的投放都会被削弱,而且往往从蜘蛛池这一侧看不出来。
蜘蛛访问页面时,中间会经过哪些层
一次抓取大致会经过:DNS 解析、CDN 边缘节点、可能存在的 WAF 或访问防护、负载均衡、源站应用。搜索引擎蜘蛛走的是和普通访客基本相同的链路,不会因为 UA 是蜘蛛就自动绕开。因此,如果这条链路只对“看起来像真人”的请求友好,蜘蛛就容易吃闭门羹。
CDN 缓存:命中不回源意味着什么
缓存命中时,蜘蛛拿到的是边缘节点上的副本,源站发生了什么变化它并不知道。以下几个情况比较常见:
- 缓存时间过长:新投放的 URL 第一次被访问时可能拿到旧内容,或者旧状态码。
- 404 被缓存:部分配置会把错误页也缓存下来,后来页面已经恢复正常,蜘蛛看到的仍是 404。
- 跳转被缓存:301、302 一旦被边缘节点记住,后续再想改回原始状态会比较被动。
一个相对稳妥的做法是:投放用的目录、入口页这类 HTML 文档设置较短的缓存时间,或者直接不缓存 HTML,只缓存静态资源。这样蜘蛛每次来访都能看到较新的状态。
WAF 与频率限制
防护层本意是挡异常流量,但规则写得粗,蜘蛛也会被一起挡掉。常见的三类:
- 频率阈值过低:蜘蛛短时间内并发抓取多个 URL,触发限速后返回 403 或 429。
- 特征规则:把非浏览器 UA、缺少某些请求头的访问直接判为异常。
- 验证挑战页:JS 挑战或验证码页面需要执行脚本才能通过,蜘蛛不执行 JS,通常直接卡在这里。
如果确实需要放行,建议以已经验证过的蜘蛛 IP 段为主要依据,配合 UA 做二次判断,不要只凭 UA 放行,因为 UA 本身是可以伪造的。
几种容易被忽略的情况
- 站点只保留 HTTPS,但蜘蛛访问 HTTP 版本时被重定向到一个并不存在的地址。
- 防盗链规则把蜘蛛请求里缺失或异常的 Referer 判成盗用。
- 负载均衡的健康检查路径与投放目录重合,互相干扰。
- CDN 只开了部分节点或部分区域,某些来源的蜘蛛根本连不通。
- 缓存预热没做,蜘蛛刚好撞上回源高峰,拿到超时响应。
一套可执行的排查顺序
- 先看访问日志,统计蜘蛛请求的响应码分布,重点关注 403、429、503 的占比,以及是否集中在某个时间段。
- 对同一个 URL,分别用浏览器和蜘蛛 UA 请求一次,对比状态码、响应体和响应头是否一致。
- 检查缓存头的 max-age、s-maxage 设置,确认 HTML 是否被长缓存。
- 在防护层临时放行一小段测试路径,观察抓取是否恢复;如果恢复,问题基本可以定位在防护或缓存规则上。
- 调整规则后维持一段时间,再回看日志,确认响应码分布稳定下来。
投放只是把入口摆好,链路通畅才是前提。与其急着扩大投放量,不如先确认蜘蛛每次来访都能拿到正确、稳定的响应。