先给有条件的结论:如果日志里同一 URL 的抓取请求返回 200,但抓取到的正文与你在浏览器里看到的不一致,优先怀疑“返回给爬虫的 HTML 本身就不含目标内容”,而不是先怀疑渲染服务故障。这个判断成立的前提是:日志中的响应体大小、状态码和 User-Agent 分组能对上,且你能拿到该次抓取的原始响应片段。缺少原始响应时,结论会失效,只能退回到分组对比。
静态响应与脚本渲染结果不同,通常表现为三类,处理顺序完全不同。
先判断属于哪一类,再决定是改服务端输出、调整渲染策略,还是只处理缓存刷新。把三类混在一起排查,会浪费大量时间在错误的方向上。
定位差异的核心动作是:按 User-Agent 和 URL 路径分组,比较响应体大小、状态码和抓取频次。具体做法是,从日志中筛出目标路径,按 UA 分成“声明支持脚本执行”和“不声明”两组,分别统计响应体大小的中位数。
假设目标页面静态 HTML 约 8KB,渲染后正文约 40KB。如果日志显示某组抓取请求的响应体稳定在 8KB 左右,而另一组在 40KB 左右,说明差异来自服务端是否返回了脚本执行后的内容,而不是抓取失败。这个例子只用于说明比较方法,不代表真实站点数据。
下一步动作取决于对比结果:
这个动作的结果直接影响下一步:响应体大小能区分“没返回”和“返回了但不对”,前者改输出,后者查缓存和替换逻辑。
如果日志中的响应体大小本身不可靠,比如服务端对爬虫请求做了压缩或分块传输,而日志只记录了压缩后的大小,那么“响应体偏小”就不能证明内容缺失。此时两组响应体大小可能都偏小,但实际内容完整。
另一个反例是:静态响应与浏览器结果不同,但差异只出现在特定地理区域或特定网络出口。日志按 UA 分组看不出问题,因为同一 UA 在不同出口拿到不同版本。这种情况下,需要按 IP 段或出口区域再分一次组,否则会误判为渲染问题。
还有一种情况:日志显示某组抓取请求返回 200 且响应体正常,但目标内容仍不在其中。这可能是内容被替换成了结构相同但语义不同的页面,比如列表页替换了详情页。响应体大小相近,但内容不对,单靠大小无法发现。
上述判断依赖几个条件,缺一个就要调整结论:
不要直接改代码或调整渲染服务。先固定一个可复现的对比样本:选一个目标 URL,在日志中找出同一时间段内至少两次抓取记录,一次来自声明支持脚本的 UA,一次来自不支持的 UA,分别记录状态码、响应体大小和抓取时间。
如果两次记录的响应体大小差异稳定,且与浏览器渲染结果一致,就可以把问题范围缩小到服务端输出或渲染策略。如果差异不稳定,或者同一 UA 多次抓取结果不一致,优先排查缓存和内容替换,而不是渲染能力。
这个动作的结果决定了下一步是改服务端模板、调整缓存策略,还是只更新渲染服务的配置。在拿到可复现样本之前,任何修改都无法验证是否有效。