先给结论:如果同一URL的静态响应(不带Cookie、不执行JavaScript的原始HTML)与脚本渲染后的DOM出现差异,优先怀疑内容注入时机,而不是先改robots.txt。定位顺序建议是:先确认差异是“内容缺失”还是“内容替换”,再判断差异是否影响可索引主体,最后才决定是让爬虫读静态版本,还是要求它执行渲染。但有一个反例会让这个顺序失效:如果静态响应本身返回的是验证页、同意横幅或错误页,那么差异根源在访问准入,不在渲染,此时应先排查请求头、地域和会话条件。
静态响应与渲染结果不同,通常落在两类。缺失型指静态HTML里根本没有目标文本,渲染后才出现;替换型指静态HTML里有占位符、旧价格或旧标题,渲染后被覆盖。两者的处理代价不同。
判断方法很直接:用同一URL分别保存原始响应体和执行脚本后的DOM,对目标区域做文本比对。如果原始响应中目标文本出现次数为零,按缺失型处理;如果出现但值不同,按替换型处理。这个动作的结果决定下一步:缺失型优先考虑服务端预渲染或静态输出;替换型优先考虑是否必须由脚本改写,以及改写是否影响主体内容。
单次抓取结果不足以定位。差异可能来自请求头、Cookie、User-Agent、地域或时间。建议固定一组最小变量,逐项改变,观察静态响应和渲染结果是否同步变化。
如果改变请求头后静态响应就与渲染结果趋同,说明问题在准入与分流,不需要先动抓取规则。反之,如果所有请求条件下静态响应都缺少目标内容,才进入渲染依赖的判断。
不是所有差异都值得处理。页脚年份、推荐位、评论数这类差异通常不影响主体判断;标题、正文、价格、库存、主要链接才是关键。可以用一个假设例子说明取舍:假设某商品页静态响应只有“加载中”,渲染后出现价格与库存。若爬虫不执行脚本,抓到的就是无价格页面。此时两个选择成立的条件不同:
如果差异只出现在次要模块,先记录并观察,不必立即改造。若差异出现在标题或主体正文,应视为高优先级。
如果静态响应返回的是验证页、同意横幅或错误页,而渲染后正常,那么“静态 vs 渲染”的差异根源不是脚本,而是访问被拦截。此时继续比对DOM没有意义。应先确认:原始响应状态码、响应体是否为验证或错误模板、是否因请求频率或请求头特征被拦截。只有排除准入问题后,才回到内容注入时机的分析。这个反例也提醒:请求量或抓取量归零不能单独证明处理正确,它也可能是拦截、限流或路由变化造成的。
建议先建立一份小样本比对表,每个URL记录四项:原始响应中目标文本是否存在、渲染后是否存在、差异类型、差异是否落在主体区域。这个动作的结果直接决定下一步:
需要单独核查的一点是:不同搜索引擎对脚本执行的支持情况并不一致,必须分别验证,不能用一个引擎的结果推断另一个。robots.txt的抓取限制也不等于可靠的索引移除,站点地图同样不保证收录;这些手段不能替代对静态与渲染差异本身的定位。