蜘蛛先拿到的是“壳”,不是最终頁面
抓取时,蜘蛛先拿到的是服務器返回的 HTML。如果頁面正文和連結由 JavaScript 在浏览器里渲染,那么這份原始 HTML 里可能只有框架、占位符和脚本。蜘蛛會尝试执行 JS,但渲染队列和普通抓取並不是同一回事。不要把“頁面在浏览器里能顯示”直接等同于“蜘蛛一定會马上看到完整内容”。
連結藏在 JS 里,URL 發現就多了一道门
列表頁、分頁、詳情頁的連結如果由 JS 動態插入,蜘蛛在初始 HTML 里看不到可抓取的 href,URL 發現路径就可能断掉。即使脚本最终能执行,連結也要等渲染後才出現,發現時間會被拉長。對依赖這些連結往下走的抓取来说,這是一道額外的门。
- 列表頁和栏目頁尽量服務端渲染或预渲染,让關键連結出現在 HTML 中。
- 用普通 a 标簽和可抓取 href,避免只用 onclick 或 div 模拟跳轉。
- 分頁和詳情頁入口尽量在首屏 HTML 里出現。
- 必须交互後才加载的連結,考虑用 Sitemap 或内鏈补位。
内鏈和 Sitemap 是两條备用线索
当 JS 連結不可靠时,内鏈结构和 Sitemap 是补 URL 的主要方式。内鏈從入口頁指向栏目頁、詳情頁,蜘蛛可以顺着走;Sitemap 提供一份 URL 清單,但不能替代内鏈。
内鏈负责路径,Sitemap 负责兜底
從抓取路径看,内鏈更像一條可以连續走的路,Sitemap 更像一張备查清單。两者都在,蜘蛛發現 URL 的机會更稳。
Sitemap 里列了 URL,不等于蜘蛛會優先抓;没有内鏈指向的地址,抓取優先級通常更低。
服務器响應和渲染队列也要一起看
如果服務器返回空壳很快,但渲染依赖的接口慢或报错,蜘蛛看到的仍然是空壳。检查服務端日誌时,可以看蜘蛛請求返回的狀態碼、响應大小,以及渲染請求是否單獨出現。若關键 API 對蜘蛛返回 403 或空資料,渲染後也拿不到連結。
- 確認關键接口不會拦截蜘蛛 User-Agent。
- 避免首屏内容依赖必须登入或必须带特定 Cookie 的接口。
- 服務器稳定时抓取节奏更平稳;频繁 5xx 會让蜘蛛放慢或减少抓取。
怎么检查空壳頁面的抓取路径
- 用 curl 或查看服務器日誌,看蜘蛛拿到的原始 HTML 里有没有連結。
- 禁用 JS 打開頁面,看正文和連結是否還在。
- 检查列表頁、分頁、詳情頁的 a 标簽是否可抓取。
- 對比 Sitemap 中的 URL 與内鏈可達的 URL,找出只出現在 Sitemap 的地址。
- 對照渲染後的頁面和原始 HTML,確認關键連結是否只在渲染後出現。
調整思路
優先让關键路径上的連結直出 HTML,尤其是栏目頁、列表頁和詳情頁入口。對必须 JS 渲染的部分,用内鏈和 Sitemap 补足 URL 發現,別让蜘蛛只有一條路可走。监测服務器日誌里的抓取频次和狀態碼,空壳頁面較多时,抓取预算容易被消耗在重复渲染上。
空壳頁面不是不能抓,而是 URL 發現和抓取路径會更依赖旁路线索。把連結放回 HTML、把 Sitemap 和内鏈维護好,蜘蛛走起来會顺一些。