当站点用前端框架渲染主要内容时,搜尋蜘蛛拿到的 HTML 往往和浏览器里看到的不完全一样。入口發現依赖連結,而連結如果只存在于渲染後的 DOM 中,抓取路径就會在某一层断掉。核對的重点不是“有没有用框架”,而是“蜘蛛在只有原始 HTML 的情况下能走到哪一步”。
一、先確認蜘蛛拿到的是哪一版 HTML
第一步不做優化,只做對比。用不携带 Cookie 的請求抓取一次原始响應,再用浏览器查看渲染後的 DOM,把两邊的结果放在一起看。
- 原始响應中是否存在 title、主标题、正文首段;
- 原始响應中是否存在指向詳情頁或下級列表頁的 a 标簽;
- 渲染後多出来的連結,是導航、分頁,還是“加载更多”按钮;
- canonical、hreflang、结构化資料出現在哪一版里。
如果這些元素只出現在渲染後,說明抓取路径依赖 JS 执行,属于需要重点排查的情况。
二、首屏可抓取内容的核對顺序
按“從入口到深层”的顺序检查,比逐個頁面看更有效率。
- 首頁與栏目頁:原始 HTML 中是否有稳定的導航連結,能否沿着連結走到列表頁。
- 列表頁:每條记錄是否對應一個真實的 a 标簽,href 是否為可直接訪問的 URL,而不是 onclick 或 data-id。
- 分頁:翻頁是否有獨立 URL(如 ?page=2 或 /list/2),還是只有滚動加载。
- 詳情頁:正文是否在原始 HTML 中,若在渲染後才有,蜘蛛可能只看到一個空壳。
- 站点地图:Sitemap 是否覆盖了 JS 路由對應的真實 URL,且這些 URL 返回正常狀態碼。
三、前端路由常见的四種断点
- history 路由無服務端映射:/detail/123 這類路径在服務器上没有對應文件,直接訪問返回 404,蜘蛛無法把它当作有效入口。
- 哈希路由:以 # 開头的片段不會發送到服務器,蜘蛛通常只按主路径抓取,後面的内容难以被發現。
- 点击加载更多:内容靠接口追加,没有新的 URL,也没有新的 a 标簽,深层内容只能靠 Sitemap 补充。
- 懒加载與骨架屏:首屏渲染前是占位结构,抓取时刚好落在空档期,内容被判定為缺失。
四、服務端渲染與预渲染的取舍
如果列表頁和詳情頁對發現很重要,優先保證它們有服務端可輸出的 HTML 版本。可以是 SSR,也可以是构建时预渲染,或在請求头识別到抓取时返回渲染结果。需要留意两点:一是同一 URL 對不同来源返回的内容主体應保持一致,不要出現用戶看到的和蜘蛛看到的差异過大;二是渲染後的頁面仍需保留可点击的真實連結,而不是把連結藏進脚本里。
多語言與多地域站点
這類站点常按 IP 或語言做跳轉,容易让蜘蛛拿到非目标語言的版本。建议用可直接訪問的路径区分語言(如 /en/、/jp/),並用 hreflang 相互声明,而不是依赖跳轉决定蜘蛛看到哪一版。
五、补强抓取路径的常規做法
- 主導航、面包屑、頁脚保留纯 HTML 連結,确保任何一层都能顺着連結往下走;
- 分頁保留真實 URL 與可点击的上一頁、下一頁;
- 把没有内鏈入口的深层 URL 寫進 Sitemap,作為补充發現渠道;
- 列表頁首屏至少輸出一部分條目連結,不依赖滚動触發;
- 定期用抓取日誌對比爬虫實际訪問的 URL 與站点期望的 URL,找差值。
六、一次核對清單
- 關掉 JS,看頁面還能否走通三层連結;
- 随机抽 10 個詳情 URL,检查直接訪問的狀態碼與内容;
- 检查分頁是否有獨立可訪問 URL;
- 核對 Sitemap 中的 URL 與前端路由的實际路径是否一致;
- 對比抓取日誌中入口頁的响應大小,明顯偏小的頁面重点排查。
抓取路径的問题往往不是“蜘蛛不来”,而是来了之後走不過第二层。把每一层連結做成真實可訪問的 URL,比事後补救更省力。