搜尋抓取

JS 渲染出的連結:搜尋蜘蛛在哪一步才看到這些 URL

很多站点的列表頁、導航和商品卡片由 JavaScript 生成,連結在原始 HTML 里並不存在。搜尋蜘蛛第一次抓取时可能只看到空容器,要等渲染队列處理後才见到 URL。這篇文章梳理原始 HTML、渲染與 URL 發現之間的關系,並给出让 JS 連結更早暴露的實操做法。

搜尋抓取

JS 渲染出的連結:搜尋蜘蛛在哪一步才看到這些 URL

很多站点把導航、列表和詳情入口交给 JavaScript 生成。對用戶来说体驗更顺,但對搜尋蜘蛛来说,這些 URL 可能压根不在第一次拿到的 HTML 里。

蜘蛛先拿到的是原始 HTML

搜尋蜘蛛請求一個頁面时,第一步拿到的是服務器直接返回的 HTML。這個 HTML 里寫了什么連結,蜘蛛就能顺着發現什么 URL。如果列表容器是空的,連結要等浏览器执行 JS 後才出現,那么這一轮抓取里,蜘蛛能看到的 URL 非常有限。

搜尋引擎通常還有一條渲染流程:把頁面放進渲染队列,用類似浏览器的环境执行 JavaScript,再讀取渲染後的 DOM。渲染後的連結有机會被提取,但這條路径有延迟,也受资源、队列和頁面复杂度影响。所以不能假设只要 JS 能跑出来,蜘蛛迟早都會發現。

JS 連結與普通 a 标簽的差別

用 a 标簽的 href 属性寫在 HTML 里的連結,和用 JS 拼接、点击後才跳轉的連結,對蜘蛛的可见顺序完全不同。

  • 服務端輸出的 a 标簽:第一轮 HTML 就能發現,路径短。
  • JS 動態插入的 a 标簽:要等渲染,發現時間靠後。
  • 绑定 onclick 的 div 或 span:蜘蛛未必把它当連結,發現概率更低。
  • hash 路由或需要点击展開的菜單:很多 URL 根本不會進入抓取队列。

如果站点同时有蜘蛛池或外部 URL 推送,也要注意:推来的 URL 仍然需要頁面上有可抓取的入口或 Sitemap 作為补充,否則新 URL 可能只被记錄,不一定被稳定調度。

URL 發現的几道關

  1. 原始 HTML 解析:蜘蛛讀取静態内容里的連結。
  2. 渲染队列:頁面被加入渲染任務,等待执行 JS。
  3. 渲染後提取:從执行完的 DOM 里收集連結。
  4. 去重與篩選:和已知 URL 比對,决定是否加入抓取队列。
  5. 調度抓取:结合抓取预算、站点响應和優先級安排訪問。

只要其中一步失敗,連結就可能停在半路。尤其是渲染這一步,需要加载 JS 文件、接口資料甚至第三方脚本,任何一個资源出错,連結都不會出現。

让 JS 連結更早暴露的做法

目标不是完全放弃 JS,而是保證關键 URL 有一條不依赖渲染的發現路径。

  • 服務端輸出首屏連結:列表頁至少把前几條或分頁入口直接寫進 HTML。
  • 使用真實 a 标簽:href 指向可訪問的 URL,而不是只靠事件跳轉。
  • 预渲染或静態化:對更新不频繁的栏目頁、詳情頁,生成带連結的静態版本。
  • Sitemap 兜底:把重要 URL 寫進 Sitemap,给蜘蛛一個獨立入口。
  • 内鏈补充:在面包屑、相關推荐、归档頁里保留普通連結。
  • 分頁路径可用:翻頁連結要能被直接訪問,不要只靠滚動加载。

需要留意的几個坑

  • 無限滚動只加载内容,不更新 URL,蜘蛛很难繼續往下發現。
  • 用按钮或图片做導航,没有對應 a 标簽。
  • 連結在用戶点击或滚動後才插入 DOM,蜘蛛不會主動触發這些行為。
  • 接口資料被 robots.txt 屏蔽或需要登入,渲染时拿不到連結。
  • JS 文件体积過大、执行超时,渲染任務可能提前結束。

用日誌和原始 HTML 驗證

想知道蜘蛛到底看没看到 URL,可以從两邊查:

  • 查看頁面原始 HTML,確認禁用 JS 时是否還有連結。
  • 查看服務器日誌,比較蜘蛛請求的 URL 和頁面實际輸出的連結。
  • 用抓取工具模拟,看渲染前後 DOM 里的連結差多少。
  • 观察 Sitemap 中的 URL 是否出現在日誌里,判断發現路径是否有效。

如果某批 URL 在日誌里長期不出現,先检查它們在原始 HTML 中是否存在,再检查渲染是否成功,而不是急着增加推送量。

JS 渲染可以帮助用戶,但不要让它成為蜘蛛發現 URL 的唯一通道。關键連結尽早出現在原始 HTML 里,抓取路径才更稳定。