蜘蛛池知识

蜘蛛池入口页被 WAF 拦住了?403、验证码页和空 200 是三个信号

入口页铺好、链接发出去,抓取量却一直上不去,问题未必在页面本身。本文梳理 WAF、CDN 与防火墙误伤蜘蛛的几种典型表现——日志里查不到请求、返回 403、以及最容易被忽略的「200 空页」,并给出排查顺序与白名单、限速的调整思路。

蜘蛛池知识

蜘蛛池入口页被 WAF 拦住了?403、验证码页和空 200 是三个信号

入口页铺好、链接也放出去了,日志里却始终只有零星几次抓取,很多人第一反应是页面质量不够。实际上,不少抓取量上不去的情况,问题出在页面之前的那一层——WAF、CDN 防护规则或者服务器防火墙,把蜘蛛挡在了门外,而你在源站日志里什么都看不到。

先分清「没来」还是「被挡」

这两种情况的排查方向完全不同,先看现象再动手:

  • 站点日志里完全没有对应 IP 的请求记录:大概率是蜘蛛没发现入口,或者请求在到达源站前就被拦掉了,这时要看 CDN/WAF 日志而不是源站日志。
  • 有请求,但状态码是 403、406、429、503:典型的拦截或限速,属于「硬拦」。
  • 状态码是 200,但返回内容是验证码页、空白页或一段 JS 挑战脚本:属于「软拦」,最容易被误判成页面正常。

常见的误伤配置

  • 默认规则集过严:部分防护模板会把机房 IP 段、无 Referer 请求、非常规 UA 直接判为风险。
  • IP 频率限制:蜘蛛抓取往往来自同一批 IP,短时间高频请求很容易触发限速,入口页数量一多就更明显。
  • JS 挑战 / 五秒盾:对所有访客开启人机校验,蜘蛛拿不到校验结果,只能停在挑战页。
  • 地域封禁:为了挡掉某些地区的垃圾流量,顺手把蜘蛛常出现的 IP 段也封了。
  • UA 白名单没做校验:也有站点反过来,只凭 UA 就放行,结果被大量伪造 UA 的请求刷爆,最后干脆一刀切全拦。

怎么排查

  1. 把源站日志和 CDN/WAF 日志按时间对齐,看请求是压根没到源站,还是到了之后被拦。
  2. 用 curl 带上蜘蛛的 UA 请求入口页,看返回的状态码和内容,注意跟随跳转,确认有没有被 302 到验证页。
  3. 查看 WAF 拦截明细,重点看被拦请求的 UA、IP 段和触发的规则名。
  4. 用不同 IP、不同频率各测一次,区分是规则拦截还是频率限制。
判断拦截最直接的标准不是状态码好不好看,而是蜘蛛实际拿到的 HTML 里有没有你放的链接。返回 200 但正文是挑战脚本,对蜘蛛来说等同于空页。

调整时把握几个原则

  • 白名单做三重校验:UA、反向 DNS、IP 段至少对得上两项再放行,只认 UA 等于没有防护。
  • 对已验证的蜘蛛放开频率限制,对未验证流量继续限速,而不是整体关掉。
  • 关闭针对已知蜘蛛的 JS 挑战,让它们直接拿到静态 HTML。
  • 保留可排查的返回:真要拦,返回明确的 403 并记录日志,比返回空白 200 好得多。

几个容易踩的坑

为了放蜘蛛把 WAF 整个关掉,是最常见也最亏的做法。防护和放行并不冲突,冲突的是一刀切的思路。另外,换 CDN、换服务器、改解析线路之后,原来的白名单规则不一定跟着迁移,需要重新验证一遍。还有一点容易被忽略:入口页数量增加后,抓取频率自然上升,原来够用的限速阈值可能就不够用了,每次扩量后都值得回头看一眼拦截日志。

把这一层理顺之后,再去讨论页面质量、链接结构才有意义。否则入口页做得再细,蜘蛛连门都没进。