很多站点把入口都放在 JavaScript 里:点击按钮加载列表、前端路由跳轉、滚動到底部再請求下一頁。從用戶角度看没問题,但搜尋蜘蛛的抓取管道分成两步,源碼和渲染後的 DOM 之間可能存在時間差。
抓取管道:先拿源碼,再排渲染
搜尋引擎請求一個 URL 时,通常先拿到服務器直接返回的 HTML,這一步是抓取。如果頁面關键内容或連結需要执行 JS 才出現,就進入渲染阶段。渲染比抓取消耗更多资源,队列也往往更長,所以两者之間存在延迟。
這意味着:連結寫在源碼里,通常当次抓取就能看到;靠脚本生成的連結,可能要等到渲染完成才被發現。渲染不是不會做,而是不一定和抓取同时發生。
連結在源碼里和 JS 里,差別在哪
- 源碼中的普通連結(a 标簽带 href 属性):蜘蛛解析 HTML 时即可提取,進入待抓队列。
- 点击事件绑定:源碼里往往没有可解析的地址,需要渲染並模拟交互才可能發現。
- 前端路由切換:地址變化可能不产生新的服務器請求,蜘蛛未必把它当成新 URL。
- 滚動加载、点击「加载更多」:後續内容不在首屏源碼中,發現時間可能被推迟。
不是所有情况都坏,但入口越依赖脚本,進入抓取路径的時間就越不确定。
渲染阶段容易出問题的几處
- 资源被挡:robots.txt 屏蔽了 JS 或 CSS 文件,渲染时頁面可能拼不出来,連結和内容都看不到。
- 接口依赖:渲染需要調用站内接口,如果接口需要登入、频繁超时或按 UA 拦截,渲染结果可能是空壳。
- 脚本报错:一個未捕获的異常就可能中断後續渲染,導致本该出現的連結没有出現。
- 内容放進框架或影子 DOM:解析和提取的难度更高,連結發現更慢。
- 懒加载:图片、列表的懒加载在真實浏览器里會触發,但在渲染资源有限时不一定全部执行。
怎么確認蜘蛛看到的是哪一版
- 關閉浏览器 JS,直接訪問關键頁面,看導航和正文是否還在。
- 查看渲染後的 HTML(浏览器检查元素,或使用搜尋平台提供的 URL 检查工具),對比源碼里有没有連結。
- 看服務器日誌:静態资源有没有被抓取记錄,缺失說明渲染可能不完整。
- 用抓取模拟工具對比源碼與渲染结果,找出只在渲染後才出現的連結。
让關键入口更早被看到
- 主導航、面包屑、分頁,尽量用真實 href 的連結,按钮只做补充。
- 「下一頁」要有可抓取的地址,別只留一個 JS 按钮。
- 首屏内容尽量服務端渲染或预渲染,重要連結不要等脚本执行完才出現。
- 保持 JS、CSS 可被抓取,不要用 robots.txt 一刀切屏蔽静態目錄。
- 用 Sitemap 给重要 URL 兜底,但它替代不了站内連結的發現作用。
- 列表頁分批輸出,配合分頁地址,避免全部塞進無限滚動。
把關键連結放回源碼,是成本較低的 URL 發現手段。渲染可以锦上添花,但別把它当成唯一的入口。
最後提醒一句:抓取和渲染的节奏由搜尋引擎决定,調整之後不要期待立刻见效。可以隔一段時間回看日誌里静態资源的抓取记錄,以及渲染後頁面的連結情况,再判断是否改善。