记录一下那天晚上的排查过程。日志统计显示 Googlebot 一天三万次请求,看着抓取很健康,按 IP 分组后其中一个地址贡献了两万次,全部打在同一个分页参数上。

刚开始盯着「站点缺少对同一地址的缓存,每次请求都真实打到应用」,折腾了半个多小时,排掉了。

排查方向其实有限,先把可能性排一排。分页链接的输出没有收敛,蜘蛛沿着一个入口无限翻页。另一种情况是该 IP 其实是伪造 UA 的采集脚本,不是真蜘蛛。

还有一种情况,分页总数计算有误,翻到最后一页还能继续生成新地址。

动手时先按 IP 统计请求集中度

awk '$0~/Googlebot/{print $1}' access.log | sort | uniq -c | sort -rn | head

再往下看这个 IP 请求的地址分布

grep '47.98.' access.log | awk '{print $7}' | sort | uniq -c | sort -rn | head

接着核对官方网段确认是否为真蜘蛛

curl -s https://developers.google.com/static/search/apis/ipranges/googlebot.json | grep -c '47.98'

给分页加上限并封掉伪造来源

if ($args ~ "page=([2-9][0-9]{2,})") { return 410; }

怎么算真的好了,看的是同一批现象。单 IP 请求占比从七成降到 5% 以下,分页抓取收敛在合理范围,应用侧的无效请求同步减少。

这里还有个坑。抓取总量健康不代表抓取结构健康,先看集中度再看总量,很多异常都藏在单个 IP 里。报错文案容易误导,真正的原因往往在相邻那一层的日志里。

作者 9823189