在蜘蛛池的实际操作里,很多入口页为了省事,把目标链接用 JavaScript 动态塞进页面:要么是前端框架渲染,要么是 fetch 拿到数据后再 innerHTML 写入。这种做法对普通访客没什么问题,但对搜索蜘蛛来说,能不能看到链接、能不能跟进,取决于它有没有执行脚本。
先分清:链接是在 HTML 里,还是脚本执行后才出现
搜索蜘蛛抓到一个 URL,第一步拿到的是服务器返回的原始 HTML。如果链接写在 HTML 源码里,它读一遍就能发现;如果链接是脚本运行后才生成的,那原始 HTML 里可能只有一段 script 和几个空 div,蜘蛛在第一步是看不到任何目标 URL 的。
现在的搜索引擎大多具备渲染能力,会把页面放进类似浏览器的环境里执行 JS,然后再解析一次。但这件事有几个前提:
- 渲染资源能被抓取:JS 文件本身如果被 robots.txt 屏蔽、被 CDN 拦截或返回 403,渲染就无从谈起。
- 数据接口能被访问:异步拿数据的 API 如果要求登录态、带校验头或对 IP 有频率限制,渲染时可能拿不到内容。
- 渲染会排队:渲染比抓 HTML 贵得多,往往不是抓完立刻渲染,延迟从几小时到几天都常见。
几种常见的 JS 写法,风险并不一样
- 框架渲染(SPA):首屏 HTML 基本是空壳,链接全部靠 JS 生成。能被渲染,但依赖渲染队列,发现速度慢,且一旦渲染失败就什么都发现不了。
- innerHTML / appendChild 插入:同样是执行后才出现,逻辑上和 SPA 类似,只是页面其他部分还有内容,蜘蛛至少知道这个页面存在。
- document.write 拼链接:写法老旧,在部分渲染环境下行为不稳定,容易只输出一部分。
- 点击后才加载:链接藏在按钮、标签页、折叠面板后面,需要交互才出现。渲染器通常不会主动点击,这类链接被发现的概率很低。
- 图片或 canvas 里的链接:对蜘蛛来说就是一张图,没有可解析的 URL。
怎么验证自己的入口页到底有没有被读到
不要靠猜。比较稳的做法是看服务器日志:把入口页的访问日志按 UA 和路径拆开,观察两种请求——一种是抓 HTML 的,一种是后续去拉静态资源和接口的。如果日志里只有前者,没有任何 JS、CSS 或接口请求,说明渲染这一步没发生,页面里的目标链接自然也没被发现。
可以同时做个小实验:在入口页里放一个纯 HTML 的普通链接,再放一个 JS 插入的链接,两者指向不同的目标 URL,过一段时间看日志里哪个先出现。这样能比较直观地判断你的站点当前处于哪种情况。
渲染不是一定会发生,而是可能发生、通常延迟。把 URL 发现的希望全押在渲染上,风险偏高。
更稳妥的做法
- 关键链接写进 HTML:入口页至少保证有一份服务端输出的静态链接列表,JS 只用来做增强。
- 服务端渲染或预渲染:让返回的 HTML 里就带着目标 URL,蜘蛛抓一次就能拿到。
- 配合 sitemap 和内部链接:sitemap 提交一批,入口页静态链接带一批,两边的分工可以按站点规模来定。
- 别把接口放在墙后:给渲染用的数据接口,尽量允许无登录访问,并避免对同一 IP 做过严的频率限制。
- 控制数量与层级:入口页链接数量适中,目标页再往下有正常的内链结构,避免所有发现路径都压在单一页面上。
总结一句:JS 动态插入的链接不是绝对发现不了,而是把能不能被抓到变成了一个多条件叠加的问题。入口页这种需要稳定输出 URL 的场景,能静态就静态,JS 当补充而不是主力。