统计不同搜索引擎蜘蛛抓取占比,唯一可靠的方法是从 Web 服务器访问日志里按 User-Agent(UA,浏览器/爬虫自我声明的身份字符串)关键字识别蜘蛛身份,再用「某蜘蛛请求数 ÷ 全部蜘蛛请求数」算出比例。不需要 IP 反查,不需要第三方工具,一条 awk 管道就能出结果。
蜘蛛抓取占比的分子和分母分别是什么?
结论:分子是「某个搜索引擎蜘蛛在统计周期内的请求数」,分母是「所有搜索引擎蜘蛛的请求数之和」,两者都不包含真实用户流量和 SEO 工具爬虫。
先把日志里的请求分成三类:真人流量(UA 含 Mozilla/Chrome/Safari 且不含 spider/bot)、搜索引擎蜘蛛(Baiduspider、Googlebot、bingbot 等)、第三方工具与 AI 爬虫(AhrefsBot、SemrushBot、GPTBot、ClaudeBot 等)。分母通常只取第二类,因为第三方工具的抓取量经常比搜索引擎还大,混进去会把占比算歪。
统计周期建议固定为完整自然日或 7 天,按 UTC+8 对齐;不同天数的日志混在一起,占比没有可比性。同时明确是「按请求数算」还是「按 URL 去重数算」,两种口径结论可能差一倍以上。
怎么从日志里识别不同搜索引擎的蜘蛛?
结论:只认 UA 里的蜘蛛关键字,不认 IP,因为蜘蛛出口 IP 段会变,而 UA 关键字多年稳定。
常见搜索引擎蜘蛛的 UA 关键字如下(匹配时统一转小写):
| 搜索引擎 | UA 关键字(小写) |
|---|
| 百度 | baiduspider(含 baiduspider-render、baiduspider-image) |
| 谷歌 | googlebot(含 googlebot-image、google-inspectiontool) |
| 必应 | bingbot |
| 搜狗 | sogou |
| 360 | 360spider、haosouspider |
| 神马(移动端) | yisouspider |
| 字节/头条 | bytespider |
| 华为 | petalbot |
| Yandex | yandexbot |
注意两个坑:一是部分请求是伪造 UA 的假蜘蛛,如果占比异常高,需用 nslookup 反查 IP 域名是否为 *.baidu.com、*.googlebot.com 验证;二是 Googlebot 还有 GoogleOther、Storebot-Google 等变体,做 Google 总量统计时要一并计入。
用一条 awk 命令算出各蜘蛛抓取占比
结论:Nginx 默认 combined 日志格式下,UA 位于按双引号切分的第 6 个字段,用下面这条管道就能直接输出计数和百分比:
grep -ioE 'baiduspider|googlebot|bingbot|sogou|360spider|yisouspider|bytespider|petalbot|yandexbot' access.log \
| tr 'A-Z' 'a-z' \
| sort | uniq -c | sort -rn \
| awk '{c[$2]=$1; t+=$1} END{for(k in c) printf "%-14s %8d %6.2f%%\n", k, c[k], c[k]*100/t}'
输出形如 baiduspider 12480 46.31%。如果日志是 Apache 或 CDN 导出格式,先确认 UA 所在字段序号,把 -F'"' '{print $6}' 换成对应位置即可。
想看趋势就把周期拆到天,在管道里加一层日期切分:
awk -F'"' '{split($6,u," "); print substr($1,2,11), u[1]}' access.log | sort | uniq -c
为什么占比统计一定要按 URL 去重并剔除 4xx/5xx?
结论:不去重会把同一页面被反复抓取的次数放大,导致「抓取占比」变成「骚扰占比」,无法反映真实抓取覆盖。
先按状态码过滤,只看 2xx。百度、Google 对 404 页面的高频重试会让某个蜘蛛请求数虚高,实际有效抓取可能只有一半。命令上可以在 grep 前加 awk '$9 ~ /^2/'(Nginx 中状态码是第 9 字段)。
再做 URL 去重,统计「被不同蜘蛛抓过的唯一 URL 数」:
grep -i 'baiduspider' access.log | awk -F'"' '{split($2,r," "); print r[2]}' | sort -u | wc -l
把每个蜘蛛的唯一 URL 数放回占比公式,得到的是「抓取覆盖占比」,它比请求数占比更能说明谁在真正收录你的内容。经验上,请求数占比高但唯一 URL 占比低的蜘蛛,通常是在反复抓少数几个页面,属于抓取预算浪费。
统计出来的占比,多少算正常?
结论:没有统一标准值,但可用经验区间做初筛——中文站点里百度蜘蛛通常占搜索引擎蜘蛛总量的 40%–70%,Googlebot 10%–30%,bingbot 5%–15%,搜狗、360、神马各 1%–10%。
判断异常看三点:一是某个蜘蛛占比突然从 30% 掉到 5% 以下,多半是 robots.txt 误封、服务器频繁返回 5xx 或站点被降权;二是第三方工具与 AI 爬虫(AhrefsBot、GPTBot)占比超过搜索引擎蜘蛛总和,说明日志里有效抓取被稀释,应先在 robots.txt 里做限流;三是某蜘蛛唯一 URL 数占总 URL 数比例长期低于 20%,说明它在反复抓同一批页面,需要检查内链结构和 sitemap 更新频率。
落地建议:把上面的命令写成每日定时脚本,按天落库这四个指标——请求数、唯一 URL 数、2xx 占比、各蜘蛛占比,连续观察 14 天建立自己的基线,比套用任何外部参考值都准。