做站内抓取分析时,很多人习惯打開浏览器,点几下導航,觉得頁面都能到。但蜘蛛先拿到的是一段 HTML,頁面里的連結是否可被發現,取决于這段 HTML 里有没有可跟随的 href,而不是浏览器里看起来能不能点。做一次無 JS 抓取模拟,能提前看到蜘蛛眼里的路径長什么样。
為什么要做無 JS 抓取模拟
現代前端把大量連結放在脚本里,用戶能看到,蜘蛛在首次抓取时未必能看到。虽然渲染阶段可能补上,但渲染资源有限,能第一波發現更稳。模拟的目的不是替代日誌,而是把“理论上能不能走到”這件事先確認一遍。
模拟前准备三样東西
- 近期抓取日誌:確認蜘蛛實际訪問過哪些 URL,狀態碼如何。
- Sitemap 與站内連結清單:作為理论上的 URL 集合。
- 一個不执行 JS 的請求工具或爬虫:只看原始 HTML,不渲染。
從首頁開始,逐层走
- 關閉 JS,請求首頁,儲存原始 HTML。
- 提取頁面里所有 a 标簽的 href,记錄完整 URL 和所在位置。
- 逐個請求這些連結,记錄狀態碼、响應時間、是否跳轉。
- 對 2xx 頁面重复提取連結,限制在三到四层,观察重要頁面是否可達。
- 單獨检查分頁、篩選、排序這類參數連結,看它們是否出現在原始 HTML 中。
- 把走不通的連結和日誌里蜘蛛未訪問的 URL 做對照。
這里容易忽略的是,導航和頁脚往往不是唯一入口。正文里的内鏈、面包屑、相關推荐、上一頁下一頁,都會影响蜘蛛走多深。
常见走不通的位置
- 只有点击事件、没有 href 的按钮式連結。
- 懒加载图片旁的連結,首次 HTML 里没有。
- 無限滚動列表,只在交互後追加内容。
- 空列表頁或篩選後無结果頁,返回 200 却没有有效連結。
- 重定向鏈過長,中途回到首頁或错誤頁。
- robots.txt 誤拦了整段路径,蜘蛛根本不會請求。
這些位置不一定是错誤,但如果里面藏着重要頁面,就等于把入口做窄了。
把模拟结果和抓取日誌對齐
模拟是理论路径,日誌是真實行為。两者對照,能看到三類差异:模拟能到但日誌没有,可能是抓取频次或優先級問题;日誌有但模拟没走到,可能是蜘蛛通過 Sitemap 或外鏈進入;两邊都没有,才是真正的路径盲区。
不要用几個小时的日誌下结论。抓取有周期,样本太短容易把正常波動当成異常。
服務器稳定性也會改變路径
路径通不通,不只看内鏈。如果服務器在蜘蛛訪問时频繁超时、返回 5xx 或重置连接,蜘蛛可能在同一段路径上反复失敗,随後降低抓取频次。此时内鏈再完整,實际能走到的頁面也會變少。先確認服務器在抓取高峰时段的响應是否稳定,再谈路径優化。
路径可走通只是第一步
让蜘蛛發現 URL、成功抓取、完成渲染、進入索引,是几個不同阶段。模拟能解决的是“有没有路”的問题,抓取日誌能回答“蜘蛛有没有走”,剩下的還要看内容质量和頁面狀態。把路径梳理清楚,至少不會让重要頁面因為一個断鏈或脚本連結被挡在门外。