搜尋抓取

源碼里的連結與渲染後的 DOM:蜘蛛從哪一步開始走

搜尋蜘蛛抓取頁面时,第一步拿到的是服務器返回的 HTML 源碼,JS 渲染往往排在後一步。源碼里有真實 href 的連結通常更早被發現,靠脚本注入的入口則可能延迟。本文梳理抓取與渲染的分工、渲染失敗的常见原因,以及自查和調整的做法。

搜尋抓取

源碼里的連結與渲染後的 DOM:蜘蛛從哪一步開始走

很多站点把入口都放在 JavaScript 里:点击按钮加载列表、前端路由跳轉、滚動到底部再請求下一頁。從用戶角度看没問题,但搜尋蜘蛛的抓取管道分成两步,源碼和渲染後的 DOM 之間可能存在時間差。

抓取管道:先拿源碼,再排渲染

搜尋引擎請求一個 URL 时,通常先拿到服務器直接返回的 HTML,這一步是抓取。如果頁面關键内容或連結需要执行 JS 才出現,就進入渲染阶段。渲染比抓取消耗更多资源,队列也往往更長,所以两者之間存在延迟。

這意味着:連結寫在源碼里,通常当次抓取就能看到;靠脚本生成的連結,可能要等到渲染完成才被發現。渲染不是不會做,而是不一定和抓取同时發生。

連結在源碼里和 JS 里,差別在哪

  • 源碼中的普通連結(a 标簽带 href 属性):蜘蛛解析 HTML 时即可提取,進入待抓队列。
  • 点击事件绑定:源碼里往往没有可解析的地址,需要渲染並模拟交互才可能發現。
  • 前端路由切換:地址變化可能不产生新的服務器請求,蜘蛛未必把它当成新 URL。
  • 滚動加载、点击「加载更多」:後續内容不在首屏源碼中,發現時間可能被推迟。

不是所有情况都坏,但入口越依赖脚本,進入抓取路径的時間就越不确定。

渲染阶段容易出問题的几處

  • 资源被挡:robots.txt 屏蔽了 JS 或 CSS 文件,渲染时頁面可能拼不出来,連結和内容都看不到。
  • 接口依赖:渲染需要調用站内接口,如果接口需要登入、频繁超时或按 UA 拦截,渲染结果可能是空壳。
  • 脚本报错:一個未捕获的異常就可能中断後續渲染,導致本该出現的連結没有出現。
  • 内容放進框架或影子 DOM:解析和提取的难度更高,連結發現更慢。
  • 懒加载:图片、列表的懒加载在真實浏览器里會触發,但在渲染资源有限时不一定全部执行。

怎么確認蜘蛛看到的是哪一版

  1. 關閉浏览器 JS,直接訪問關键頁面,看導航和正文是否還在。
  2. 查看渲染後的 HTML(浏览器检查元素,或使用搜尋平台提供的 URL 检查工具),對比源碼里有没有連結。
  3. 看服務器日誌:静態资源有没有被抓取记錄,缺失說明渲染可能不完整。
  4. 用抓取模拟工具對比源碼與渲染结果,找出只在渲染後才出現的連結。

让關键入口更早被看到

  • 主導航、面包屑、分頁,尽量用真實 href 的連結,按钮只做补充。
  • 「下一頁」要有可抓取的地址,別只留一個 JS 按钮。
  • 首屏内容尽量服務端渲染或预渲染,重要連結不要等脚本执行完才出現。
  • 保持 JS、CSS 可被抓取,不要用 robots.txt 一刀切屏蔽静態目錄。
  • 用 Sitemap 给重要 URL 兜底,但它替代不了站内連結的發現作用。
  • 列表頁分批輸出,配合分頁地址,避免全部塞進無限滚動。
把關键連結放回源碼,是成本較低的 URL 發現手段。渲染可以锦上添花,但別把它当成唯一的入口。

最後提醒一句:抓取和渲染的节奏由搜尋引擎决定,調整之後不要期待立刻见效。可以隔一段時間回看日誌里静態资源的抓取记錄,以及渲染後頁面的連結情况,再判断是否改善。