⭐ 推荐:社区规则条款 V1.0

蜘蛛爬虫分析中怎么统计不同搜索引擎蜘蛛的抓取占比?

liulian
liulian 归队站长新人站长
发布于 2026-10-14 00:18 ·7 浏览 ·3 回复
内容摘要

统计不同搜索引擎蜘蛛抓取占比,应从Web日志按UA关键字识别,分子为某蜘蛛请求数、分母为所有搜索引擎蜘蛛请求数,排除真人流量和第三方AI工具,固定统计周期并用awk管道计算。

统计不同搜索引擎蜘蛛抓取占比,唯一可靠的方法是从 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
360360spider、haosouspider
神马(移动端)yisouspider
字节/头条bytespider
华为petalbot
Yandexyandexbot

注意两个坑:一是部分请求是伪造 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 天建立自己的基线,比套用任何外部参考值都准。

蜘蛛爬虫分析中怎么统计不同搜索引擎蜘蛛的抓取占比?,本文转载自 GJ站长论坛,原文地址:https://www.gj0.com/thread-1921.html
转载请注明出处,版权归原作者所有。
他们都看过 1 人浏览过
GJ论坛站长
—/ 5暂无评分
还没有评分,来打第一分吧

全部回复 3

周末
周末 新人站长 1楼 2026-10-14 00:40

这条管道跑小日志没问题,但真上生产日志(GB 级、带压缩、UA 被伪造)时有几个地方会翻车,补几条更稳的写法。

第一,grep -oE 会重复计数。 -o 输出的是所有非重叠匹配,如果某条请求的 UA 里同时拼了 bingbot 和 googlebot(假蜘蛛特别爱这么干),这一行会被计两次,分母虚增。稳妥做法是放弃 grep -o,用 awk 单遍扫描,按优先级只归一类:

gawk '{$0=tolower($0);
if($0~/baiduspider/)k="baiduspider";else if($0~/googlebot/)k="googlebot";
else if($0~/bingbot/)k="bingbot";else next;n[k]++}
END{for(k in n)printf "%-14s %8d\n",k,n[k]}' access.log

顺序要按关键字重叠度排,baiduspider 放前面是因为它还有 -render、-image 后缀变体,粗匹配先吃掉。

第二,日志多半是压缩的。 logrotate 之后是 access.log.1.gz,直接用 zgrep/zcat 或者 find . -name 'access.log*.gz' -exec zcat {} + | 合并再统计,否则你统计的只是当天还没归档的那一小段。

第三,口径先跟团队定死。 按请求数还是按 URL 去重,结果能差一倍以上。去重可以加 !seen[$1"|"$7]++ 只统计首次抓取。

最后提醒一个最常被忽略的点:Baiduspider 占比某天突然从 40% 冲到 75% 基本都是伪造 UA,必须反查 IP 域名再正向解析回验;另外 Bytespider、GPTBot 这些到底算不算“搜索引擎”,建议在团队内写进统计口径文档,不然不同人跑出来的环比数字永远对不上。

域名注册
域名注册 版主归队站长新人站长 👑年卡会员 #1428 2楼 2026-10-14 00:53
周末:这条管道跑小日志没问题,但真上生产日志(GB 级、带压缩、UA 被伪造)时有几个地方会翻车,补几条更稳的写法。 **第一,`grep -oE` 会重复计数。*…

这条补充基本把生产环境的坑补齐了,但优先级 if 链和去重键这两处再收一下,占比才真对得上。

一是别对整行做关键字匹配。$0~/baiduspider/ 会把 URL、Referer 里带关键字的请求也算进来——随便有人访问 /baiduspider-test 就被计一次。先切出 UA 再看:split($0,a,"\""); ua=tolower(a[6]),然后只匹配 ua。顺带一提,tolower($0) 会把整行重建、触发重新分词,GB 级日志下开销不小,用变量接更划算,前面加 LC_ALL=C。

二是分母。if 链只认 baidu/google/bing 三种,其余 next 掉,做百分比时分母天然偏小。建议分两步:先判定 ua~/spider|bot|crawler/ 计入总蜘蛛数,再在蜘蛛集合内归类,剩下归 other 桶输出,这样新增 Sogou、PetalBot 时不用改分母逻辑。

三是 !seen[$1"|"$7]++,$7 在默认 combined 下确实是路径,但一旦加了 $http_x_forwarded_for 或自定义 log_format,字段就整体错位,去重会静默失效。保险点用 split($0,a,"\"") 取请求行当键。另外按 IP+URL 去重会把同一爬虫不同出口 IP 算成多次,要按 URL 口径就直接用 URL 做键。

补充一个辅助判据:正规蜘蛛 UA 里通常带说明页链接(+http://www.google.com/bot.html),伪造的往往只抄了个名字,配合反查 IP 一起用,误判率能降不少。

chinaz
chinaz 归队站长新人站长 #1438 3楼 2026-10-14 01:12
域名注册:这条补充基本把生产环境的坑补齐了,但优先级 if 链和去重键这两处再收一下,占比才真对得上。 一是别对整行做关键字匹配。`$0~/baiduspider/` …

三点都站得住,尤其「先切 UA 再匹配」和「分母两段式」,我只在「怎么切出 UA」这一格上再拧紧一格。

硬编码 a[6] 和整行匹配是同一个病因——把字段位置当常量。combined 格式下 UA 是最后一个引号字段,所以用 n=split($0,a,"\""); ua=tolower(a[n-1]) 更稳:既避开 $0~/baiduspider/ 把 URL、Referer 误伤的坑,又在 log_format 尾部追加 $http_x_forwarded_for、$request_time 时不会静默错位——你担心的那个场景正好被这句兜住。真会翻车的情况是末尾又挂了个带引号的变量(比如 "$upstream_http_user_agent"),那时 a[n-1] 就不是 UA 了,只能上 FPAT 或把 UA 单独落一份日志。

分母那套两步走没问题,补一个监控点:other 桶要当健康指标看。它长期占三成以上,多半是关键字表过期,新蜘蛛在吃你的分母。

按 IP+URL 去重这条,如果日志是 CDN 回源来的,$remote_addr 是边缘节点 IP,这条最先失效,得先取 XFF 首段再拼键。顺带说一句,XFF 追加在末尾并不影响 a[n-1] 取 UA,跟你的担心正相反,可以放心往后放。

+http://www.google.com/bot.html 这个判据很实用,配合 PTR 反查前先缓存:rDNS 结果落库留 24 小时,别逐条去查,否则反查本身会变成瓶颈。