搜尋抓取

頁面里的連結寫歪了:相對路径、base 标簽與蜘蛛解析出的地址

蜘蛛抓取前會先把頁面 HTML 里的連結解析成完整 URL。相對路径层級、base 标簽、URL 编碼和一堆伪連結寫法,都可能让蜘蛛拿到取不到或指向別處的地址。這篇梳理常见的連結解析問题,以及自查时该盯哪几處。

搜尋抓取

頁面里的連結寫歪了:相對路径、base 标簽與蜘蛛解析出的地址

蜘蛛抓取一個頁面的第一步不是發請求,而是解析:它把 HTML 里的這類連結元素讀出来,按規則拼成完整的绝對 URL,再决定要不要進队列。這一步如果出错,頁面看着入口密布,蜘蛛手里却是一堆取不到的地址,或者指向了完全不相干的地方。所以排查抓取問题时,除了看服務器和日誌,也值得回头看一眼:連結本身寫對了吗。

把相對地址拼成绝對地址,是蜘蛛的基本動作

頁面里寫 href="/list/1/" 還是 href="https://www.example.com/list/1/",對人来说点到的地方一样,對蜘蛛来说却要先做一次拼接。拼接的基准預設是目前頁面的 URL,但如果頁面里存在 base 标簽,基准就會被整頁替換掉。

base 标簽:一行代碼改掉整頁連結的落点

base 标簽寫在 head 里,用来指定頁面内所有相對連結的基准地址。它常出現在几類场景:模板替換时预留的占位、多域名共用同一套 HTML、把静態资源指向 CDN。

問题在于它的作用范围是整個文档,而不只是资源文件。有人只是想用 <base href="https://cdn.example.com/"> 让图片從 CDN 加载,结果頁面里所有相對形式的站内連結也被带到了 CDN 域名下。蜘蛛走過去的可能是 CDN 上並不存在的路径,或者一個無法訪問的地址。

几個容易踩到的地方

  • base 的 href 缺少结尾斜杠,相對路径的拼接结果會多切或少切一层目錄。
  • base 指向的域名與站点實际域名不一致,蜘蛛抓到的是另一套环境。
  • 多個 base 标簽同时出現,浏览器通常只用第一個,蜘蛛的處理也未必如你所愿。
  • 把 base 寫在 body 里,位置本身就不規范。

如果只是為了资源走 CDN,更稳妥的做法是把资源地址寫成完整 URL,而不是用 base 改變整頁基准。

相對路径的层級陷阱

相對路径靠 ../ 回退目錄,寫起来省事,但把同一段模板复用到不同深度的路径下时,就容易错位。比如一段導航模板同时用在一級栏目頁和三級詳情頁,模板里寫的是 href="../about/",在一級頁面上指向的是站点的 about,到了三級頁面却變成了別的层級。

表現通常是:某些頁面上的内鏈能正常抓到,另一些頁面上的同類連結却返回 404,或者干脆指向了不存在的目錄。這類問题在模板复用时最隐蔽,因為出错的不是某一個連結,而是一整類頁面。

站内連結尽量用根路径(以 / 開头)或完整 URL,能省掉大量這類排查成本。

URL 里的编碼、空格和中文

带空格、中文、特殊符号的路径,不同寫法可能指向同一個资源,也可能指向不同资源,取决于服務器怎么處理。常见情况包括:空格寫成 %20 還是 +,中文是否做了百分号编碼,大小寫是否敏感,结尾有没有斜杠。

對蜘蛛来说,寫法不同往往就是不同的 URL,容易在站内形成一批内容相同、地址略有差异的入口。與其事後靠規范化規則收拾,不如在生成連結时就统一格式:同一類頁面用同一種寫法,结尾斜杠保持前後一致。

看着像連結、其實不是的寫法

下面這些寫法在浏览器里能点,但蜘蛛從里面取不到有效目标:

  • href="javascript:void(0)" 配合脚本跳轉:蜘蛛只看到一個脚本調用,看不到去向。
  • href="#" 或只带锚点的地址:指向目前頁面自身,不产生新入口。
  • 用 div、span 加 onclick 實現跳轉:没有連結元素,蜘蛛不會把它当入口。
  • href="mailto:"、href="tel:":属于其他协议,不是網頁地址。
  • 整块用图片或图标承载跳轉、旁邊没有可讀文本連結:即使能解析,锚文本也基本為空。

重要入口別只挂在脚本上,配一個真實的 a 标簽href,成本和風險都低得多。

协议相對連結與域名混用

//example.com/page/ 這種寫法會沿用目前頁面的协议。站点同时存在 http 和 https 版本、或者頁面本身在 http 下被打開时,蜘蛛從這里拼出来的地址可能落到非预期的那一份上。全站啟用 HTTPS 後,這類歷史寫法残留在模板里的情况並不少见。

另外要注意 www 與非 www、主域名與备用域名的混用。同一篇文章的内鏈一會儿指向 A 域名、一會儿指向 B 域名,在蜘蛛看来就是两套入口,權重和抓取都會被分散。

一條連結自查清單

  1. 頁面里是否存在 base 标簽,它的 href 是否真的需要覆盖全站連結基准。
  2. 站内連結是否统一用了根路径或完整 URL,而不是层层 ../ 的相對寫法。
  3. 同一類頁面的 URL 寫法是否一致:大小寫、结尾斜杠、參數顺序、编碼方式。
  4. 關键入口是否有真實 href,而不是脚本或 onclick 伪装出来的。
  5. 内鏈指向的域名是否统一,有無 www、协议版本混用。
連結解析出的偏差,往往不會报错。蜘蛛只是安静地少走了一些路,或者走到了別的地方。定期用抓取工具把重点頁面的連結抽出来看一眼實际地址,比事後從日誌里倒推要省力。