这是做蜘蛛池和站点运营时被问得很多的一个问题:入口页的链接列表不是写死在 HTML 里的,而是页面加载后用 JavaScript 拼出来、再插入 DOM 的。这种情况下,搜索蜘蛛还能顺着这些链接发现目标 URL 吗?答案不是简单的“能”或“不能”,取决于链接最终出现在哪一层、渲染能力如何,以及链接本身是否可被提取。
先分清链接存在哪一层
搜索蜘蛛拿到一个 URL,第一步是抓取服务器返回的原始 HTML。如果链接只存在于 JS 执行之后的结果里,那它就不在原始 HTML中。搜索引擎是否愿意再执行一遍 JS、走渲染流程,取决于它的渲染策略和资源安排:原始 HTML 中的内容通常会被优先、更快地处理,渲染队列则可能延后,也可能因为资源紧张而跳过。
- 服务端直出:链接出现在原始 HTML 里,最容易被发现。
- 客户端渲染:链接要等 JS 执行后才出现,能否被发现依赖渲染队列。
- 混合模式:首屏直出、后续懒加载,往往只有一部分链接在原始 HTML 中。
哪些写法容易让链接“消失”
即便蜘蛛执行了 JS,下面这些写法也常导致链接提取不到:
- 用 div、span 之类的元素加点击事件代替标准链接标签,地址只写在脚本变量里。
- 链接是相对路径,拼接时多一层或少一层斜杠,生成出无效地址。
- 链接要等用户滚动、点击“加载更多”之后才插入页面。
- 链接来自接口返回值,而接口需要登录态或特定请求头。
- 链接被放进 shadow DOM 或 canvas 绘制的区域里。
怎么自测
- 打开页面“查看源代码”,搜索目标 URL 的路径片段,看它是否出现在原始 HTML 中。
- 在浏览器里禁用 JavaScript 再打开入口页,对比还能看到多少条链接。
- 查看服务器日志,确认目标 URL 上是否出现过蜘蛛的请求;没有请求,说明连发现这一步都没走通。
- 如果使用的是第三方抓取测试工具,注意它和真实蜘蛛的渲染行为并不完全一致,结果只能参考。
实操上可以怎么做
与其纠结蜘蛛会不会渲染,不如把不确定性降下来:
- 尽量让入口页的关键链接以标准链接形式、静态可读地出现在原始 HTML 中,服务端直出优先。
- 如果必须用 JS 渲染,至少保证首屏的链接直出,把渲染逻辑推迟到非关键部分。
- 控制入口页的链接总数和嵌套层级,别让重要目标 URL 埋在很深的节点里。
- 不要把发现路径压在入口页一个点上,sitemap 和主动提交可以并行使用,互相补位。
- 入口页内容保持一定更新频率,方便观察蜘蛛的访问是否稳定。
渲染只是“发现”环节的一环。被发现不等于会被抓取,被抓取也不等于会被收录。入口页方案应当作为提高发现概率的手段,而不是对结果的保证。