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