很多人把“蜘蛛来過了”当成“内容被看到了”,其實這两件事中間還隔着一步。蜘蛛把 HTML 抓回去,只是拿到了原材料;頁面上靠 JavaScript 拼出来的文字、图片和連結,往往要再经過一次渲染處理,才會進入後續的判断流程。
抓取和渲染是两個獨立环节
抓取是網絡层面的動作:發請求、收响應、把字节存下来,快慢取决于服務器、網絡和頁面体积。渲染是計算层面的動作,需要解析 HTML、执行脚本、等資料返回、把 DOM 拼完整。它有獨立的排队机制,资源比抓取更紧張,所以不是每一個被抓到的頁面都會立刻渲染。
這就解释了一個常见現象:日誌里蜘蛛明明来過,頁面也返回 200,但内容迟迟没有進入索引——它可能卡在渲染那一环。
哪些頁面更容易被排進渲染队列
- 正文、标题、價格等關键信息由前端接口返回後再插入 DOM;
- 列表内容靠“加载更多”或滚動触發,首屏 HTML 里只有骨架;
- 連結由脚本拼接,原始 HTML 中没有可解析的 a 标簽;
- 單頁應用路由跳轉,切換頁面不产生新的 HTML 請求。
這些寫法對用戶没問题,對蜘蛛来说却多了一道工序:先抓到空壳,再等待渲染。工序越多,出错的概率越高。
渲染环节常见的三種损耗
内容没错,但出現得晚
渲染是有队列的,重要頁面通常排在前面,長尾頁面可能要等更久。如果你更新了内容却迟迟没有反馈,先確認它是不是必须渲染才能被看到。
連結不在原始 HTML 里
URL 發現主要依赖原始响應。如果内鏈全靠脚本生成,新頁面的發現速度就會明顯落後于内容更新速度,Sitemap 只能补位,無法完全替代。
渲染失敗,頁面變成空壳
脚本报错、接口被拦、依赖的第三方资源加载超时,都可能让渲染结果和用戶看到的不一致。蜘蛛拿到的是一張白纸,頁面就等于不存在。
怎么判断頁面是否依赖渲染
- 用 curl 或關閉 JavaScript 的浏览器訪問,看首屏有没有正文和連結;
- 在搜尋资源平台的 URL 检查里對比原始 HTML 和渲染後的 HTML;
- 翻服務器日誌,看資料接口的請求是否来自搜尋引擎的渲染节点;
- 抽查几篇没被索引的頁面,確認它們在原始 HTML 里是不是空的。
把渲染依赖降下来的做法
- 關键内容直出:标题、正文、核心連結由服務端渲染,脚本只做增强;
- 連結用 a 标簽:導航、分頁、相關推荐尽量輸出可解析的静態連結;
- 预渲染兜底:對确實無法服務端渲染的頁面,提前生成一份静態快照;
- Sitemap 补齐:把重要 URL 寫進 Sitemap,减少對脚本發現連結的依赖;
- 保持接口稳定:渲染节点請求的資料接口不要做 UA 或频率拦截。
抓取解决的是“有没有拿到”,渲染解决的是“能看懂多少”。两步都顺畅,URL 才有机會往後走。
回头检查站点时,可以先問自己一句:把 JavaScript 關掉,這個頁面還剩什么?剩下的部分越多,蜘蛛理解你的成本就越低。