对比蜘蛛抓取和用户访问差异的方法只有一条主线:把同一时间窗内的服务器访问日志按 User-Agent 拆成「爬虫」和「真人」两组,再对同一批 URL 交叉比对状态码、响应体大小、HTML 内容、抓取频次这四个指标,哪一项出现系统性偏差,问题就出在哪。结论:蜘蛛能看到的内容和用户能看到的内容不一致,九成以上来自 JS 渲染差异,剩下的是服务端按 UA 做了区别返回。
蜘蛛抓取和用户访问,主要差在哪四个维度?
差异必须落到可量化的指标上,否则「看起来不一样」无法定位。四个维度分别是:URL 覆盖集合(用户访问过的 URL 里有多少从未被蜘蛛抓过)、HTTP 状态码分布(同一个 URL 对蜘蛛返回 403/500,对用户返回 200)、响应体字节数(蜘蛛拿到 20KB,用户拿到 200KB)、抓取频次与时间间隔(蜘蛛是否反复抓同一批无价值参数 URL)。
- URL 覆盖集合:用户访问集合减去蜘蛛抓取集合,剩下的 URL 基本是纯 JS 链接、表单提交页、POST 跳转页——这些蜘蛛难以发现。
- 状态码分布:蜘蛛侧 5xx 占比高,说明抓取预算被浪费在报错页上。
- 响应体大小:同一 URL 两组字节数偏差超过 30%,就要怀疑 SSR 未对爬虫生效,或 CDN 缓存了不同版本。
怎么从日志里把蜘蛛流量和真人流量准确分开?
靠 User-Agent 匹配,再用反向 DNS 验证,两步缺一不可,因为 UA 可以随意伪造。先按 UA 聚类看整体分布:
awk -F'"' '{print $6}' access.log | sort | uniq -c | sort -rn | head -20
# 单独取出 Googlebot 抓取的 URL 及频次
awk -F'"' '$6 ~ /Googlebot/ {split($2,a," "); print a[2]}' access.log \
| sort | uniq -c | sort -rn | head -50
注意:日志格式为 combined 时,-F'"' 的第 6 个字段就是 UA。批量验证时,对 Googlebot 的 IP 做反向解析,主机名必须以 .googlebot.com 或 .google.com 结尾,再正向解析回同一 IP 才算真身;百度 Spider 的 IP 段以百度搜索资源平台公布的为准,不要用网上抄来的旧列表——IP 段会变。
同一个 URL,蜘蛛拿到的 HTML 和用户看到的为什么不一样?
因为蜘蛛默认不执行 JavaScript,而用户浏览器会。三类场景会造成差异:一是纯前端渲染(CSR)页面,蜘蛛拿到的原始 HTML 里只有一个空 <div id="app">;二是登录态页面,蜘蛛没有 Cookie,看到的是未登录版本;三是地理/IP 定向内容,CDN 按 IP 返回不同语言或不同库存状态。
验证方法是直接对比两份 HTML:
curl -s -A "Googlebot/2.1 (+http://www.google.com/bot.html)" https://example.com > raw.html
google-chrome --headless=new --disable-gpu --dump-dom https://example.com > rendered.html
wc -c raw.html rendered.html
两份文件字节数差距大(例如 8KB 对 180KB),说明页面依赖 JS 渲染。这时要做的是给爬虫提供预渲染或 SSR 版本,而不是给爬虫单独塞一套内容——后者就是 cloaking(对爬虫返回与用户不同内容的作弊手法),搜索引擎明确会降权甚至封禁;动态渲染只要内容和用户看到的一致,是被官方允许的。
不写脚本也能对比吗?
能,用官方抓取快照工具,成本更低但要逐个 URL 手动查。Google Search Console 的「网址检查」里可以查看「已抓取的网页」HTML 快照,那是 Googlebot 实际拿到的代码;百度搜索资源平台的「抓取诊断」会返回百度蜘蛛请求时的 HTTP 状态码、响应头和 HTML,还支持手动触发抓取。把这两处结果和你浏览器里右键查看的源码逐段对照,渲染差异一眼可见。
对比时最容易踩的坑是什么?
三个:一是只看 UA 不验 IP,被伪造 UA 的采集器污染数据,把「假蜘蛛」的异常当成真蜘蛛的抓取问题;二是时间窗太短,建议至少取连续 7 天、可比 URL 不少于 1000 条,否则单日波动会误导判断;三是把移动端和桌面端混在一起比,Googlebot 的移动 UA 里带 Mobile 字样,它抓的通常是移动版页面,和桌面版 HTML 本就不同,必须分开统计。
总结一句:先拆流量、再对齐 URL、然后比状态码和字节数,最后用官方抓取快照或 headless 浏览器验证 HTML 内容。差异定位到具体维度之后,修复方向自然就清楚了——CSR 页面补预渲染,状态码异常查服务端 UA 判断逻辑,字节数偏差查 SSR 与 CDN 缓存。