先给结论:不要急着改页面,也不要直接认定百度“不执行脚本”。第一步应是分别保存静态响应、脚本执行后的DOM,以及百度抓取时实际拿到的版本,把三份结果对齐到同一URL、同一时间点。只有确认差异发生在哪一层,后续动作才有意义。
开发在浏览器里打开页面,看到商品价格、库存和推荐位都正常;运维或SEO用抓取工具拉取原始响应,却只看到空容器和一段脚本。双方都没有说谎,他们观察的是同一URL的不同阶段:一个是脚本执行后的结果,一个是服务器最初返回的HTML。
这种分歧最容易出现在内容由前端框架异步填充的页面。若团队直接把“浏览器能看到”当成“百度能看到”,就可能把问题误判为收录策略;反过来,若只凭原始响应里没有正文,也可能误判为页面不可抓取。要定位差异,先把这两种观察拆成可核对的证据。
第一种解释是渲染时机差异。服务器返回的HTML只是骨架,正文、价格、评价等由脚本请求接口后再插入。浏览器等待并执行了脚本,所以看到完整内容;原始响应没有等待,所以看不到。此时差异发生在“响应之后、渲染之前”。
第二种解释是抓取路径差异。百度抓取时可能拿到的是简化版、移动版、CDN缓存版,或者被robots.txt、登录态、地域策略挡在某个分支之外。即使脚本能执行,抓取端进入的也不是你本机访问的那条路径。此时差异发生在“请求进入服务器之前或之时”。
两种解释会指向完全不同的修复动作。前者要处理渲染与内容注入,后者要处理访问控制、缓存和版本分流。把两者混在一起,就会出现“改了脚本仍没变化”或“放了权限仍没变化”的反复。
可以按下面顺序做一次对照,每一步都记录URL、时间、User-Agent和返回状态。假设某商品页在浏览器中显示“有货”,原始响应中只有<div id="app"></div>,而百度抓取诊断显示抓取成功但正文为空。此时可先形成三个文件:原始响应、浏览器执行后的DOM、抓取端返回内容。
这些证据的作用不是证明“百度一定怎样”,而是把“谁在什么条件下拿到哪一版”固定下来。只要有一项对不上,就能排除一部分解释。
假设团队决定先处理渲染问题。实际动作可以是:为需要收录的正文增加服务端输出或预渲染,使原始响应中直接包含标题、主体和关键属性;同时保留脚本增强交互。改完后,不要只看浏览器,而是重新拉取原始响应,确认目标内容已出现在HTML中,再观察抓取端返回是否同步变化。
这个动作的结果会直接影响下一步:如果原始响应已包含正文,但抓取端仍为空,就应转向检查抓取路径、缓存和访问控制;如果原始响应和抓取端都出现了正文,才进入收录观察阶段。注意,robots.txt限制抓取不等于可靠的索引移除,站点地图也不保证收录,HTTPS同样不保证排名。抓取量或某项统计归零,也不能单独证明处理正确,它还可能来自缓存切换、日志采样变化或流量本身波动。
多角色协作时,最容易争吵的是“我看到的有”与“你看到的没有”。可把争议拆成三个待核对项:原始响应是否含目标内容、脚本执行后是否改变目标内容、抓取端是否进入同一路径。每项只回答是或否,并附上抓取时间与请求条件。这样,讨论就从立场转为证据。若三项都指向同一层,修复范围就清楚了;若指向不同层,就按“先响应、再渲染、后抓取路径”的顺序逐层排除,避免一次性改动过多导致无法归因。