入口页铺好、链接也放出去了,日志里却始终只有零星几次抓取,很多人第一反应是页面质量不够。实际上,不少抓取量上不去的情况,问题出在页面之前的那一层——WAF、CDN 防护规则或者服务器防火墙,把蜘蛛挡在了门外,而你在源站日志里什么都看不到。
先分清「没来」还是「被挡」
这两种情况的排查方向完全不同,先看现象再动手:
- 站点日志里完全没有对应 IP 的请求记录:大概率是蜘蛛没发现入口,或者请求在到达源站前就被拦掉了,这时要看 CDN/WAF 日志而不是源站日志。
- 有请求,但状态码是 403、406、429、503:典型的拦截或限速,属于「硬拦」。
- 状态码是 200,但返回内容是验证码页、空白页或一段 JS 挑战脚本:属于「软拦」,最容易被误判成页面正常。
常见的误伤配置
- 默认规则集过严:部分防护模板会把机房 IP 段、无 Referer 请求、非常规 UA 直接判为风险。
- IP 频率限制:蜘蛛抓取往往来自同一批 IP,短时间高频请求很容易触发限速,入口页数量一多就更明显。
- JS 挑战 / 五秒盾:对所有访客开启人机校验,蜘蛛拿不到校验结果,只能停在挑战页。
- 地域封禁:为了挡掉某些地区的垃圾流量,顺手把蜘蛛常出现的 IP 段也封了。
- UA 白名单没做校验:也有站点反过来,只凭 UA 就放行,结果被大量伪造 UA 的请求刷爆,最后干脆一刀切全拦。
怎么排查
- 把源站日志和 CDN/WAF 日志按时间对齐,看请求是压根没到源站,还是到了之后被拦。
- 用 curl 带上蜘蛛的 UA 请求入口页,看返回的状态码和内容,注意跟随跳转,确认有没有被 302 到验证页。
- 查看 WAF 拦截明细,重点看被拦请求的 UA、IP 段和触发的规则名。
- 用不同 IP、不同频率各测一次,区分是规则拦截还是频率限制。
判断拦截最直接的标准不是状态码好不好看,而是蜘蛛实际拿到的 HTML 里有没有你放的链接。返回 200 但正文是挑战脚本,对蜘蛛来说等同于空页。
调整时把握几个原则
- 白名单做三重校验:UA、反向 DNS、IP 段至少对得上两项再放行,只认 UA 等于没有防护。
- 对已验证的蜘蛛放开频率限制,对未验证流量继续限速,而不是整体关掉。
- 关闭针对已知蜘蛛的 JS 挑战,让它们直接拿到静态 HTML。
- 保留可排查的返回:真要拦,返回明确的 403 并记录日志,比返回空白 200 好得多。
几个容易踩的坑
为了放蜘蛛把 WAF 整个关掉,是最常见也最亏的做法。防护和放行并不冲突,冲突的是一刀切的思路。另外,换 CDN、换服务器、改解析线路之后,原来的白名单规则不一定跟着迁移,需要重新验证一遍。还有一点容易被忽略:入口页数量增加后,抓取频率自然上升,原来够用的限速阈值可能就不够用了,每次扩量后都值得回头看一眼拦截日志。
把这一层理顺之后,再去讨论页面质量、链接结构才有意义。否则入口页做得再细,蜘蛛连门都没进。