收录涨了流量没涨,或者收录掉了流量反而稳着——只盯单一指标的人迟早被这种背离搞糊涂。原因很简单:抓取、收录、流量是链条上三道独立的工序,蜘蛛来了不代表收进索引,收进索引不代表有排名,有排名不代表有人点。任何一道出问题,表象都像“SEO 变差了”,但药方完全不同。
解法是把三本账放进同一张表里天天对照。日志负责抓取端:蜘蛛每日抓取量、返回码分布;平台负责收录端:资源平台的索引量曲线;统计代码负责流量端:搜索来源访客。三端数据每天各取一行,追加进同一个 CSV,坚持一个月,任何一端出异常,交叉对照一眼定位是哪道工序断了。
import subprocess, csv, datetime
LOG = "/var/log/nginx/access.log"
def sh(cmd):
return subprocess.run(cmd, shell=True,
capture_output=True, text=True).stdout.strip()
def spider_count():
# 蜘蛛抓取总量
return sh("grep -c -E 'Baiduspider|Googlebot' " + LOG)
def status_dist():
# 返回码分布,压成一行
return sh("grep -E 'Baiduspider|Googlebot' " + LOG +
" | awk '{c[$9]++} END {for (k in c) print k":"c[k]}'"
" | sort | tr '\n' ' '")
row = [datetime.date.today().isoformat(),
spider_count(), status_dist(),
baidu_indexed(), search_visits()]
with open("seo_daily.csv", "a", newline="") as f:
csv.writer(f).writerow(row)
print(row)
收录端和流量端各接一个数据源。百度索引量没有公开接口,最省事的合规做法是每天人工看一眼资源平台曲线,把数字敲进 CSV,或者用平台的推送接口反馈间接判断;流量端接统计后台的导出。全自动和全人工之间取个折中:抓取端全自动,另两端每天花两分钟补录,可持续性比自动化程度重要。
# 抓取端全自动:crontab 每天早上 6 点跑
0 6 * * * /usr/bin/python3 /opt/seo/seo_daily.py
# seo_daily.csv 长这样:
# date,spider,status_dist,indexed,visits
# 2026-09-03,18742,200:17890 404:512 5xx:340,12480,2310
用起来的套路是看三组背离:抓取量稳、收录掉——问题在内容质量和重复度,蜘蛛来了但没收录价值;收录稳、流量掉——问题在排名或搜索需求变化,去查核心关键词的排名波动;三项全掉——先查服务器健康和惩罚信号,再谈内容。每种背离都指向完全不同的下一步动作,这就是对照表的价值:它逼你先确诊再开药。
再加一层简单的告警逻辑,表才算真正活起来:拿当天抓取量和过去 7 天均值比,跌掉一半就在日报末尾标个感叹号;5xx 占比超过 2% 同样标记。不需要什么智能算法,两个阈值就能保证大事故不会在你刷平台数据时才被发现。
# 抓取端全自动:crontab 每天早上 6 点跑
0 6 * * * /usr/bin/python3 /opt/seo/seo_daily.py
# seo_daily.csv 长这样:
# date,spider,status_dist,indexed,visits
# 2026-09-03,18742,200:17890 404:512 5xx:340,12480,2310
收尾强调口径纪律:这张表里三个数字来自三个体系,永远不要追求它们之间的精确换算,要看的只有趋势和背离。日志统计的是请求,平台统计的是索引,统计代码统计的是访客,口径天生不同。日报坚持 90 天,你对这个站的健康直觉会完全不一样——数据看不出来的事,趋势看得出来。
相关阅读:本篇是《SEO 自动化总清单:日、周、月、季各该跑什么》日志组的每日核心动作,抓取、收录、流量三本账一张表对齐,总纲里它排在每天早上的第一件事。
A5创业网 版权所有