报错是这么冒出来的。站点 30 万页面,GSC 报表显示每天点击 1.2 万,nginx 日志里同样的落地页有 1.7 万次来自搜索的点击,按 query 维度导出差距更大,换维度、换日期都一样。
中间走过弯路,把「日志里混了爬虫和站内预取,被算成点击」当成主因,改完现象没变。
排查方向其实有限,先把可能性排一排。按 query 维度导出时长尾被匿名化,行数被截断。另一种情况是Performance API 单次最多返回 25000 行,分页没取全。
还有一种情况,GSC 按太平洋时间切日,与服务器时区差一天。
动手时先按页面维度拉一次全量数据
curl -s -X POST "https://searchconsole.googleapis.com/webmasters/v3/sites/sc-domain:example.com/searchAnalytics/query" -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" -d '{"startDate":"2026-10-01","endDate":"2026-10-30","dimensions":["page"],"rowLimit":25000}'
随后对比日志里同一批页面的搜索来源
Select-String -Path access.log -Pattern "google" | Measure-Object
过滤爬虫 UA 再统计一次
Select-String -Path access.log -Pattern "Googlebot" -NotMatch | Measure-Object
末了把时区统一到太平洋时间再对账
python -c "from datetime import datetime,timezone,timedelta;print(datetime.now(timezone(timedelta(hours=-7))))"
恢复的判定其实很直接。页面维度两边差异收窄到 5% 以内,按太平洋时间切分后每日曲线吻合,长尾 query 的缺失能在报表说明里对应上。
容易忽略的是,GSC 的数字是抽样和匿名化之后的估算,用来比趋势,不要拿它和日志做逐条对账。监控比日志更早给出信号,事后回看经常能提前半小时发现异常。
