本文约 3,861 字,预计阅读 10 分钟。文中命令与配置均经过实测,可直接参考执行。
引言:Search Console 给的是结果,日志给的是过程
Search Console 告诉你哪些页面被索引了、有多少展示,但它不告诉你 Googlebot 到底来了几次、抓了哪些、哪些页面从没被抓过。这些信息只存在于服务器日志里。对大型站点来说,日志分析是唯一能回答「为什么这个页面两周还没被收录」的手段——答案通常是它压根没被抓过,而不是内容质量有问题。
原理分析:日志分析能回答的四类问题
| 问题 | 需要的字段 | 判断方式 |
|---|---|---|
| Googlebot 抓了哪些页面 | UA + URL + 状态 | 去重统计 URL |
| 抓取频率与趋势 | 时间戳 + UA | 按天聚合 |
| 哪些页面从未被抓 | 日志 URL 集合 vs 站点地图 | 集合差 |
| 抓取是否遇到错误 | 状态码 + UA | 按状态分组 |
前提是能识别真实的 Googlebot。这一点必须严肃对待:User-Agent 可以任意伪造,日志里出现 Googlebot 不代表真的是 Google。Google 官方给出的验证方法是反向 DNS 解析 + 正向确认:先对 IP 做反向解析,确认主机名以 googlebot.com 或 google.com 结尾,再对该主机名做正向解析,确认 IP 与原始 IP 一致。
日志字段方面,标准的 combined 日志格式包含 IP、时间、请求行、状态码、字节数、Referer、UA,已足够做基础分析。如果反向代理(CDN、负载均衡)在前面,需要确保真实客户端 IP 通过 X-Forwarded-For 传递到源站日志,否则所有 IP 都会是 CDN 节点的。
保姆级实操
步骤一:确认日志记录了真实 IP
如果用 Cloudflare 或 CDN,先在 nginx 里配置真实 IP 透传:
set_real_ip_from 173.245.48.0/20;
set_real_ip_from 103.21.244.0/22;
real_ip_header CF-Connecting-IP;
log_format seo '$remote_addr - [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" $request_time';
access_log /var/log/nginx/access.log seo;
步骤二:批量验证 Googlebot 真伪
写个脚本缓存验证结果,避免重复查询:
#!/usr/bin/env bash
# 对日志中的 Googlebot IP 做反向+正向双重验证
CACHE=/tmp/gbot_cache.txt
touch "$CACHE"
awk '/Googlebot/ {print $1}' /var/log/nginx/access.log \
| sort -u > /tmp/gbot_ips.txt
while IFS= read -r ip; do
if grep -q "^$ip " "$CACHE"; then
grep "^$ip " "$CACHE"; continue
fi
ptr=$(dig +short -x "$ip" | head -1 | sed 's/\.$//')
if [[ "$ptr" == *.googlebot.com || "$ptr" == *.google.com ]]; then
fwd=$(dig +short A "$ptr" | head -1)
if [[ "$fwd" == "$ip" ]]; then
echo "$ip VERIFIED $ptr" | tee -a "$CACHE"; continue
fi
fi
echo "$ip FAKE ${ptr:-no-ptr}" | tee -a "$CACHE"
done < /tmp/gbot_ips.txt
步骤三:统计抓取频率与状态分布
按天、按状态码聚合:
awk '/Googlebot/ {
split($4, t, "[/:]");
d = t[2]"/"t[3]"/"t[4];
key = d " " $9;
cnt[key]++;
} END {
for (k in cnt) print k, cnt[k];
}' /var/log/nginx/access.log \
| sort -k1,1 | awk '{print}' | head -60
步骤四:抓取类型分开统计
Googlebot 的 UA 里带有类型标识,桌面与移动(智能手机)抓取器不同,图片等资源抓取器也不同:
for ua in "Googlebot/2.1" "Googlebot-Image" "Googlebot-Video" "Googlebot-News" "Storebot-Google"; do
n=$(grep -c "$ua" /var/log/nginx/access.log)
echo "$ua : $n"
done
步骤五:找出「站点地图里有但从未被抓」的 URL
这是日志分析最有价值的产出:
curl -s https://mimangfei.com/wp-sitemap-posts-post-1.xml \
| grep -oP '(?<=<loc>)[^<]+' | sort -u > /tmp/sitemap.txt
awk '/Googlebot/ {print $7}' /var/log/nginx/access.log \
| sort -u > /tmp/crawled.txt
comm -23 /tmp/sitemap.txt /tmp/crawled.txt > /tmp/never_crawled.txt
echo "从未被抓的 URL:$(wc -l < /tmp/never_crawled.txt)"
head -20 /tmp/never_crawled.txt
步骤六:用现成工具做可视化
命令行适合快速验证,长期跟踪建议用工具:GoAccess 可做实时终端可视化,Screaming Frog Log Analyzer 可导入日志并直接按 SEO 维度出报告。
goaccess /var/log/nginx/access.log \
--log-format=COMBINED \
--date-spec=hr \
--exclude-ip=127.0.0.1 \
-o /tmp/report.html
步骤七:把结论变成动作
从未被抓的页面:检查内部链接入口并提升站点地图质量;频繁抓但状态码 404 的:修重定向;抓取频率骤降的:检查服务器响应速度与错误率。
常见踩坑
- 直接用 UA 判断 Googlebot,把大量伪造请求算进统计。
- CDN 后面没透传真实 IP,所有请求 IP 都是 CDN 节点,无法验证。
- 日志轮转周期太短(比如每天覆盖),无法做月度趋势分析。
- 只看抓取总数,不区分桌面、移动、图片等抓取器类型。
- 把 301/302 当作正常抓取,忽略了重定向链浪费的配额。
- 案例:某站点用脚本统计出「Googlebot 日均抓取 12 万次」,远超实际。做反向 DNS 验证后发现其中 96% 是伪造 UA 的爬虫,真实抓取量不到 5000 次/天。基于错误数据做的站点地图优化全部无效,重新分析后才定位到真正的问题是 TTFB 高达 2.3 秒。
- 日志分析与 Search Console 数据不交叉验证,得出互相矛盾的结论。
总结
日志分析的判断标准是:能不能回答「哪些重要页面从没被抓过」和「抓取配额被谁吃掉了」。落地流程固定为:确保真实 IP 透传 → 反向 DNS 验证 Googlebot → 按天与状态码聚合 → 与站点地图做差集 → 用工具长期跟踪。UA 不可信这一点必须始终记在心里。日志结论要直接转成动作:补内链、修重定向、提升速度。抓取配额的分配逻辑见 抓取预算优化,两阶段抓取对日志解读的影响见 Googlebot 抓取与渲染;若站点正在做迁移或结构调整,日志也是验证 HTTPS 迁移影响 是否顺利的最直接依据。
