蜘蛛池入口页搭好之后,有时会遇到一个让人摸不着头脑的情况:日志里能看到蜘蛛的 UA,但返回的状态码是 403、429、503,或者被跳到一个验证页面。入口页本身没问题,内容也正常,问题往往出在入口页和蜘蛛之间的某一层把请求拦下了。这类问题不排查清楚,后面做再多内容调整都很难看到效果。
先确认是不是被拦:看响应码和响应体
不要只看到访问日志里有蜘蛛记录就认为抓取正常。真正要看的是响应状态码和响应体。用 curl 带蜘蛛 UA 请求入口页,再看返回内容:
- 返回 403、406、429、503:大概率被规则拦下。
- 返回 200,但内容是 JS 挑战页或验证页:被 WAF 的人机校验挡住。
- 返回 301 或 302 到无关域名:可能被 CDN 或安全策略重定向。
- 响应头里出现 cf-ray、x-waf 之类字段:说明请求经过了安全层。
只看访问日志里的 200 不够,有些安全层会先返回 200 再让页面 JS 跳转,日志里看不出异常。
拦截可能发生在哪几层
蜘蛛请求进到源站之前,通常要经过好几层,任何一层都可能拦:
- CDN 与云 WAF:最常见的拦截点,规则包括 UA 黑名单、频率限制、人机校验。
- 云厂商安全组或防火墙:只放行了常用端口,或者对境外 IP 做了限制。
- Nginx 限速模块:limit_req、limit_conn 配置过严,蜘蛛短时间多次请求就被挡。
- iptables 与 fail2ban:把高频访问的 IP 临时封禁,蜘蛛 IP 也可能中招。
- 应用层逻辑:代码里对 UA、Referer、Cookie 做了判断,直接返回空页或 403。
排查顺序:从外到内逐层排除
- 用 curl 从本机请求入口页,记录状态码和响应体大小。
- 换一个干净的出口 IP 再请求一次,对比结果,判断是否 IP 被限。
- 检查 CDN 或 WAF 后台的拦截日志,看是否有对应时间点的拦截记录。
- 在源站直接绑定 hosts 请求,绕过 CDN,确认源站本身是否正常。
- 查看 Nginx 和应用日志,确认请求有没有到达源站。
- 如果源站正常、CDN 有拦截记录,问题就在安全层。
这个顺序的好处是从外到内,先排除最外层的可能,避免一上来就改源站配置。
放行策略:验证过的蜘蛛再放
确认是安全层拦截后,不要直接把所有带蜘蛛 UA 的请求全放行,UA 是可以伪造的。更稳妥的做法是:
- 先做反向解析验证,确认 IP 确实属于对应搜索引擎,再把 IP 段加入白名单。
- 按路径放行:入口页走相对宽松的策略,后台、登录、接口等路径保持严格。
- 调整限速阈值:给蜘蛛单独设一个宽松的限速桶,不要和普通访客共用一个阈值。
- 关闭针对入口页的人机校验,避免蜘蛛拿到挑战页而不是内容。
- 如果 CDN 提供搜索引擎白名单功能,优先用官方名单,再叠加自己的验证。
放行的核心思路是:按已验证的 IP 和路径放,而不是按 UA 字符串放。UA 只是一层容易伪造的标识。
监控与止损
放行之后要留一个观察窗口。建议每天看一眼安全层的拦截统计,重点看入口页路径下 403、429 的比例有没有反弹。如果比例突然升高,先回到排查顺序的前几步,确认是规则误伤还是真的有人在刷。频繁改动规则容易把问题掩盖掉,记录每次调整的时间和结果,后续排查会轻松很多。
几个常见误区
- 只看 UA 就放行:伪造 UA 的请求会一起进来,等于给安全层开了口子。
- 把限速关掉:短期看蜘蛛能抓了,但入口页也更容易被刷,带宽和成本会上去。
- 只查源站日志:被 CDN 拦下的请求根本到不了源站,日志里看不到。
- 一次改太多配置:出了问题分不清是哪一层引起的,建议一次只动一个变量。
蜘蛛池的入口页能不能被正常抓取,很多时候不取决于内容本身,而取决于请求有没有顺利到达。把拦截层排查清楚,再谈内容和链接调整,顺序会更顺。