先分清抓取和渲染是两件事
搜索引擎处理一个页面,大致会经历两个阶段:抓取时先拿到服务器返回的 HTML 源码,渲染时再执行页面上的 JavaScript,把内容补全成用户看到的样子。这两步不是同时完成的,中间可能隔一段时间,也可能有些页面抓取之后并没有走到完整的渲染流程。如果正文完全依赖 JS 生成,抓取阶段拿到的就可能只是一个空壳。
这也是很多人遇到的情况:浏览器里打开页面一切正常,但查看源代码,或者在工具里看“蜘蛛视角”的页面,正文位置是空的。
哪些写法容易出问题
- 正文由前端框架在客户端请求接口后渲染,HTML 里只有一个挂载节点;
- 列表、推荐位、相关阅读都靠脚本插入,链接不是可点击的 a 标签;
- 分页用点击事件加载,第二页没有独立 URL;
- 关键信息只写在 JSON 接口里,页面本身没有任何输出。
这些问题不一定马上表现为收录异常,但会让页面在抓取阶段显得内容稀薄,进而影响后续的判断。
怎么确认蜘蛛实际拿到了什么
- 直接查看页面源代码(不是开发者工具里的元素面板),看正文是否出现在 HTML 里;
- 关掉 JavaScript 再打开页面,观察还剩下多少内容;
- 用抓取测试类工具请求该 URL,对比返回的原始 HTML 与渲染后的内容;
- 翻蜘蛛日志,看是否有渲染相关资源的请求,比如脚本文件、接口调用。如果日志里只有 HTML 请求,后面没有跟着脚本请求,这个页面很可能只走到了抓取这一步。
日志里出现脚本请求,只说明渲染有可能发生,并不等于内容一定被完整读到,还需要结合源码一起看。
能做的几件事
1. 让正文出现在首屏 HTML 里
最直接的做法是服务端渲染或预渲染,让服务器返回的 HTML 里就带着标题、正文和主要内链。不需要一上来就全站改造,优先处理那些你希望被收录的内容页即可。
2. 内链用真实的 a 标签
用 onclick 或前端路由代替 a href,用户点得动,但链接关系不会自然体现在 HTML 里。列表页、面包屑、上下篇导航这些位置,尽量输出标准链接。
3. 分页和筛选给独立 URL
如果第二页只能靠点击加载,发现路径就断掉了。哪怕内容仍然用脚本加载,URL 本身也应该可以被单独请求。
4. 别把所有内容都留在接口里
纯接口返回的数据,如果页面里没有任何对应输出,抓取阶段基本看不到。可以把关键字段同时写进页面。
按优先级处理,不必一步到位
全站改成服务端渲染成本不低,更实际的做法是先看哪些页面本身值得收录,把资源集中在这些页面上。详情页、栏目页通常优先,一些交互型页面即使渲染不完整,影响也有限。
另外,渲染慢、脚本阻塞严重,也会拖长单个页面的处理时间。在解决渲染问题的同时顺手看一下加载性能,往往能一起改善。