相對路径和绝對路径,差的不只是寫法
對搜尋蜘蛛来说,頁面里出現的連結文本只是一個线索。它要先把這個线索拼成一個完整的 URL,才能進入後續的抓取队列。相對路径本身不含域名,蜘蛛必须用目前頁面的地址作為基准去拼接。拼接規則是公開标准,並不神秘,但入口頁的部署方式一旦有變化,拼出来的结果就可能和你预期的完全不是同一個地址。
需要先說明一点:連結能不能被正确解析,只影响“目标 URL 是否被發現”。被發現不等于被收錄,這一点在後面的排查里要始终分開看。
三種常见寫法,解析结果各不相同
- 根相對路径,例如以斜杠開头的 /a/123.html。它會拼到目前頁面的域名後面,不管入口頁在第几层目錄,结果都是同一個地址。
- 文档相對路径,例如 article/123.html 或 ../a/123.html。它會基于目前頁面的目錄位置来拼。入口頁的地址一旦從 /pool/index.html 變成 /pool/list/index.html,同一段連結拼出来的地址就變了。
- 协议相對寫法,例如以双斜杠開头的 //example.com/a/123.html。它會沿用目前頁面的协议。如果入口頁同时能被 http 和 https 訪問,蜘蛛在不同协议下抓到的目标地址可能被当成两個不同的 URL。
base 标簽會直接改寫拼接基准
如果入口頁的 head 里寫了 base 标簽,頁面上所有相對路径都不再以目前 URL 為基准,而是以 base 指定的地址為基准。這在模板复用的入口頁里很常见:模板本来是按主站寫的,base 指向主站域名,结果蜘蛛在入口頁上拼出来的目标連結全指向了主站或者一個不存在的路径。排查时先看這一行,往往比逐條检查連結更快。
几種容易忽略的连带問题
- 末尾斜杠。结尾有没有斜杠,在很多服務器上會被当成两個不同的地址,可能触發一次多余的跳轉。
- 大小寫。路径是否区分大小寫取决于服務器配置,入口頁和目标站配置不一致时,拼出来的地址可能直接 404。
- 參數與锚点。带查询參數的相對路径在拼接时容易被截断或重复,拼好後最好單獨訪問驗證一次。
什么情况下建议直接用绝對路径
如果入口頁會被多個域名、多個协议訪問,或者可能被搬到不同层級的目錄下,直接用带协议和域名的完整地址最省心。它的代價只是頁面体积略大一点,對抓取本身几乎没有實质影响。反過来说,只有当入口頁的部署位置長期固定、不會再動时,用相對路径才比較稳妥。
自查清單
- 把入口頁的 HTML 抓下来,以頁面自身的原始地址為基准,逐條拼接連結,看结果是否等于你想推的目标地址。
- 检查 head 里有没有 base 标簽,確認它的值是不是你想要的基准。
- 用同一入口頁的 http 和 https 两個版本各抓一次,比對拼出来的連結是否一致。
- 確認入口頁自身返回的地址是否稳定,有没有跳轉導致目錄层級發生變化。
- 把拼好的 URL 單獨訪問一次,確認返回正常且内容确實是你想推的那一頁。
相對路径本身不是問题,問题是它的解析结果取决于執行环境。蜘蛛池入口頁通常會被多處复用、反复搬迁,环境一變解析结果就變,這也是它比普通站点更容易踩坑的原因。發現地址不對时,先改寫法,再谈抓取和收錄。