问题出现得很突然,日志倒是留得挺全。日志里 HEAD 请求占 60%,全部来自同一个爬虫 UA,正文页的 GET 请求一周只有两千次,新内容几乎没被读。

刚开始盯着「HEAD 请求也计入抓取频次,挤占了正文抓取」,折腾了半个多小时,排掉了。

真正麻烦的地方在于,几个原因的现象几乎一样。HEAD 探测不需要响应体,成本低所以被大量使用。少数情况下是站点对 HEAD 与 GET 返回了不同的内容长度,引发反复探测。

还有一种情况,响应头里的 Last-Modified 不稳定,每次探测都像新内容。

先按方法统计请求占比

awk '$6 ~ /HEAD/{h++} END{print h, NR, h/NR}' access.log

再往下核对 HEAD 与 GET 的响应头差异

curl -sI https://www.example.com/post/1 | grep -i -E 'content-length|last-modified'

末了把 HEAD 请求排除在日志统计之外单独看

awk '$6 !~ /HEAD/' access.log | wc -l

怎么算真的好了,看的是同一批现象。修好响应头后 HEAD 请求占比降到 8%,正文页的抓取量回升到每天三千条以上。

HEAD 占高比例通常说明响应头在两个方法上不一致,先对齐响应头,再谈抓取频次。线上能稳定复现的问题都不算难,难的是只在大流量下才出现的那种。

作者 9823189