常见問题

入口頁連結寫成相對路径,搜尋蜘蛛解析出的 URL 會不會跑偏

相對路径本身不會被搜尋蜘蛛拒绝,真正的問题在于解析基准。本文說明入口頁用相對路径、base 标簽、重定向後,蜘蛛解析出的目标 URL 會怎么變,並给出自查步骤和更稳妥的寫法建议。

常见問题

入口頁連結寫成相對路径,搜尋蜘蛛解析出的 URL 會不會跑偏

在蜘蛛池的入口頁里,很多人图省事,把連結寫成 /target/page.html 或者 target/page.html 這種相對路径。這種寫法本身没有任何問题,搜尋蜘蛛和浏览器用的是同一套解析規則,但前提是:解析用的“基准 URL”要和你想的一致。一旦入口頁發生過重定向、被镜像過,或者頁面里出現了 base 标簽,相對路径解析出来的地址就可能和你要指向的目标 URL 差一截。

相對路径的基准到底是谁

相對路径的解析基准是文档自身的 URL,也就是浏览器地址栏最终停留的那個地址,而不是你当初提交给搜尋引擎的原始地址。举個例子:你提交的入口頁是 http://a.com/entry/,它 301 跳到 http://a.com/new/entry/,頁面上寫的是 ../target.html。蜘蛛實际會以 /new/entry/ 為基准,解析成 /new/target.html,而不是你预期的 /target.html。這種情况在蜘蛛池里很常见,因為入口頁经常套了一层跳轉或者 CDN 規則。

几種常见寫法的解析结果

  • 以斜杠開头:/target/a.html,以域名根為基准,無论入口頁在哪一层目錄,结果都固定,最稳。
  • 不以斜杠開头:a.html,以目前目錄為基准,即 …/entry/a.html。入口頁目錄一變,目标就變。
  • 用 ../ 回退:../target.html,回退一层。层數數错一层,地址就整体跑偏。
  • 协议相對://other.com/a.html,跟随目前頁面的协议。現在多數抓取环境按 https 處理,但如果入口頁還在 http 上,结果會有细微差別。
  • 只寫查询串或锚点:?id=1、#top,會被解析成目前頁面本身。這類“連結”不會带来新的 URL 發現。

base 标簽會整体挪動基准

只要頁面里出現 base href,頁面上所有相對路径的基准就會從文档 URL 換成這個 href。對蜘蛛来说同样生效。有些模板為了兼容多域名,會在 head 里寫一個固定的 base,结果入口頁挂在別的域名下时,所有相對連結都被解析到 base 指定的域名上。排查這類問题时,先看 head 里有没有 base,比一行行改連結更快。

尾斜杠和目錄判断容易被忽略

不带斜杠的路径,蜘蛛會当作文件處理,基准是它的上一級目錄;带斜杠則当作目錄,基准是它本身。入口頁地址是 /entry 還是 /entry/,會让同一段相對路径解析出两個不同结果。蜘蛛池批量生成頁面时,這两者经常混用,抓取日誌里就會出現一堆 404。

自查相對路径有没有跑偏

  1. 用抓取工具或站長平台看一下入口頁的最终 URL,確認重定向之後落到哪里。
  2. 用 curl -I 看 Location 头,把跳轉鏈路一层层列出来。
  3. 把最终 URL 贴進浏览器,打開開發者工具看連結被解析成了什么地址,和日誌里的抓取地址對比。
  4. 在服務器日誌里篩選目标 URL 的訪問记錄,如果出現大量带多余目錄层級的 404,基本就是基准错了。

更省事的寫法建议

  • 入口頁里的目标連結统一用完整绝對地址,带上 https 和域名,省掉解析环节。
  • 如果必须用相對路径,優先以斜杠開头寫根路径,避免受目錄层級影响。
  • 固定入口頁地址形式,要么都带尾斜杠,要么都不带,不要混。
  • 不要在入口頁里随意加 base 标簽,除非确實需要。
相對路径不是“蜘蛛不認”,而是解析结果取决于頁面的最终地址。入口頁一旦有跳轉,先把最终 URL 確認清楚,再看連結解析出来的地址對不對,比反复改連結寫法有效。

總的来说,相對路径能用,但它把“入口頁最终落在哪里”這個變量引入了 URL 解析。蜘蛛池的入口頁數量大、跳轉多,用绝對路径寫目标連結,能减少一批说不清的抓取失敗。至于目标 URL 能不能被收錄,還取决于目标站本身的狀態、内容质量和抓取配額,連結寫對只是其中一步。