做蜘蛛池的人常问一个问题:入口页里的链接和文字,蜘蛛到底看不看得见?答案取决于页面是怎么“长”出来的。同一段 HTML 源码,经过不同的渲染方式,蜘蛛拿到的内容可能完全不一样。
先分清:源码和渲染结果是两回事
用浏览器打开页面时看到的完整效果,是浏览器执行了 HTML、CSS、JavaScript 之后的结果。而爬虫拿到的第一份东西,通常只是服务器返回的原始 HTML 源码。如果关键内容靠 JS 动态写入,源码里可能空空如也,蜘蛛第一次访问时自然读不到东西。
三种常见渲染方式的实际差别
- 服务端直出(静态 HTML):链接、标题、正文都在源码里,任何爬虫都能直接读到,最省事也最稳。
- 服务端渲染(SSR):内容在服务器上拼好再返回,效果接近静态页,但需要框架和运行环境支撑。
- 客户端渲染(CSR):源码只有骨架,内容靠浏览器执行 JS 再填充,对不执行 JS 的爬虫等于一张空白页。
主流搜索引擎的爬虫大多具备渲染能力,但渲染通常要排队、有配额,也可能超时失败。换句话说,能渲染不代表一定会渲染,更不代表每次都能拿到完整结果。
判断蜘蛛实际看到了什么
不要靠猜,可以按这几步验证:
- 查看服务器日志,看爬虫是否请求了页面里的 JS 文件,以及请求的时间顺序。
- 把浏览器 JavaScript 关掉再打开入口页,对比还能看到多少文字和链接。
- 用抓取模拟工具或搜索平台的抓取测试功能,查看返回的渲染快照。
- 留意渲染耗时,如果首次内容出现要好几秒,被抓取时更容易中断。
容易踩的几个坑
- 把内链放在 JS 里生成,或者点击后才加载,源码中拿不到可读的 href。
- 用无限滚动、懒加载承载主要链接,蜘蛛不滚动就等于看不到。
- 首屏内容被弹窗、遮罩或全屏 loading 盖住,渲染快照里只剩一层壳。
- 接口返回慢或跨域失败,页面渲染到一半就停在空白状态。
落地建议
对蜘蛛池入口页来说,稳定的做法是让关键内容走服务端输出:入口页的标题、正文片段、目标链接尽量直接写在返回的 HTML 里,JS 只承担统计、交互这类增强功能。如果技术栈只能做客户端渲染,至少要保证核心链接在源码中有可读的兜底形式,比如放在 noscript 之外的静态列表里,或者单独给蜘蛛留一条直出路径。
渲染方式只影响蜘蛛能否读到内容,不等于读了就会收录,最终仍要看页面质量和站点整体情况。
把渲染方式理顺之后,入口页的抓取路径才谈得上可控。与其等抓取异常了再回头排查,不如在建页阶段就把“源码里究竟有什么”这件事先定下来。