在蜘蛛池或站点运营中,为了让入口页看起来更“干净”或方便统一管理,有人会用 JavaScript 动态把目标链接插入到页面里。这种做法在浏览器里没问题,但搜索蜘蛛能否发现这些链接,取决于它是否执行脚本、执行到什么程度,以及链接最终有没有出现在可抓取的 HTML 中。
搜索蜘蛛不一定会执行 JavaScript
主流搜索引擎对 JavaScript 的处理能力不同。有的会排队渲染,有的只执行部分脚本,有的在初次抓取时只看原始 HTML。也就是说,链接如果只存在于脚本运行后的 DOM 里,蜘蛛有可能完全看不到。
即使搜索引擎支持渲染,也存在延迟和预算限制。入口页如果脚本复杂、依赖外部接口,或者渲染失败,动态插入的目标 URL 就不会进入待抓取队列。
常见的动态插入写法与风险
- 页面加载后写入 innerHTML:链接由脚本拼接后插入,原始 HTML 里没有 href,蜘蛛初次抓取时容易漏掉。
- 先请求接口再渲染列表:如果接口被 robots.txt 屏蔽、需要登录或返回不稳定,链接同样无法生成。
- 单页应用路由:页面切换依赖前端路由,地址栏变了但服务器返回的 HTML 没有对应链接,外部蜘蛛很难顺着发现目标 URL。
这些写法对用户体验可能没影响,但对 URL 发现来说,风险比直接输出 HTML 链接高得多。
怎么判断蜘蛛有没有拿到目标链接
- 查看入口页的服务器日志,确认搜索蜘蛛是否抓取了入口页,以及返回状态是否正常。
- 查看目标站的访问日志,看目标 URL 有没有被蜘蛛请求。如果入口页有抓取、目标站没有,问题可能出在链接未输出。
- 用抓取测试工具或“查看源代码”检查:在禁用 JavaScript 的情况下,目标链接是否仍然存在于 HTML 中。
- 用 curl 或类似工具请求入口页,对比返回的源码和浏览器渲染后的 DOM,看链接是否只出现在后者。
更稳妥的链接输出方式
- 优先服务端渲染:让服务器返回的 HTML 中直接包含目标链接的 a 标签,蜘蛛不需要执行脚本就能发现。
- 使用静态 HTML 入口页:如果入口页只是链接聚合,直接写死 HTML 最简单,也最容易被抓取。
- 做 noscript 兜底:虽然不能保证所有搜索引擎都读取,但至少给不执行脚本的蜘蛛留一条可见路径。
- 配合 sitemap 和其他内链:sitemap 不能替代页面链接,但可以作为辅助发现渠道,减少单一入口的依赖。
- 保持链接可点击:用真实的 a 标签包裹,href 指向目标 URL,避免只靠 onclick 或前端事件跳转。
容易踩的误区
有人会认为“搜索引擎现在都能渲染 JS,所以动态插入没问题”。实际上,渲染是额外步骤,不是所有页面都能进入渲染队列,渲染失败时链接就消失了。还有人只在浏览器里看到链接就以为蜘蛛也能看到,忽略了原始 HTML 和渲染后 DOM 的差异。
如果入口页的目标链接只存在于 JavaScript 执行结果中,就不要把它当成稳定的 URL 发现方式。先保证 HTML 源码里存在可抓取的链接,再考虑前端交互优化。
排查时可以从入口页日志、目标站日志和源码对比三步入手。确认蜘蛛能拿到链接,再谈抓取频率和后续运营,顺序会更清楚。