蜘蛛池入口页的目标很单纯:让搜索引擎爬虫能访问到、能读到内容、能顺着链接往下走。但很多入口页在浏览器里看着正常,爬虫拿到的却是一具空壳,原因往往出在渲染方式上。这篇把“静态输出还是 JS 渲染”这个问题拆开讲,给一个可执行的判断思路。
爬虫拿到的是响应体,不是浏览器画面
浏览器打开页面时,先下载 HTML,再执行 JavaScript,把内容填进去,人眼看到的是执行之后的结果。搜索引擎爬虫虽然也具备执行 JS 的能力,但那是有前提的:需要排队、需要额外资源,也可能因为各种原因没有执行。而蜘蛛池里的入口页通常量大、内容薄、生命周期偏短,最不划算的就是让爬虫多绕一道。
判断标准很简单:不看浏览器里长什么样,看第一次响应里有什么。如果 HTML 源码里只有几个容器标签和一段脚本,正文、链接全靠 JS 拼出来,那这条路就多了一层不确定性。
两种做法各适合什么场景
服务端直出静态 HTML
- 响应体里直接带着标题、正文,以及指向目标页的 a 标签链接。
- 爬虫抓一次就拿到全部信息,不需要等待渲染。
- 内容体量小的入口页几乎没有额外成本,主机压力也低。
- 调试直观:用命令行拉一次,就能看到爬虫能看到的版本。
前端 JS 渲染
- 适合内容由接口驱动、需要频繁变动的站点,但入口页通常不属于这一类。
- 单页应用如果只做前端路由跳转,链接可能不是真正的 a 标签,蜘蛛顺着走不动。
- 渲染服务本身可能被限速或被拦,等于给自己加了一道关卡。
容易出问题的几个细节
- 链接不是链接:用点击事件或路由跳转实现的导航,爬虫识别不到 href,入口页等于没有出口。
- 内容藏在接口里:正文靠前端请求数据再拼装,响应体里空无一物。
- 渲染超时或报错:脚本报错、第三方资源卡住,页面就停在空白状态。
- 懒加载过度:链接和正文都要滚动才出现,对自动抓取不友好。
上线前的自查步骤
- 用 curl 或 wget 拉一次原始 HTML,看正文和链接在不在里面。
- 在浏览器里查看源代码(不是“检查元素”),确认内容不是执行后才出现的。
- 关掉 JavaScript 再打开一次页面,看看还剩多少可读内容。
- 检查跳转是不是真的 a 标签,href 是不是可访问的路径。
- 必要时用搜索引擎提供的 URL 检查工具,看一下抓取到的快照版本。
确实需要渲染时的折中办法
有些页面离不开 JS,那就考虑预渲染或动态渲染:对普通用户走正常流程,对识别出的爬虫 UA 直接返回渲染好的静态 HTML。这条路可行,但要注意两点:一是返回给爬虫的内容要和给用户的一致,不要做两套;二是渲染服务本身要稳定,别在抓取高峰期掉线,否则一批入口页会同时失效。
入口页的第一原则是“能被低成本地读懂”,而不是前端技术多先进。渲染越重,中间环节越多,出问题的机会也越多。
小结
绝大多数蜘蛛池入口页,静态输出就够了,而且更稳。只有在内容确实依赖接口、又无法在服务端预生成时,才考虑引入渲染方案,并且一定要先做完上面那几步自查。把“爬虫第一次请求能拿到什么”当成上线前的固定检查项,比事后翻服务器日志找原因省事得多。