常见問题

蜘蛛池入口頁用 JS 動態插入連結,搜尋蜘蛛還能發現目标 URL 吗?

入口頁用前端框架渲染时,目标連結常常不在初始 HTML 里,搜尋蜘蛛需要通過渲染才能發現。本文說明渲染抓取的排队與失敗風險,区分容易被發現和容易漏掉的几種寫法,给出禁用 JS 驗證、看日誌区分入口頁與目标 URL 抓取等排查方法,並建议把關键連結寫進初始 HTML,或用 SSR、sitemap 兜底。

常见問题

蜘蛛池入口頁用 JS 動態插入連結,搜尋蜘蛛還能發現目标 URL 吗?

為什么很多入口頁的連結在源碼里看不到

用 Vue、React 這類框架做入口頁时,連結往往是组件渲染出来的。查看頁面源代碼,只能看到空的容器和一段脚本,真正的 a 标簽要等浏览器执行完 JS 才會出現。抓取端如果只讀原始 HTML,就什么連結都拿不到。

這就带来一個常见困惑:明明頁面上点得到目标 URL,抓取日誌里却始终没有它的身影。問题通常不在目标 URL,而在入口頁的連結根本没進入可讀的 DOM。

搜尋蜘蛛對 JS 的處理方式

主流搜尋引擎的抓取大致分两步:先抓原始 HTML、從中提取連結,再把頁面放進渲染队列执行 JS。渲染不是必做動作,而是有预算、要排队的。這带来三個實际影响:

  • 發現延迟:連結可能不在第一次抓取时被發現,而要等渲染完成後進入下一轮队列,中間可能隔几天甚至更久。
  • 渲染失敗就断鏈:JS 报错、接口超时、脚本资源被 robots.txt 屏蔽,渲染出来的 DOM 里自然没有連結。
  • 依赖交互的不算數:点击按钮、滚動到底、切換标簽頁才出現的連結,渲染通常不會主動触發,被發現的可能性极低。
渲染能力是补充手段,不是保底方案。把關键連結交给 JS,等于把 URL 發現的時間表交到別人手里。

哪些寫法容易被發現,哪些容易漏

相對容易被處理

  • 首屏直接渲染、不依赖接口返回的静態連結;
  • 連結在初始 HTML 里就存在,JS 只负责样式或排序;
  • 使用了服務端渲染(SSR)或预渲染,返回的 HTML 本身已经带 a 标簽。

容易漏掉

  • 連結資料来自异步接口,且接口需要登入、校驗 Referer 或簽名;
  • 懒加载组件,只有進入视口才發起請求、才寫入連結;
  • 連結拼在事件回調里,只有用戶点击後才出現在 DOM 中;
  • 整頁由 canvas 或第三方组件绘制,DOM 里根本没有 href。

怎么驗證自己的入口頁有没有被讀到

  1. 在浏览器里禁用 JavaScript,打開入口頁,看源碼或 DOM 里還有没有目标連結。
  2. 用抓取端的视角驗證:只發一次 GET、不做渲染,检查返回的 HTML 是否包含目标 URL。
  3. 结合服務端日誌观察,注意区分“入口頁被抓”和“目标 URL 被抓”,這是两件事。
  4. 看日誌里有没有渲染器(User-Agent 中常带 render 字样)的訪問,以及渲染請求是否真的加载了你的接口。

更稳妥的做法

如果入口頁的主要目的就是让目标 URL 被發現,建议:

  • 關键連結放進初始 HTML,哪怕只是一個简單的静態列表;
  • 必须用前端框架时,上 SSR 或预渲染,让首屏 HTML 自带連結;
  • 用 sitemap 做兜底,但要清楚它提供的是候選地址,不保證被抓取;
  • 不要用隐藏文本或伪装内容去堆連結,一旦被识別,代價遠大于收益。

小结

JS 動態插入的連結,搜尋蜘蛛有可能通過渲染發現,但這個概率受渲染预算、頁面复杂度、接口可用性影响,不可控。做 URL 發現时,能寫死在 HTML 里的連結,就別留给 JS;确實需要動態渲染,就把渲染鏈路(接口、报错、资源加载)一起排查,而不是只盯着入口頁本身。