谷歌SEO 抓取日志分析脚本:解析访问日志,看穿 Googlebot 的抓取行为
抓取是索引的前提,抓取日志藏着大量线索:Googlebot 在抓哪些页、浪费了多少抓取预算、哪些 URL 返回异常。本篇给一个可运行的日志分析脚本,直接解析 Nginx/Apache 访问日志,输出抓取频率、异常状态码、预算浪费三类报告。抓取原理参考搜索中心爬虫文档。
一、为什么要分析抓取日志
| 发现 | 说明 | 价值 |
|---|---|---|
| Googlebot 频繁抓低价值页 | 抓取预算被浪费 | 收敛 noindex / 修导航 |
| 大量 404/5xx | 页面质量信号差 | 修死链、看服务器 |
| 核心页长时间没被抓 | 收录延迟 | 加内链、提交 sitemap |
| 抓取频次异常波动 | 站点或服务器出问题 | 排查封禁/降级 |
日志分析不依赖 GSC,能看到 GSC 看不到的细节:具体 UA、请求路径、状态码、抓取时间分布。
二、数据准备
- 从服务器下载访问日志(Nginx 默认
/var/log/nginx/access.log,Apache 默认/var/log/apache2/access.log),建议取最近 30 天合并。 - 日志需含标准 Combined 格式字段:
IP - - [时间] "GET /path HTTP/1.1" 状态码 字节 "Referer" "User-Agent"。 - 确认日志里能看到 Googlebot UA(
Googlebot/GoogleOther/Google-InspectionTool等),看不到就检查服务器日志配置。
三、抓取日志分析脚本
python
import re
from collections import Counter, defaultdict
LOG_FILE = "access.log"
ROBOTS = ["Googlebot", "GoogleOther", "Google-InspectionTool", "Googlebot-Image"]
PATTERN = re.compile(
r'\[(?P<time>[^\]]+)\] "(?:GET|POST|HEAD) (?P<path>\S+) '
r'HTTP/\d\.\d" (?P<status>\d{3}) '
)
crawl = defaultdict(Counter) # path -> {status: count}
hour_count = Counter()
total = 0
with open(LOG_FILE, encoding="utf-8", errors="ignore") as f:
for line in f:
ua = line.split('"')[-2] if '"' in line else ""
if not any(r in ua for r in ROBOTS):
continue
m = PATTERN.search(line)
if not m:
continue
total += 1
path = m.group("path")
status = m.group("status")
crawl[path][status] += 1
h = m.group("time")[14:16]
hour_count[h] += 1
print(f"=== Googlebot 抓取总览:{total} 次请求 ===")
print("\n--- 1. 抓取最多 Top 15 ---")
for path, s in crawl.most_common(15):
n = sum(s.values())
print(f"{n:>5}次 {path[:70]}")
print("\n--- 2. 异常状态码页(4xx/5xx)---")
errors = {p: s for p, s in crawl.items() if any(k >= 400 for k in s)}
for p, s in sorted(errors.items(), key=lambda x: -sum(x[1].values()))[:15]:
print(f"{sum(s.values()):>4}次 {dict(s)} {p[:60]}")
print("\n--- 3. 抓取时间分布(时区按日志)---")
for h in sorted(hour_count):
print(f" {h}:00 {hour_count[h]:>4}次")
四、输出解读与动作
| 输出 | 判定 | 动作 |
|---|---|---|
| Top 抓取页 | 核心页应在此列 | 不在则补内链/提交 sitemap |
| 404/5xx 页 | 异常信号 | 4xx 修复或 301;5xx 查服务器 |
| 低价值页高抓取 | 预算浪费 | noindex 或移出导航 |
| 时间分布异常 | 服务器时段性 | 排查限流/封禁 |
硬决策规则:异常状态码页先修再谈抓取频率;核心页 30 天内未被 Googlebot 抓取过 = 收录风险,立即加内链并提交 sitemap。
五、常见坑
| 坑 | 后果 | 正解 |
|---|---|---|
| 日志太大读不完 | 脚本卡死 | 用 tail 截取或按天拆分 |
| 把非 Google UA 算进来 | 数据失真 | 严格匹配 UA 关键字 |
| 只看数量不看路径 | 看不出预算浪费 | 结合页面价值判断 |
| 忽略 5xx | 以为抓取正常 | 5xx 过多会触发抓取降级 |
| 日志不含 UA | 无法分析 | 先修服务器日志格式 |
六、FAQ
Q1:日志文件多大适合分析?
30 天日志可能几百 MB。脚本逐行读不占内存,但建议拆成单日文件跑,便于对比。
Q2:Googlebot 抓取少就一定是坏事吗?
不绝对。新站抓取少正常;老站核心页 30 天无抓取才是信号。
Q3:5xx 多了会怎样?
Google 会降低抓取频次(抓取预算下降),严重时页面从索引移除。先修服务器。
Q4:没有服务器日志权限怎么办?
用 GSC 的"抓取统计"报表(GSC 抓取统计文档),数据粒度不同但够用。
七、行动清单
- 下载近 30 天访问日志,跑抓取日志分析脚本。
- 先处理异常状态码页(4xx/5xx),再处理预算浪费页。
- 核心页无抓取:加内链、刷新 sitemap、检查 robots.txt 是否误封。
- 记录抓取频率基线,每月对比。
- 结合 GSC 抓取统计 交叉验证。
完整版抓取日志脚本(含 UA 白名单、按天趋势、预算浪费评分模块)我整理成了 PDF,评论区扣「日志」或私信我,免费发你。也欢迎一起交流谷歌SEO实战问题。