常见问题

蜘蛛池入口页的链接用 JavaScript 动态插入,搜索蜘蛛会执行并发现目标 URL 吗

入口页链接用 JS 动态插入,搜索蜘蛛未必能在同一次抓取里发现目标 URL,关键要看它有没有进入渲染阶段。本文说明渲染抓取的两个阶段、哪些写法容易被抽取、哪些容易漏掉,以及如何用日志判断渲染是否真的发生。

常见问题

蜘蛛池入口页的链接用 JavaScript 动态插入,搜索蜘蛛会执行并发现目标 URL 吗

把链接交给 JavaScript 动态插入,是不少蜘蛛池入口页的常见做法,原因是改起来方便、批量生成也快。但搜索蜘蛛能不能因此发现目标 URL,答案不是简单的“能”或“不能”,而是要看它有没有走到渲染那一步

搜索蜘蛛处理 JS 分两个阶段

多数主流搜索蜘蛛对 JavaScript 的处理不是一次完成的,而是分成两步:

  • 原始抓取阶段:先取回服务器返回的 HTML。如果链接只写在 script 标签里,这一步只能看到脚本文本,看不到任何目标 URL。
  • 渲染阶段:把页面放进渲染环境执行 JS,等 DOM 相对稳定后,再从渲染结果里抽取链接。

两个阶段之间往往有时间差,短的几分钟,长的几天。也就是说,入口页被抓过一次,并不代表目标 URL 已经被发现。

哪些写法更容易被发现

  • 原始 HTML 里就有静态 a 标签:最稳,完全不依赖渲染。
  • JS 在渲染时把 a 标签插入 DOM,且 href 是完整可解析的 URL:多数情况下渲染后能被抽取。
  • 只用数组存 URL、靠后续逻辑跳转或只做字符串展示:一般不会被当成链接。
  • onclick 里写 window.location:搜索引擎通常不把它当作链接处理。
  • 链接要等点击、滚动、hover 才插入:抓取时不会触发,效果等于没有。
  • 相对路径拼错、base 标签缺失:渲染后拿到的是坏 URL,等于白做。

现实中会影响发现的几个因素

  • 渲染配额:渲染比纯抓取昂贵得多,入口页数量越多,排队时间越长。
  • 资源被挡:JS 文件被 robots.txt 屏蔽,或被 CDN、WAF 拦截,渲染根本拿不到。
  • 接口依赖:链接数据靠 fetch 或 XHR 获取,接口需要登录态或被拦,渲染就拿不到数据。
  • 脚本报错:前面一句报错,后面的插入逻辑全部不执行。
  • 渲染超时:DOM 还没稳定流程就结束,链接来不及出现。

想稳定一点,可以这样做

  1. 把关键链接写成静态 a 标签放在原始 HTML 里,JS 只用来做增强,而不是唯一来源。
  2. 确认 JS、CSS 资源本身可以被抓取,路径别落在 robots.txt 的 Disallow 规则里。
  3. 能用服务端渲染或预渲染的,就把链接直接写进返回的 HTML。
  4. 入口页数量与自身抓取能力匹配,别一次铺太多,导致渲染排队排到很后面。
  5. 用日志验证渲染是否真的发生,而不是凭感觉判断。

从日志判断渲染有没有发生

  • 看有没有蜘蛛请求 JS、CSS 等资源。只抓了一个 HTML、完全没有资源请求,通常说明没进渲染。
  • 看渲染请求是否出现过。部分搜索引擎的渲染请求会带不同的 UA 或标识,可以对比观察。
  • 看目标 URL 有没有抓取记录。入口页天天被抓、目标页一直没动静,多半就是链接没被发现。
发现只是第一步。即使目标 URL 被正确抽取,后面还有抓取、解析、索引等多个环节,任何一个环节卡住都不会有结果,不要把它当成确定性的收录手段。

两个常见误区

  • 把 JS 链接和静态链接视为等价,实际上两者的发现概率和速度差距不小。
  • 以为入口页铺得越多,渲染就越快,实际情况往往是排队更长。

如果你在跑蜘蛛池入口页,又希望链接能被稳定发现,最省事的做法还是“静态为主、JS 为辅”:关键链接写在原始 HTML 里,JS 负责交互和补充。至于能发现多少、多久发现,交给抓取日志去回答,比靠猜测靠谱。