把链接交给 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 还没稳定流程就结束,链接来不及出现。
想稳定一点,可以这样做
- 把关键链接写成静态 a 标签放在原始 HTML 里,JS 只用来做增强,而不是唯一来源。
- 确认 JS、CSS 资源本身可以被抓取,路径别落在 robots.txt 的 Disallow 规则里。
- 能用服务端渲染或预渲染的,就把链接直接写进返回的 HTML。
- 入口页数量与自身抓取能力匹配,别一次铺太多,导致渲染排队排到很后面。
- 用日志验证渲染是否真的发生,而不是凭感觉判断。
从日志判断渲染有没有发生
- 看有没有蜘蛛请求 JS、CSS 等资源。只抓了一个 HTML、完全没有资源请求,通常说明没进渲染。
- 看渲染请求是否出现过。部分搜索引擎的渲染请求会带不同的 UA 或标识,可以对比观察。
- 看目标 URL 有没有抓取记录。入口页天天被抓、目标页一直没动静,多半就是链接没被发现。
发现只是第一步。即使目标 URL 被正确抽取,后面还有抓取、解析、索引等多个环节,任何一个环节卡住都不会有结果,不要把它当成确定性的收录手段。
两个常见误区
- 把 JS 链接和静态链接视为等价,实际上两者的发现概率和速度差距不小。
- 以为入口页铺得越多,渲染就越快,实际情况往往是排队更长。
如果你在跑蜘蛛池入口页,又希望链接能被稳定发现,最省事的做法还是“静态为主、JS 为辅”:关键链接写在原始 HTML 里,JS 负责交互和补充。至于能发现多少、多久发现,交给抓取日志去回答,比靠猜测靠谱。