入口页做得好不好看,和蜘蛛能不能读懂,是两件事。很多站点用前端框架搭入口页,自己在浏览器里看到内容齐全、链接可点,但抓取端拿到的初始 HTML 可能只有一个空壳。蜘蛛池的入口页承担的是“被发现”这件事,如果真正有用的链接只存在于渲染之后,效果就会明显打折扣。
为什么同一个页面会有两份内容
搜索引擎抓取大致分两步:先请求 HTML,拿到原始响应;之后视情况决定是否执行页面里的 JavaScript,再得到一份渲染后的 DOM。渲染要消耗资源,需要排队,也不是每个 URL 都会做。对于入口页这种以链接发现为主要目的的资源,把关键内容押在第二步上,本身就是风险。
常见的几种渲染坑
- 链接由 JavaScript 动态插入,初始 HTML 里根本没有 a 标签;
- 正文通过接口异步拉取,初始 HTML 只有一个空容器;
- 前端路由用 hash,或者需要点击才生成真实 URL;
- 关键跳转绑在按钮上,链接地址只写在事件里;
- 脚本报错或第三方接口超时,页面直接停在半成品状态;
- robots.txt 顺手屏蔽了 JS 和 CSS 文件,渲染自然做不出来。
几个低成本的自查动作
- 用 curl 或抓取工具的文本视图看初始响应,确认里面有没有链接和正文;
- 在浏览器里关掉 JavaScript 打开入口页,看到的就是最保守的版本;
- 看服务器日志里蜘蛛请求的返回字节数,明显偏小的多半是空壳;
- 用搜索平台的 URL 检查类工具,对比渲染前后 DOM 里 a 标签的数量变化;
- 对比渲染前后的页面文本长度,差距过大就要警惕。
哪些内容建议保持静态
入口页不需要复杂交互,把下面这些直接写进初始 HTML 就够了:
- 通向下一层的核心链接和分页入口;
- 页面内的导航与内链;
- 说明性文字、标题、简单摘要;
- 结构化数据标记。
而统计代码、装饰性模块、需要用户触发才有意义的交互,放在脚本里问题不大。判断标准很简单:这个元素对发现 URL 有没有帮助,有帮助就静态化。
要不要上服务端渲染或预渲染
如果入口页本来就靠前端框架生成,可以考虑服务端渲染、预渲染或纯静态输出。三者各有代价:服务端渲染增加服务器压力和维护复杂度,预渲染多一道构建流程,纯静态最省心但对动态内容不友好。入口页通常内容变动不频繁,纯静态或者预渲染往往更划算,不必为了技术时髦把链路做复杂。
和整条抓取链路的配合
- 控制 HTML 体积,别让一个入口页拖到几百 KB;
- 减少阻塞渲染的第三方脚本,尤其是广告和统计;
- 检查 robots.txt 有没有误伤 JS、CSS 这类静态资源;
- 给渲染失败留兜底,比如 noscript 里的基础链接;
- 改动后观察日志里蜘蛛请求的变化,别只看自己浏览器。
渲染不是不能用,而是要知道蜘蛛到底拿到了什么。入口页的首要任务是让 URL 被发现,把这件事交给最稳的那一层去做。
说到底,入口页不需要像产品页那样追求体验,稳定、可解析、链接清楚,比炫技重要得多。