搜尋抓取

相對連結與 base 标簽:蜘蛛解析 URL 时容易出错的地方

蜘蛛解析連結时,相對路径的基准、base 标簽、字符集声明都會影响最终拿到的 URL。本文梳理這些常见誤判点,给出從原始 HTML 入手逐條排查的方法,以及统一使用绝對路径、固定拼接约定的稳妥做法,减少蜘蛛走進错誤目錄或空壳頁的情况。

搜尋抓取

相對連結與 base 标簽:蜘蛛解析 URL 时容易出错的地方

很多站点並不是没有連結,而是連結在蜘蛛眼里被解析成了另一個地址。相對路径、base 标簽、编碼声明這三件事如果處理得不一致,蜘蛛沿着頁面拿到的 URL 可能指向不存在的目錄,或者指向一個已经改版的舊结构。本文讲的是蜘蛛解析 URL 时的几個常见誤判点,以及怎么自己動手排查。

相對路径的解析基准

蜘蛛解析 href 时,需要先确定一個基准地址。這個基准預設是目前頁面的 URL,規則和浏览器一致。問题通常出在两類頁面上:

  • 带參數或带尾斜杠的列表頁。比如 /list/1 和 /list/1/ 是两個不同的基准,前者會把 ../../ 解析成上一級,後者會回退两层,同一段連結可能得到不同结果。
  • 多級目錄下的頁面,如果連結寫成 ../../detail/100,一旦目錄层級調整,連結就會指向错誤位置。

结论很简單:站内連結尽量用绝對路径,從根目錄寫起。多寫几個字符,換来的是路径不會随頁面位置漂移。

base 标簽會把基准挪走

如果頁面头部寫了 base href,蜘蛛解析相對連結时會以這個地址為准,而不是目前頁面。這個标簽常被用于统一去掉參數,或者作為歷史遗留的模板,但它會让所有相對連結都指向 base 指定的目錄。

常见後果是,頁面在 /a/b/ 下,連結寫着 detail/100,base 却指向 /,蜘蛛最终訪問的是 /detail/100,而不是 /a/b/detail/100。如果這個地址恰好能打開一個空壳頁,問题就更隐蔽了,日誌里看不出明顯报错,只是抓取到的内容一直不對。

编碼與字符集的影响

HTML 声明的字符集和服務器响應头返回的字符集如果不一致,蜘蛛按其中一種解碼,中文或特殊字符的路径就可能解析错誤。表現為日誌里出現大量乱碼 URL,或者頁面里的連結地址與手動打開时看到的不一样。

  • 确保响應头 Content-Type 中的 charset 與 meta 声明一致,優先以响應头為准。
  • URL 中的非 ASCII 字符统一做百分号编碼,不要在 HTML 里直接寫中文路径。
  • 检查頁面能否被正常解析,避免因编碼错誤導致後半段連結被整体吞掉。

容易被忽略的轉义問题

href 里的 & 没做實体轉义,解析时可能被当成實体的一部分;連結里夹杂空格、換行,或者模板變量没有替換成功,都會让蜘蛛拿到一個拼接坏的地址。另外,协议相對寫法 //example.com/a 在 http 與 https 混用的站点里也可能带来意外跳轉。

自己動手排查的步骤

  1. 用抓取工具或命令行拉取頁面的原始 HTML,而不是看浏览器渲染後的 DOM。
  2. 列出頁面里所有 href 與 src,逐條判断是绝對路径還是相對路径。
  3. 检查是否存在 base 标簽,確認它指向的目錄與预期一致。
  4. 對照日誌里的蜘蛛訪問记錄:如果大量訪問 404 或奇怪目錄,通常是解析基准出了問题。
  5. 抽查几個深层頁面,確認蜘蛛實际走的路径和你在浏览器里点出来的路径一致。
連結能不能被跟随,取决于解析後的地址是否正确,而不只是連結存在與否。

一個稳妥的寫法约定

站内連結统一使用以 / 開头的绝對路径,不带多余參數;需要跨域时寫完整的 https 地址;模板里拼接 URL 的地方做一次校驗,避免出現双斜杠、末尾空格或未替換的變量。把這些约定固化到模板和發布流程里,比事後從日誌里找错更省事,也更容易長期维持一致的抓取路径。