先理解搜索蜘蛛对 JS 的处理
搜索蜘蛛抓取页面时,第一遍通常只拿到服务器返回的 HTML 源码。如果入口页里的链接是 JavaScript 运行后再插入 DOM 的,源码里可能完全没有这些 URL。搜索引擎会有一个渲染队列,把需要执行 JS 的页面排进去,但渲染有延迟、有配额,也不保证每个页面都会走到渲染这一步。
不同搜索引擎的渲染能力不一样。有的渲染较快,有的主要依赖静态 HTML;同一个搜索引擎,入口页权重低、抓取频率低时,渲染队列也可能排得更久。所以把 URL 发现完全押在 JS 链接上,风险较高。
哪些写法容易被漏掉
- 用 document.write 或 innerHTML 批量插入的 a 标签,源码里没有 href。
- 点击按钮后才通过事件监听跳转,且没有可爬取的 a 标签。
- 链接放在前端框架的组件里,服务端返回的只是空壳 HTML。
- 用 JS 拼接 URL,例如 base + id,蜘蛛看不到最终地址。
这些写法对用户可能正常,对搜索蜘蛛的 URL 发现就不一定友好。
更稳妥的入口页做法
如果目的是让搜索蜘蛛发现目标 URL,入口页优先用服务端能输出的静态 a 标签。链接直接写在 HTML 里,href 是完整或可解析的 URL,蜘蛛第一遍抓取就能看到。
- 服务端渲染(SSR)或静态生成,把链接输出到源码。
- 如果必须用前端框架,使用预渲染,给爬虫返回带链接的 HTML。
- 在 noscript 中放一份关键链接,但不要只依赖 noscript。
- 分页或列表入口保留传统 a 标签,不全部改成按钮点击。
注意:noscript 里的链接不是所有搜索引擎都会跟进,能静态输出时优先静态输出。
已经用了 JS,怎么检查有没有被发现
可以看服务器日志和搜索蜘蛛的抓取记录。重点观察两点:蜘蛛有没有请求入口页的 JS 文件;请求 JS 之后,有没有接着请求目标 URL。如果只看到入口页和 JS 文件被请求,目标 URL 一直不出现,说明渲染后链接可能没有被执行或没有被跟进。
还可以做小范围测试:把其中几条链接改成静态 a 标签,观察日志里目标 URL 是否更快出现。对照测试比单纯猜测可靠。
蜘蛛池投放时怎么配合
蜘蛛池的作用是提供更多入口和抓取路径,但它不能替代入口页本身的可抓取性。入口页如果是纯 JS 链接,蜘蛛池带来的抓取可能只停在入口页。把入口页改成静态链接,或者让蜘蛛池入口指向已经静态输出链接的页面,URL 发现效率通常更可控。
另外,不要为了 JS 链接而堆砌大量入口页。链接数量不是越多越好,入口页质量、链接是否可解析、目标页是否可访问,这些都会影响发现效果。投放后持续看日志,按实际抓取情况调整,而不是一次性铺开就不管。