在蜘蛛池入口頁里放目标 URL 时,多數人會直接複製完整地址。但入口頁往往来自模板、程序動態生成,或者從別處搬运,連結寫法並不统一。相對連結、协议相對連結、頁面里残留的 base 标簽,都可能让搜尋蜘蛛解析出和预期不一样的 URL。這種情况不會报错,日誌里也有抓取记錄,只是抓到的地址不是你想要的那個。
相對連結按頁面自身 URL 解析
搜尋蜘蛛處理相對連結,依據的是目前入口頁的完整 URL,而不是你心里的目錄结构。常见的几種寫法:
- 以斜杠開头,如 /path/a.html,解析為目前域名根目錄下的這個路径。
- 不带斜杠,如 a/b.html,解析為入口頁所在目錄下的 a/b.html。
- 带 .. 則向上退一級。
- 以 // 開头是协议相對連結,會繼承入口頁的协议。
假设入口頁地址是 https://entry.example.com/spider/page1/index.html,頁面里寫 a.html,最终會解析成 https://entry.example.com/spider/page1/a.html,而不是站点根目錄下的 a.html。入口頁自身层級越深,偏差越大。
base 标簽會換掉解析基准
如果頁面里出現 <base href='...'>,那么頁面内所有相對連結都會以這個地址為基准解析。模板里遗留一個 base、CMS 自動輸出指向首頁的 base,都會让入口頁里的相對目标 URL 全部落到 base 指定的目錄下。排查时先在 HTML 源碼里搜尋 base 标簽,不要只看頁面顯示效果。
其他容易出偏差的寫法
- href 值里混入換行、多余空格或實体编碼,解析结果可能被截断。
- 連結含中文、空格、括号却没有做 URL 编碼,不同抓取程序處理方式不完全一致。
- 寫成 javascript: 或依赖 onclick 跳轉,搜尋蜘蛛通常不會执行脚本。
- 連結里的大小寫與真實路径不符。Linux 环境下路径区分大小寫,结果就是 404。
- 末尾斜杠有無不统一,同一個目标可能被解析成两個不同地址。
用日誌核對落地地址
最直接的方法是對照服務器訪問日誌:找到入口頁的抓取记錄,再看同一時間窗口里搜尋蜘蛛請求了哪些 URL。如果日誌中的地址和你投放的目标 URL 不一致,就回到入口頁 HTML 看連結的原始寫法。
- 確認入口頁最终返回的 URL,排除跳轉带来的影响。
- 检查頁面里是否存在 base 标簽,以及它的具体值。
- 把入口頁 HTML 抓下来,搜尋目标 URL 的關键片段,確認連結實际寫法。
- 用浏览器開發者工具查看連結被解析後的绝對地址,和日誌交叉比對。
相對連結本身没有對错,問题往往出在入口頁 URL 的层級和你寫連結时的假设不一致。
维護上的几点做法
入口頁數量少、手工维護时,直接使用完整绝對 URL 最省事。程序批量生成时,建议在輸出前做一次連結規范化:统一协议、统一域名、统一末尾斜杠規則,並给入口頁 URL 固定一個层級。不要在同一批入口頁里混用相對和绝對寫法,也不要保留来路不明的 base 标簽。
如果發現搜尋蜘蛛已经抓過错誤地址,不必急着改 robots 或加 nofollow,先修連結本身。错誤地址可能還會在日誌里出現一段時間,属于正常現象。修好之後,用新一批入口頁或修正後的連結重新观察抓取记錄即可。