先看百度蜘蛛拿到的是哪一份内容:如果服务器直出的 HTML 里已有正文、标题和链接,而浏览器执行脚本后又替换了这些内容,那么差异通常出在“渲染前后 DOM 不一致”。定位时不要先改模板,而要先分别保存静态响应与渲染后 DOM,再对比两者在标题、正文、链接上的差异,判断百度最终可能以哪一份为准。这个判断只对单页或少量样本可靠,规模化后必须用分层抽样验证,不能把单页结论直接推广到全站。
第一种条件是静态响应里已经包含可索引的正文和链接,脚本只是增强交互。此时差异多表现为脚本执行后删除了原有内容,或把链接改写成按钮。处理选择是保留静态内容,脚本只做增量修改,并让最终 DOM 仍能回到同一批 URL。实施动作可以是:用抓取工具分别保存“禁用脚本”和“启用脚本”两份结果,对比正文段落数与链接数。如果禁用脚本时正文完整、启用脚本后反而减少,优先排查脚本是否在初始化时清空了容器。
第二种条件是静态响应只有空壳,正文和链接完全依赖脚本生成。这时差异不是“被改坏”,而是“百度是否执行脚本并等待到内容出现”。选择依据在于:内容是否必须在首屏可见、是否有稳定的数据接口、脚本失败时是否有兜底。若无法保证渲染完成,较稳妥的动作是把关键正文和分页链接改为服务端直出,脚本只保留筛选、排序等非关键交互。这个动作的结果会直接影响下一步:直出后如果静态与渲染结果趋于一致,后续就转向验证百度抓取到的版本;若仍不一致,则问题在渲染时序或资源加载,而不是模板本身。
不要只凭“百度没收录”就断定是渲染问题。以下证据可以帮助区分:
<a href> 还是点击事件;若静态有 href、渲染后变成 <div onclick>,爬虫可跟随的路径会减少。这些现象只能说明“存在差异”,不能单独证明百度一定按渲染后结果处理。抓取量或某接口请求量归零,也可能来自缓存、限流、发布节奏或样本选择偏差,需要结合服务端日志和页面版本一起看。
假设某栏目页静态 HTML 只输出标题和分页容器,列表项由脚本请求接口后插入。单页测试时,浏览器能看到完整列表,百度抓取到的 HTML 却只有空容器。此时不要直接把全站列表都改成直出,而应先选一个样本页做对照:样本 A 保持脚本渲染,样本 B 把首屏列表改为服务端直出,其余交互不变。观察两页在后续抓取中的静态响应差异,并记录百度返回的 HTML 是否包含列表链接。若 B 的静态响应稳定包含链接,而 A 仍为空,才考虑把直出范围扩大到同模板页面;若 B 也出现例外,则要先查 CDN 缓存、接口超时或模板条件分支,而不是继续扩大改动。
这个例子中的数字只用于说明比较方法,不代表真实抓取量或收录比例。样本成立不等于全站成立,尤其当不同栏目使用不同模板、不同接口或不同发布流程时,边界必须单独验证。
当个别样本成立、规模化后出现例外,优先按模板、目录、发布方式分层,而不是继续逐页看。可以按以下顺序实施:
需要说明适用条件:如果站点本身依赖登录态、个性化推荐或频繁变更的数据,静态直出可能不现实,此时应优先保证关键正文和可抓取链接,而不是追求静态与渲染完全一致。robots.txt 的抓取限制不等于可靠的索引移除;站点地图不保证收录;HTTPS 不保证安全无漏洞或排名。不同搜索引擎对脚本渲染的支持情况须分别核查,不能把百度的观察结果直接套到其他引擎。
最终判断标准不是“静态和渲染必须一模一样”,而是百度能否稳定拿到你希望被索引的标题、正文和链接。若两份结果在关键内容上一致,差异只出现在样式或非关键交互,通常不需要为此重构渲染方式;若关键内容只存在于渲染后 DOM,且无法保证稳定执行,才应把直出作为下一步动作,并用同组对照验证后再扩大范围。