为什么入口页会出现「空壳」
越来越多的入口页用前端框架搭建:导航、列表、正文都由脚本在浏览器里拼出来。用浏览器访问时一切正常,但蜘蛛发起的是一次普通的 HTTP 请求,它首先拿到的只是服务端返回的原始 HTML。如果这份 HTML 里既没有实质内容,也没有可以跟随的链接,后续的抓取与 URL 发现都会受影响。
需要说明的是,部分搜索引擎的蜘蛛具备渲染能力,但渲染通常排在队列里,存在明显延迟,而且每个 URL 的渲染预算有限。把关键内容放在脚本执行之后,等于把不确定性留给了自己。
三种常见的情况
一、内容全部由脚本生成
原始 HTML 里只有一个空的容器和一段脚本,标题、正文、内部链接都要等脚本跑完才出现。这类页面在原始响应中几乎是空白的。
二、正文在 HTML 里,链接靠脚本注入
这是更隐蔽的一种:页面文字能抓到,但导航、分页、相关推荐是脚本渲染的。蜘蛛顺着原始 HTML 走不到更深一层,URL 发现自然就慢下来。
三、懒加载与延迟渲染
列表滚动到底部才加载下一屏,或者内容延迟一段时间才出现。蜘蛛通常不会滚动,也不会等待太久,看到的就是第一屏甚至空白。
怎么确认自己的入口页有没有问题
- 用 curl 或类似工具请求一次 URL,检查返回的原始 HTML 里有没有正文关键词和 a 标签。
- 在浏览器里禁用 JS 再打开页面,如果呈现空白或没有任何链接,问题基本可以确认。
- 对比服务端日志:如果蜘蛛对 JS、CSS 等静态资源的请求占比异常高,说明它可能在尝试渲染。
- 抽查若干入口页,看 title、h1、正文首段是否直接出现在 HTML 源码中。
几种务实的处理方式
- 服务端渲染:首屏内容由服务端直出,脚本只做交互增强,这是最稳妥的做法。
- 预渲染:在构建阶段或请求时生成静态 HTML,作为蜘蛛看到的版本。
- 关键链接静态化:导航、分页、列表链接尽量用原生 a 标签写在 HTML 中,不要依赖点击事件跳转。
- noscript 兜底:放一段最基础的内容与链接,成本低,对不执行脚本的蜘蛛有帮助。
- 控制首屏依赖:把决定页面主题的文字、标题放在靠前位置,不必等所有资源加载完毕。
几个容易踩的坑
不要因为某一次抓取看起来正常,就假设渲染一定会发生。是否渲染、何时渲染,并不完全由自己掌握。
- 把入口页做成加载中的骨架屏,原始 HTML 里就是一片占位块。
- 用按钮加事件代替链接,源码里没有可供跟随的 href。
- 以为提交了 sitemap 就足够,页面本身缺少链接出口,发现效率依然有限。
写在最后
入口页的核心任务是把蜘蛛接进来、把 URL 送出去。凡是需要脚本执行才能看到的内容和链接,都值得先问一句:如果这段脚本不运行,页面还剩什么。答案越具体,入口页就越可靠。