常见問题

入口頁連結是 JavaScript 動態插入的,搜尋蜘蛛會跟進目标 URL 吗?

入口頁用 JavaScript 動態插入目标連結时,搜尋蜘蛛能否發現,取决于是否执行脚本以及渲染是否成功。本文說明渲染的前提條件、几種常见寫法的風險差异,以及用日誌驗證和改成服務端輸出連結的實用做法。

常见問题

入口頁連結是 JavaScript 動態插入的,搜尋蜘蛛會跟進目标 URL 吗?

在蜘蛛池的實际操作里,很多入口頁為了省事,把目标連結用 JavaScript 動態塞進頁面:要么是前端框架渲染,要么是 fetch 拿到資料後再 innerHTML 寫入。這種做法對普通訪客没什么問题,但對搜尋蜘蛛来说,能不能看到連結、能不能跟進,取决于它有没有执行脚本。

先分清:連結是在 HTML 里,還是脚本执行後才出現

搜尋蜘蛛抓到一個 URL,第一步拿到的是服務器返回的原始 HTML。如果連結寫在 HTML 源碼里,它讀一遍就能發現;如果連結是脚本執行後才生成的,那原始 HTML 里可能只有一段 script 和几個空 div,蜘蛛在第一步是看不到任何目标 URL 的。

現在的搜尋引擎大多具备渲染能力,會把頁面放進類似浏览器的环境里执行 JS,然後再解析一次。但這件事有几個前提:

  • 渲染资源能被抓取:JS 文件本身如果被 robots.txt 屏蔽、被 CDN 拦截或返回 403,渲染就無從谈起。
  • 資料接口能被訪問:异步拿資料的 API 如果要求登入態、带校驗头或對 IP 有频率限制,渲染时可能拿不到内容。
  • 渲染會排队:渲染比抓 HTML 贵得多,往往不是抓完立刻渲染,延迟從几小时到几天都常见。

几種常见的 JS 寫法,風險並不一样

  1. 框架渲染(SPA):首屏 HTML 基本是空壳,連結全部靠 JS 生成。能被渲染,但依赖渲染队列,發現速度慢,且一旦渲染失敗就什么都發現不了。
  2. innerHTML / appendChild 插入:同样是执行後才出現,逻辑上和 SPA 類似,只是頁面其他部分還有内容,蜘蛛至少知道這個頁面存在。
  3. document.write 拼連結:寫法老舊,在部分渲染环境下行為不稳定,容易只輸出一部分。
  4. 点击後才加载:連結藏在按钮、标簽頁、折叠面板後面,需要交互才出現。渲染器通常不會主動点击,這類連結被發現的概率很低。
  5. 图片或 canvas 里的連結:對蜘蛛来说就是一張图,没有可解析的 URL。

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

不要靠猜。比較稳的做法是看服務器日誌:把入口頁的訪問日誌按 UA 和路径拆開,观察两種請求——一種是抓 HTML 的,一種是後續去拉静態资源和接口的。如果日誌里只有前者,没有任何 JS、CSS 或接口請求,說明渲染這一步没發生,頁面里的目标連結自然也没被發現。

可以同时做個小實驗:在入口頁里放一個纯 HTML 的普通連結,再放一個 JS 插入的連結,两者指向不同的目标 URL,過一段時間看日誌里哪個先出現。這样能比較直观地判断你的站点目前處于哪種情况。

渲染不是一定會發生,而是可能發生、通常延迟。把 URL 發現的希望全押在渲染上,風險偏高。

更稳妥的做法

  • 關键連結寫進 HTML:入口頁至少保證有一份服務端輸出的静態連結列表,JS 只用来做增强。
  • 服務端渲染或预渲染:让返回的 HTML 里就带着目标 URL,蜘蛛抓一次就能拿到。
  • 配合 sitemap 和内部連結:sitemap 提交一批,入口頁静態連結带一批,两邊的分工可以按站点規模来定。
  • 別把接口放在墙後:给渲染用的資料接口,尽量允许無登入訪問,並避免對同一 IP 做過嚴的频率限制。
  • 控制數量與层級:入口頁連結數量适中,目标頁再往下有正常的内鏈结构,避免所有發現路径都压在單一頁面上。

總结一句:JS 動態插入的連結不是绝對發現不了,而是把能不能被抓到變成了一個多條件叠加的問题。入口頁這種需要稳定輸出 URL 的场景,能静態就静態,JS 当补充而不是主力。