搜尋抓取

搜尋蜘蛛抓取:base 标簽與相對路径解析異常造成的入口偏移

站点日誌里常出現一批没设計過的陌生 URL,路径被重复拼接或落到错誤目錄。這類問题多數不是服務器重定向造成的,而是 HTML 解析阶段的基准地址出了偏差。本文從 base 标簽、末尾斜杠、相對路径寫法几個角度,给出定位與收敛入口的排查顺序。

搜尋抓取

搜尋蜘蛛抓取:base 标簽與相對路径解析異常造成的入口偏移

入口偏移是什么样子

站点抓取日誌里出現一批你從未设計過的地址:路径被拼接两次、目錄名重复、或者带上多余的上級路径。這些地址往往還能正常打開,服務器命中了同一條規則返回 200,于是蜘蛛會反复来抓,真正需要被發現的頁面反而被稀释。

它和 HTTP 重定向不是一回事。重定向發生在請求發出之後,而這里的問题發生在 HTML 解析阶段:蜘蛛讀到的确實是你頁面里的那個連結,但它按規則算出来的目标地址和你预期的不一样。

base 标簽為什么容易出問题

base 标簽會改變整頁所有相對連結的解析基准。只要它寫错一個层級,或者被前端脚本在執行时插入,頁面上成百上千條連結會一起偏移。

三類高频寫法問题

  • base 的 href 本身寫成相對路径,例如以 /sub/ 為基准,相對連結就會再拼一层,容易出現 /sub/sub/ 這類地址。
  • 末尾斜杠缺失:带斜杠和不带斜杠的基准解析结果不同,前者把最後一段当目錄,後者會把它当文件、退到父目錄去算。
  • 多份 base 或多個模板混用:同一個站里有的頁面寫了 base,有的没寫,從同一個入口点進去,同一段相對連結會落到不同位置。
排查时先看服務器返回的原始 HTML,而不是浏览器里渲染後的 DOM。前端在執行时插入 base 的情况不少,你在控制台看到的和蜘蛛初次拿到的可能並不一致。

相對路径本身的坑

即使没有 base 标簽,寫法不统一也會造成偏移,常见的有几類:

  1. 使用一級相對寫法,比如指向上一級目錄的連結。頁面一旦被搬到另一個层級,連結就指向別處。
  2. 連結中混入空格、全角斜杠、连續重复斜杠。部分服務器會归一化,部分不會,日誌里就多出若干等價入口。
  3. 大小寫不一致:在区分大小寫的环境里,同一個頁面會被当成两個地址,各自被單獨抓取。

相對稳妥的做法是全站内鏈统一用站点绝對路径,也就是以斜杠開头,或者直接寫完整域名。多打几個字符,換来的是一致性。

確認問题来自哪里

不要凭感觉改,先按下面顺序定位:

  1. 從日誌里挑出五到十條陌生地址,记錄它們被請求时對應的来源頁。
  2. 用命令行抓取来源頁的原始 HTML,搜尋 base 标簽以及出問题的那段連結原文。
  3. 手動按解析規則算一遍:基准地址加上連結原文,看结果是否與日誌中的陌生地址一致。一致就基本鎖定了。
  4. 再在渲染後的頁面里核對一次,判断問题出在模板還是執行时脚本。

修复與观察

修改思路是從减少變量開始:

  • 能不用 base 就不用;确實需要时,href 寫成完整域名並带末尾斜杠。
  • 内鏈改為站点绝對路径,避免各種相對的寫法。
  • 模板收敛,头部由一處生成,避免多套模板各寫各的。
  • 對已经产生的错誤入口,用 301 指向正确頁面,不要让它繼續返回 200。

改完之後观察一到两周的抓取日誌,重点看陌生地址的出現频次是否下降、目标頁面的抓取次數是否回升。這個過程不會立刻见效,蜘蛛對舊地址的重訪有一定惯性,但入口持續收敛,通常比反复提交地址清單更管用。

顺带核對两件事

一是站点地图與内鏈是否指向同一套地址,两套地址並存會让收敛效果打折;二是服務器是否會因為重复斜杠、大小寫差异生成多個可訪問副本。入口越干净,浪費在重复地址上的抓取资源就越少。