現在不少站点用前端框架搭建,主導航、文章列表、相關推荐、加载更多這些区域,都是 JavaScript 在浏览器里跑完之後才拼出来的。對用戶来说体驗顺滑,但對搜尋蜘蛛的 URL 發現来说,這里藏着一道很容易被忽略的门槛。
先分清“渲染”和“發現”
所谓發現,是蜘蛛在原始 HTML 里看到一個带 href 的連結,從而把這條 URL 放進待抓取的队列。所谓渲染,是它执行頁面脚本之後,把内容画出来。能渲染不等于會渲染,渲染要消耗资源、要有延迟,也存在額度限制,不是每條 URL 都值得走這一步。因此更稳妥的思路是:站点的主路径連結,在原始 HTML 里就應该存在,渲染只作為增强。
几種常见的 JS 連結陷阱
- 用 div 或 span 加上点击事件做跳轉,源碼里根本没有 href。
- “加载更多”“下一頁”只是一個按钮,真實地址只藏在接口請求里。
- 列表先輸出骨架屏,内容連結异步插入,蜘蛛第一次拿到的是空壳。
- 選項卡切換只替換内容区,不改變 URL,深层内容没有獨立地址。
- 相關推荐、热门排行整块由脚本生成,内容頁之間的横向通道被切断。
這些問题單獨看都不算嚴重,叠在一起就會出現一種情况:站長觉得站内連結四通八達,蜘蛛眼里却只有首頁和少數几個入口。
可落地的處理方式
- 能用 a 标簽就用 a 标簽。href 寫真實可訪問的地址,需要拦截跳轉时,事件照常绑定,但不要把 href 去掉或寫成 javascript:void(0)。
- 给分頁留一條保底地址。视觉上可以是“加载更多”按钮,底层同时存在一组可訪問的分頁連結,或者至少保證每一頁有自己的 URL。
- 首屏内容尽量由服務端輸出。關键列表、導航、面包屑先在 HTML 里给出来,再交给脚本做交互增强。
- 值得被單獨訪問的内容,就给它獨立 URL。篩選结果、标簽頁、专题分支,如果希望被收錄或被發現,就不要只存在前端狀態里。
- 准备一條不依赖脚本的通道。站点地图、分類頁、聚合頁、上一篇下一篇,都是脚本之外可以补上的連結来源。
怎么驗證有没有漏
第一,查看頁面源代碼,而不是開發者工具里的元素面板,直接在源碼中搜 href,看關键連結在不在。第二,临时關閉 JavaScript,走一遍站点的主要路径,能走通多少算多少。第三,翻服務器日誌,看這些目标 URL 有没有被訪問记錄,長期為零就說明入口有問题。第四,做一次渲染前後對比,把只在渲染後出現的連結列出来,重点關注。
別把希望都放在外部手段上
蜘蛛池、批量推送這類做法,能解决的是“通知有這條 URL”,解决不了“這條 URL 在站内是否可達”。如果主路径本身依赖脚本渲染,外部手段带来的一次性訪問也很难沉淀成稳定的抓取结构。
URL 發現谈不上什么玄学,它更像是站点结构的一份体检报告:入口是否存在于源碼、层級是否合理、通道是否冗余。把這件事当成日常运营的一部分来维護,比等到流量異常时再回头排查要省力得多。