结论先说:相對路径和绝對路径,搜尋蜘蛛都能處理。真正决定抓取结果的,是浏览器和蜘蛛把這段路径解析成哪個绝對 URL,以及這個 URL 是否唯一、稳定、可訪問。
两種寫法的實际差別
蜘蛛拿到一段 HTML 後,會以目前頁面的 URL 為基准,把 href 解析成完整地址,再去請求。相對路径只是寫法更短,解析环节多了一步,本身不會因此降低被發現和抓取的概率。
- 绝對路径:基准固定,歧义最少,但站点迁移或換域名时容易漏改。
- 相對路径:迁移省事,却容易因為目錄层級、base 标簽、尾斜杠差异,解析出與预期不同的地址。
- 协议相對(//example.com/a):解析结果依赖目前頁面的协议,站点同时提供 http 與 https 时,容易出現两個版本。
常见出問题的寫法
1. 頁面里有 base 标簽,但和實际结构不一致
base 會改變所有相對連結的解析基准。入口頁若套用模板,模板里带了一個指向別處的 base,正文里的相對連結就會全部指向错誤目錄,蜘蛛顺着抓到的往往是 404 或者不相干的頁面。
2. ../ 的层級數错了
入口頁通常由脚本批量生成,模板里寫死 ../ 或 ../../。一旦入口頁分布在不同深度的目錄下,同一段模板就會把部分連結解析到上一层無關目錄。日誌上看起来蜘蛛来過,但抓到的都不是目标 URL。
3. 大小寫與尾斜杠不一致
/List/ 和 /list/、/a 和 /a/ 在很多服務器上属于不同地址。同一目标 URL 在入口頁里出現多種寫法,會让蜘蛛把它当成多個候選地址,抓取机會被分散,也不利于後續判断哪一個是規范地址。
4. 路径里有空格或中文没有编碼
href 里直接寫空格或中文,不同解析器补全方式可能不完全一致,容易出現解析失敗或指向错誤地址。這類連結建议直接寫成已编碼的地址。
排查顺序
- 在入口頁查看源碼,取出一條目标連結,確認源碼里到底寫的是什么。
- 用浏览器控制台或在线工具,按目前頁面 URL 把它解析成绝對地址。
- 把解析结果與實际能訪問的地址逐字對比,重点看目錄、大小寫、尾斜杠、參數。
- 拿這個绝對地址去抓取日誌里找,看蜘蛛是否請求過、返回了什么狀態碼。
- 如果日誌里完全没有,回到入口頁確認連結是否真的在 HTML 里,而不是脚本渲染後才出現。
更稳妥的做法
- 入口頁指向目标 URL 的關键連結,優先寫绝對地址,减少解析环节和歧义。
- 批量生成模板时,把域名和基础路径抽成變量,避免 ../ 寫死。
- 全站统一尾斜杠規則,並在入口頁保持一致。
- 不要為了省事依赖 base 标簽,它的影响范围比想象中大。
- 改版或迁移後,抽几條入口頁連結重新解析一遍,作為常規检查項。
相對路径本身不是問题,路径解析结果不一致才是問题。判断标准很简單:你希望蜘蛛抓的那個绝對地址,能不能在日誌里稳定出現。