先给出判断:静态响应是服务器直接返回的HTML,脚本渲染结果是浏览器执行JavaScript之后的DOM。两者不同,通常说明内容依赖客户端生成、服务器对爬虫返回了不同版本,或者中间层缓存了旧结果。缺少完整数据或权限时,最小动作是用curl取原始HTML,再与浏览器开发者工具里的最终DOM逐段对比,先确认差异发生在哪一层,再决定保留、改写还是退出当前方案。
把差异拆成三类,分别对应不同的下一步。
可执行的最小动作:对同一URL分别保存curl -s URL > static.html和浏览器复制出的最终DOM,用文本对比工具定位第一处不同。如果第一处不同出现在<body>开头附近,多半是整页由脚本注入;如果只出现在某个区块,问题更可能是局部组件或数据接口。
没有服务器日志、没有渲染服务后台、没有抓取配置权限时,仍可完成两件事:一是用不同User-Agent请求同一URL,观察返回HTML是否一致;二是禁用JavaScript后加载页面,看还剩多少内容。这两步能区分“服务器对爬虫差别对待”和“内容本来就靠脚本生成”。
但要注意不能推出的结论:请求量或抓取量归零,不能单独证明是渲染差异导致的,也可能是robots.txt限制、站点地图未更新、服务器临时故障或抓取预算被其他路径占用。robots.txt的抓取限制不等于可靠的索引移除,站点地图也不保证收录。这些现象只能作为线索,不能当作定论。
确认差异原因后,三种取舍各有前提。
取舍的关键不是哪种技术更先进,而是目标内容是否必须出现在静态响应里。如果必须,改写;如果不必须,保留或退出都成立。
假设某站点迁移到新空间域名后,浏览器访问正常,但curl取回的HTML只有一个空壳<div id="app"></div>。此时不能直接断定是空间域名配置错误。更合理的排查顺序是:先确认新空间是否默认开启了某种前端托管模式,再检查构建产物是否把入口脚本路径写错,最后对比旧空间的静态响应。
如果旧空间返回的是完整HTML,新空间返回空壳,差异就落在托管配置或构建输出上,而不是域名解析本身。这个判断会直接改变下一步:前者要改托管设置,后者要改构建配置。若跳过对比就直接换域名,很可能换完仍然一样。
改写或调整后,用同一组请求重新取静态HTML,确认目标内容出现。但不要用单次结果下结论:一次抓取成功不代表长期稳定,一次失败也不代表方案错误。可以固定几个URL,在不同时间点重复取静态响应,观察差异是否持续存在。只有持续、可复现的差异,才值得投入改造。HTTPS不保证安全无漏洞或排名,不同搜索引擎对脚本渲染的支持情况也须分别核查,不能拿一个引擎的表现套用到全部。