把目标链接用 JavaScript 动态插入入口页,是很多人图省事的做法:改一个数据文件就能批量换链接。但搜索蜘蛛能不能看到这些链接,答案并不是简单的“能”或“不能”,而是取决于它有没有走到渲染这一步,以及渲染有没有成功。
搜索蜘蛛处理 JS 的两个阶段
主流搜索引擎抓取一个页面,通常分两步走:先用抓取器拿到服务器返回的原始 HTML,把它放进待处理队列;之后如果判断页面需要渲染,再排一次队,用无头浏览器执行 JS,拿到渲染后的 DOM,从中提取链接和内容。
问题就出在第二步。渲染是额外开销,需要排队,也需要抓取预算。入口页本身如果内容单薄、数量又多、更新还频繁,渲染队列的排期可能很长,甚至部分页面根本轮不到渲染。不同搜索引擎的渲染能力差别也很大,有的对 JS 渲染支持比较完整,有的仍然以初始 HTML 为主要依据。
哪些写法最容易让链接被漏掉
- 点击后才加载。链接藏在“展开更多”、分页按钮、Tab 切换后面,不点击就不出现在 DOM 里,渲染器一般不会去点。
- 滚动到底才出现。无限滚动或懒加载,首屏 DOM 里没有目标链接。
- 接口返回后再拼 DOM。前端先请求接口拿 JSON,再用脚本生成 a 标签,任何一步失败或超时,链接就没了。
- URL 由字符串拼接生成。没有写死在 HTML 里的 href,抓取器只能靠执行结果推断。
- JS 文件本身被 robots.txt 挡住。渲染器拿不到脚本,自然渲染不出链接。
这些写法在浏览器里看着完全正常,但对抓取器来说,初始 HTML 里可能一个目标链接都没有。
想让链接稳定被发现,可以这样调整
- 关键入口页尽量服务端渲染。让目标链接在服务器返回的 HTML 里就存在,不依赖浏览器执行。
- 用真实的 a 标签和 href。避免用 onclick 跳转、div 绑定事件、window.location 赋值来替代链接。
- 首屏就要有内容。把需要被发现的目标链接放在页面靠前、不需要交互的位置。
- 用 sitemap 做补充。页面内链接负责发现,sitemap 负责兜底,两者并不冲突。
- 控制单页链接数量。链接太多、模板太像,分配到这一个页面的抓取预算会被摊薄。
怎么确认搜索蜘蛛到底拿到了什么
- 看服务器日志,区分请求原始 HTML 的抓取和请求 JS、静态资源的渲染请求,两者的 UA 与行为通常能看出来。
- 用站长平台提供的 URL 检查 / 抓取诊断工具,对比“原始 HTML”和“渲染后 HTML”里的链接差异。
- 本地用关闭 JS 的方式抓一次页面(例如 curl 或浏览器禁用 JS),看看还能剩下多少目标链接。
- 连续观察几天日志,看入口页被反复抓取时,目标 URL 是否出现在后续的抓取记录里。
判断标准很简单:如果关掉 JS 后页面里一个目标链接都不剩,那这些 URL 能否被发现,就只能靠渲染队列的排期了。
几个常见误区
第一种误区是“能渲染就等于一定被发现”。渲染只是必要条件,不是充分条件,渲染失败、排队太久、页面被判定为低价值,都会让链接长期停留在“已发现未抓取”的状态。第二种误区是把 JS 生成的链接当成高质量外链,实际上它首先解决的是发现路径问题,和权重、排名的关系是两回事。第三种误区是入口页全部套用同一种前端模板,一旦渲染环节出问题,整批链接会一起消失。
总的来说,JS 动态插入的目标链接不是不能用,但不适合当作唯一通道。把服务端可读的 HTML 链接当作主路径,把 JS 渲染当作补充,再配合日志和抓取工具做验证,才是相对稳妥的做法。