做蜘蛛池的人常把注意力放在入口页数量、域名和链接结构上,却容易忽略一个更基础的问题:入口页的正文和链接,到底是写在 HTML 里,还是靠 JavaScript 渲染出来的。这个差别会直接影响蜘蛛能不能在第一次抓取时就发现链接。
一、蜘蛛抓取的两个阶段
主流搜索引擎的抓取大体分两步:先抓原始 HTML,再决定是否进入渲染队列。第一步拿到的就是服务器直接返回的那份源码,速度快、成本低;第二步需要执行页面上的 JS,资源开销大得多,因此并不是每个页面都会被渲染,通常只有被判断为重要、且渲染队列有余量时才会排队。
对蜘蛛池入口页来说,这意味着:如果链接和正文都在 JS 里,蜘蛛第一次抓取时看到的很可能是一个空壳,URL 发现效率会明显下降。
二、哪些内容最容易在渲染前消失
- 由前端框架客户端路由生成的站内链接
- 通过 fetch 或 XHR 拉取后再插入 DOM 的列表
- 延迟加载、且原始 HTML 中没有给出 href 的内容
- 由 JS 动态写入的 canonical、hreflang 标签
- 点击后才渲染的分页或「下一页」按钮
这些内容在渲染后的 DOM 里存在,但在原始 HTML 中可能只有一两个容器标签。蜘蛛若跳过渲染,就相当于没看到。
三、蜘蛛池入口页的取舍:优先服务端输出
蜘蛛池的入口页大多由模板批量生成,本身结构简单,用服务端渲染或静态化输出的成本并不高。相比之下,把入口页做成纯前端应用,收益很小、风险很大。
入口页的职责是发现 URL、传递链接,不是展示复杂交互。能用 HTML 直接输出的,就不要留给 JS。
四、如果确实必须用 JS
- 关键链接用 a 标签加 href 写在服务端输出的 HTML 里,即使后续会被 JS 替换
- 提供 noscript 或降级版本,至少保证主链接可访问
- 对渲染成本高的页面做预渲染或静态快照
- 避免用 onclick 加跳转的方式代替真正的超链接
- 分页和列表首屏尽量内联输出,不要等接口返回
五、怎么验证蜘蛛看到了什么
最简单的办法是用 curl 请求入口页,或者直接查看「网页源代码」,看原始响应里是否包含目标链接。也可以对比「查看网页源代码」和「审查元素」的结果差异:前者更接近蜘蛛第一步看到的内容,后者是渲染后的 DOM。
再结合服务器访问日志,观察入口页被请求时是否伴随静态资源请求。如果日志里几乎只有 HTML 请求,而 JS 文件从未被拉取,说明渲染阶段可能根本没有发生。源码和日志这两份证据,比凭感觉判断靠谱得多。
六、几个常见误区
- 以为浏览器能看到,就等于蜘蛛能看到
- 以为提交了 sitemap 或做了 URL 推送,就能绕开渲染问题
- 以为 JS 渲染是更现代的做法,入口页也照搬
- 只检查首页,不检查分页和深层入口页
这些误区的共同点,是把用户体验层面的表现直接等同于抓取层面的表现,而两者并不总是一致。
写在最后
蜘蛛池的效果受很多因素影响,渲染方式只是其中一环,但它属于低成本可优化的一类。把入口页的关键链接和正文放回服务端输出的 HTML 里,通常比继续增加入口页数量更划算。至于最终能抓到多少、收录多少,取决于蜘蛛的调度策略和页面整体质量,没有哪种做法能给出保证。