蜘蛛先看到的是 HTML,不是渲染後的頁面
大多數搜尋引擎的抓取分两步走:先請求 URL,拿到服務器返回的 HTML;如果资源允许,再排队执行頁面里的 JS,把渲染後的 DOM 解析一遍。問题在于第二步不是必然發生,也常被延後。如果連結只存在于渲染之後,蜘蛛在第一轮就只能看到一個空壳,新 URL 自然進不了待抓取队列。
哪些寫法容易让 URL 發現断档
- 列表、卡片用 div 加 onclick 或事件监听跳轉,HTML 里根本没有 href。
- 分頁用按钮加前端狀態管理,翻頁不改變地址,蜘蛛分不清“下一頁”在哪。
- 用 hash 路由,例如 /list 後面挂 #page=2,這段通常不會作為獨立 URL 被抓取。
- 相關内容、推荐位在首屏之後异步加载,且没有任何静態兜底。
- 整站共用一套前端模板,源碼里只有一個挂载节点和一段打包脚本。
這几類寫法的共同点是:用戶看得见,蜘蛛第一轮看不见。
把路径交出去的几種做法
服務端渲染或静態生成
首屏 HTML 直接带上 a 标簽,是把發現成本降到最低的方案。列表頁、詳情頁、導航区這些“路径节点”尤其值得優先處理,蜘蛛不需要等 JS 就能顺藤摸瓜。
预渲染關键入口
暂时改不動整站架构时,可以對分類頁、文章列表頁、专题頁做预渲染,把連結寫進 HTML。覆盖主要入口即可,不必追求全站都渲染。
用 HTML 兜底清單
在頁面底部或一個专门的“全部内容”頁面里,用真實 a 标簽列出各栏目入口。即使主列表是 JS 渲染的,蜘蛛也有路可走。注意別做成几千條連結的大杂烩,按栏目分组、控制數量,兜底清單是补充,不是堆連結的地方。
Sitemap 與内鏈是兜底,不是替代
Sitemap 能帮助發現 URL,但它不表達頁面之間的關系;内鏈的锚文本和层級,才决定蜘蛛先走哪條路、走多深。两條都做,只是把可發現性补齐,並不意味着蜘蛛一定會来抓。
怎么自查有没有断档
- 關掉 JS 打開頁面,看主要連結是否還点得到。
- 查看頁面源碼而不是审查元素,搜尋 href 是否真的出現在源碼里。
- 用服務器日誌比對:日誌里出現過的 URL 數量,和站点實际 URL 數量差多少,差距大的通常是 JS 渲染的栏目。
- 抽几個新發布的頁面,看它們第一次被請求时,入口来自哪里。
渲染鏈路的稳定性也在影响抓取
依赖前端渲染的站点,對外部接口和资源的依赖更多。接口慢、超时、間歇性 5xx 出現时,蜘蛛拿到的 HTML 可能是残缺的,連結自然也残缺。服務器稳定性和渲染鏈路的稳定性,本质上是同一條抓取路径上的两段。
让每個重要頁面在“没有 JS 的世界”里也有一條走得通的路,是 URL 發現里最省事的一道保險。