蜘蛛拿到的首先是原始 HTML
很多运营在浏览器里打開頁面,導航、列表、分頁都好好的,于是預設蜘蛛看到的也是同一個画面。但抓取阶段的第一步通常是取回 HTML 源碼,源碼里有什么連結,很大程度上决定了這一轮它能顺着走出去多遠。JavaScript 带来的額外内容需要二次执行才能拿到,是否执行、什么时候执行,站方只能引導,很难直接指挥。
所以問题不在于"要不要用 JS",而在于關键层級的入口是不是只存在于 JS 渲染之後。
哪些連結容易漏在 HTML 之外
- 用 onclick 或事件监听做跳轉的卡片、按钮,源碼里没有可跟随的 href。
- 列表資料靠接口拉取,首屏 HTML 只有骨架,翻頁靠点击後動態插入。
- hash 路由形態(井号後面带參數),這部分通常不會被当成獨立 URL 處理。
- 下拉菜單、折叠面板里的二級導航,只有交互後才寫進 DOM。
- 按需加载的"相關推荐""猜你喜欢"模块,位置在頁面底部,JS 没跑到就什么也没有。
這些入口在浏览器里体驗没問题,但在只看源碼的一轮抓取里,它們等于不存在。
渲染抓取存在,但排在後面
搜尋引擎确實具备渲染能力,會把部分頁面交给渲染环节處理,但這通常要消耗更多资源,也會排在抓取队列之後。抓取预算有限的时候,源碼里能直接讀到連結的頁面,往往更容易被優先照顾。把核心入口全部押在渲染上,等于把 URL 發現的节奏交给了別人的排队顺序。
怎么判断自己是不是這種情况
最简單的办法是禁用 JavaScript 打開頁面,或者直接查看網頁源代碼並用關鍵詞搜連結。如果導航、分頁、詳情地址在無 JS 狀態下全部消失,那蜘蛛第一轮看到的就是這個样子。再對比服務端日誌里這些 URL 的出現频率,差异會更直观。
把入口搬回 HTML 的几種做法
- 主導航、面包屑、分頁和列表首屏,用 a 标簽配合服務端渲染輸出,href 寫成可訪問的真實地址。
- 需要交互效果的按钮,可以改成 a 标簽再用 JS 拦截点击,保留地址本身。
- 無限滚動最好保留一個"查看更多"或分頁連結,指向對應的分頁 URL,而不是只有滚動事件。
- 篩選、排序這類參數,如果希望被当成獨立入口,至少要在 HTML 里给出可抓取的連結形態,同时控制组合數量,避免生成大量近似重复地址。
- Sitemap 可以补上重要但 HTML 中出現較少的 URL,作為發現层面的补充,但它替代不了内鏈。
内鏈和第二入口的配合
即使某個模块必须用 JS 渲染,也可以在頁面其他位置给出同样目标的静態連結:正文里的引用、上一篇下一篇、专题聚合頁、站点地图頁。蜘蛛顺着這些路径走,一样能到達目标。真正需要注意的是层級——如果某個栏目的所有入口都集中在渲染之後,而外部又没有別的連結指向它,這個栏目就可能長期停留在"已發現但抓取很少"的狀態。
判断标准其實很简單:關掉 JS,頁面里還有没有一條從入口走到目标的連結路径。有,URL 發現就多一层保障;没有,就只能等渲染队列。
不必把所有交互都改成静態,重点是別让關键层級只存在于渲染之後。先保證主路径在源碼里可讀,再把体驗交给前端,這样抓取路径和用戶体驗並不冲突。