在蜘蛛池的日常运维里,入口頁的連結大多是用模板批量生成的,很少有人逐條检查最终指向。相對路径寫起来省事,但一旦层級、base 标簽或者协议寫法出問题,搜尋蜘蛛解析出来的绝對 URL 可能和你预期的不一样,等于把抓取請求送到了別的地方。
搜尋蜘蛛是怎么把連結變成绝對 URL 的
蜘蛛拿到頁面 HTML 後,會對每個 href 做一次解析:先取目前頁面的地址作為基准,再按規則拼出完整的 绝對 URL,然後才决定要不要發請求。這個過程和浏览器地址栏的行為基本一致,常见的處理顺序是:
- 如果 href 已经带 http:// 或 https://,直接使用;
- 如果以 // 開头,繼承目前頁面的协议,再补上域名;
- 如果以 / 開头,拼到目前域名的根目錄後面;
- 如果是 ../ 、./ 或者纯文件名,則從目前頁面所在目錄向上或向下推導。
問题基本都出在第 3、4 步——蜘蛛眼里的“目前目錄”取决于它抓取的那個頁面地址,而不是你本地文件夹的结构。
相對路径容易踩的几類坑
目錄层級與结尾斜杠
入口頁地址是 https://a.com/pool/index.html 還是 https://a.com/pool/ ,同样的 href="target.html" 解析结果可能不同。如果入口頁寫成 https://a.com/pool (没有结尾斜杠),不少服務器會先把它 301 到 /pool/ ,href="target.html" 在修正前後會经歷一次基准變化,中間多一次跳轉,也容易和真正的目标错位。
base 标簽會改變基准地址
模板里如果残留了 <base href="..."> ,蜘蛛解析相對連結时會以 base 指定的地址為准。這個标簽在采集模板和一些老後台里很常见,结果就是入口頁上所有相對連結全部指到另一個域名,而你在頁面上看不出任何異常。
协议相對與大小寫
以 // 開头的协议相對連結會繼承入口頁自身的协议。入口頁如果是被以 http 抓取,連結就會解析成 http:// ,即便目标是 HTTPS 站点,也會先经過一次跳轉。路径部分的大小寫同样要注意,在 Linux 服務器上 /Target.html 和 /target.html 是两個地址,搜尋引擎通常按原样抓取,不會自動帮你纠偏。
URL 编碼與參數
目标 URL 里带中文、空格或者 & 时,相對路径拼接後很容易被截断。& 在 HTML 里應该寫成 & ,否則蜘蛛解析參數时會丢掉後半段。带中文的路径則建议先做百分号编碼再放進 href。
為什么入口頁建议直接用绝對 URL
- 不受頁面地址、目錄层級、base 标簽的影响,解析结果唯一;
- 方便批量核對,連結列表可以直接和目标清單做比對;
- 减少 301、302 這類中間跳轉,蜘蛛一次請求就能落到目标;
- 目标跨域名时,不會因為协议繼承而走到错誤的 http 版本。
已经用了相對路径,怎么排查
- 用浏览器打開入口頁,右键查看連結,確認解析出来的绝對 URL 和目标一致;
- 查看頁面源碼,確認没有多余的 base 标簽;
- 在服務器日誌里對比蜘蛛請求的路径,看是否出現 404 或莫名其妙的目錄;
- 把入口頁上的連結抓取下来,和目标 URL 清單做一次批量比對。
連結能不能被發現,取决于蜘蛛解析出的那個地址能不能正常返回内容。相對路径本身没有错,但蜘蛛池是批量场景,越少依赖上下文,越容易定位問题。
最後提醒一句:把連結寫對,只是让蜘蛛顺利發出請求。能不能被抓取、能不能被收錄,還要看目标頁面自身的狀態、站点整体质量和抓取配額,没有哪一步能單獨决定结果。