蜘蛛第一次拿到的,往往不是你在浏览器里看到的頁面
用浏览器打開頁面时,JS 會执行、接口會返回資料、列表會渲染出来。但抓取器請求 URL 时,第一步拿到的通常只是服務器返回的初始 HTML。如果連結是 JS 执行後才插入 DOM 的,它在這份 HTML 里並不存在。
這不代表這些 URL 永遠不會被發現,而是它們進入了另一條時間线:先被抓取,再進入渲染队列,渲染完成後才可能提取到新連結,然後再排队抓取。多出来的环节,就是延迟和遗漏的来源。
URL 發現的两條時間线
- 初始 HTML 中的連結:抓到即解析,解析即發現,路径最短。
- 渲染後才出現的連結:需要占用渲染资源,受渲染队列長度、超时、资源加载失敗等因素影响。
渲染资源是有限的,站点越大,排在後面的頁面等待越久。對于重要目錄、新上线的栏目,把入口放在初始 HTML 里,等于把它從第二條時間线挪回第一條。
哪些連結最容易掉進盲区
- 由 JS 拼接生成的分頁連結、加载更多按钮
- 点击後才請求接口、再填充列表的栏目頁
- 懒加载区域里的連結,需要滚動才出現在 DOM 中
- 依赖登入態、Cookie 或本地存储才渲染的導航
- 前端路由生成的地址,没有對應的 a 标簽
這些位置往往正好是深层内容的主要入口。一旦渲染没跑通,整批 URL 就只能靠 Sitemap 撑着,發現速度會明顯受制于申报频率和解析顺序。
让關键 URL 出現在初始 HTML 里
- 對首屏做服務端渲染或预渲染,至少保證導航、面包屑、列表頁前若干條的連結是真實的 a 标簽。
- 分頁保留可点击的連結地址,不要只用按钮加事件。
- 重要栏目的入口放在主導航和頁脚,不依赖 JS 注入。
- Sitemap 與内鏈並行,不要把它当成唯一的發現通路。
- 渲染失敗时给出可讀的降級内容,而不是一個空白容器。
渲染失敗时會發生什么
渲染請求對站点也是一次真實訪問,會消耗服務器资源。如果頁面里脚本和第三方請求偏多,或者服務器响應偏慢,渲染容易在超时前没能完成,结果是這一轮既没提取到連結,也没留下可用内容。反复几次,抓取资源被消耗在同一個頁面上,却没有新的 URL 進入队列。
所以判断顺序建议是:先確認初始 HTML 里有没有連結,再確認渲染能不能稳定跑完,最後才考虑用 Sitemap 补漏。顺序反了,容易一直在补,却始终没碰到源头。
怎么確認連結到底有没有被看到
可以對照几類记錄:服務器訪問日誌里该 URL 有没有出現過真實的 GET 請求;抓取統計中渲染請求的數量是否明顯少于抓取請求;用抓取工具關閉 JS 打開頁面,看還剩多少連結。三者放在一起看,基本能判断問题出在“没進初始 HTML”還是“渲染没跑通”。
提示:渲染額度不是可以無限消耗的。把结构性的連結放進初始 HTML,比事後依赖渲染补偿更省资源,也更稳定。
小结
URL 發現的關键不在于連結“能不能”出現,而在于它出現在哪一层。初始 HTML 里的連結路径最短、最稳;渲染後的連結多一道工序,就多一层不确定性。把導航、列表、分頁這些结构性入口做扎實,Sitemap 作為补充,蜘蛛的抓取路径會清晰很多。