先说结论:入口页本身被 CDN 或 WAF 拦下来,搜索蜘蛛看到的就不是你的 HTML,而是拦截页、验证页,或者干脆是 403、429 响应。链接都读不到,自然谈不上顺着发现目标 URL。这类问题的隐蔽之处在于,你在浏览器里打开入口页一切正常,服务器日志里也可能只有零星几条记录,很容易被误判成“蜘蛛根本不来”。
拦截发生时,搜索蜘蛛实际拿到的是什么
常见的几种结果:
- 返回 403、406、429 等状态码,正文是一段很短的拒绝提示;
- 返回 200,但正文是“请稍后重试”“正在验证您的浏览器”之类的中间页;
- 返回一段 JavaScript 挑战脚本,需要浏览器执行后才跳转,蜘蛛通常不会执行;
- 时好时坏,同一个入口页有时正常返回、有时被拦,表现为抓取量忽高忽低。
其中最容易被忽略的是第二种。状态码正常,但内容并不是你写的入口页,排查时如果只看状态码就会漏掉。
对 URL 发现的影响
搜索蜘蛛的抓取流程大致是:请求页面 → 拿到 HTML → 解析出链接 → 加入待抓取队列。第一步失败,后面全部断掉。具体差别在于:
- 明确的拒绝状态码:这次抓取算失败,蜘蛛可能短期内降低对入口页的抓取频率,等一段时间再试;
- 200 的验证页:更麻烦,蜘蛛会把验证页当成入口页的真实内容,页面里没有目标链接,于是不会有任何后续抓取,而且它并不认为这次是失败;
- 间歇性拦截:蜘蛛能发现一部分链接,但发现速度不稳定,你很难从数据上判断到底是入口页质量的问题,还是拦截导致的。
怎么判断是不是被拦了
- 用命令行按搜索蜘蛛的 UA 直接请求入口页,看返回码和正文,不要只用浏览器看;
- 换几个 UA 和不同来源 IP 各请求一次,确认拦截是不是只针对特定 UA 或网段;
- 登录 CDN / WAF 后台看拦截日志,一般能看到命中规则、触发时间和来源 IP,比对一下是不是搜索蜘蛛的 IP 段;
- 查服务器访问日志里搜索蜘蛛请求的响应码和响应体大小,响应体明显偏小的,多半返回的不是真实页面;
- 把同一入口页放在一个没有 WAF 的环境里对比,看抓取记录是否明显变多。
处理思路
方向无非两条:要么让搜索蜘蛛的请求不被拦,要么别把入口页放在容易触发拦截的环境里。
- 在白名单里放行已知的搜索蜘蛛 UA 和官方公布的 IP 段,注意不要只按 UA 放行,UA 可以伪造,最好 UA 加 IP 段一起判断;
- 关掉针对搜索蜘蛛的 JavaScript 挑战和频率限制,把“人机验证”类规则从入口页路径上排除;
- 如果规则一时改不了,把入口页迁到规则宽松的独立子域或独立服务器上,只把真正需要防护的业务放在 WAF 后面;
- 改完规则后重新用命令行验证一遍,确认返回的是完整 HTML,而不是验证页。
提示:拦截问题最好先看 WAF 日志再动手改配置,否则容易把正常防护一起关掉。另外,入口页恢复可访问并不代表之前被拦的那批 URL 会立刻被抓,蜘蛛需要重新回访,给一点时间观察抓取记录的变化。
最后提醒一句,入口页只是被发现的一个环节,解决拦截能保证“蜘蛛能读到链接”,但不等于目标 URL 一定被收录。抓取、索引、排名是三个独立的阶段,把拦截修好只是把第一道门打开。