入口頁輸出連結时,很多人图省事寫相對路径,或者在頁头加一個 base 标簽统一基准。這類寫法本身没問题,問题在于相對路径最终拼成什么地址,是由爬虫自己算的,而算出来的结果未必是你想指向的那個目标 URL。
搜尋蜘蛛怎么處理相對連結
爬虫拿到 HTML 後,會把頁面里每個連結地址和目前頁面的 URL 做一次拼接,得到一個绝對地址,再决定要不要抓。也就是说,相對連結的含义完全取决于目前頁面 URL 是谁。
常见的几種寫法和结果:
- 以斜杠開头,例如 href='/a/b.html':以目前域名為基准,無论目前頁在哪個目錄都指向同一個地址。
- 不以斜杠開头,例如 href='b.html':以目前頁所在目錄為基准。目前頁是 /x/y.html 时,拼出来是 /x/b.html,而不是 /b.html。
- 以点斜杠開头,例如 href='./b.html':和上一條同理,仍是相對目前目錄。
- 以双点斜杠開头,例如 href='../b.html':往上一层目錄,层數寫错就會指到別的路径。
- 以双斜杠開头,例如 href='//example.com/a.html':繼承目前頁面的协议。
最容易出事的是第二條。入口頁如果本身在一個子目錄里,而連結寫的是不带斜杠的相對地址,爬虫拼出来的地址會多一层目錄,目标 URL 就變成了另一個頁面,甚至直接 404。
base 标簽會整体改寫解析基准
如果入口頁的 head 里寫了 base 标簽,那么頁面里所有相對連結的拼接基准都會被替換成 base 指定的地址,而不是目前頁面 URL。這带来两個後果:
- 好處是入口頁可以在任意路径下复用一套相對連結,指向同一批目标 URL。
- 風險是 base 寫错、寫漏结尾斜杠,或者模板里残留了舊域名的 base,整頁連結的落点就會全偏。
比如 base 寫成 https://example.com/abc,那么 href='b.html' 會被解析成 https://example.com/b.html,而不是 https://example.com/abc/b.html。结尾少一個斜杠,目錄就少了一层,這類問题非常隐蔽。
還有几類字符會让解析跑偏
- 連結里带空格或中文没做编碼,爬虫可能截断地址,或者按编碼後的形式去抓,落点和预期不一致。
- 查询參數里的连接符没有正确轉义,參數會被拆错。
- URL 後面跟了多余的标点、引号或中文全角符号,會被当成地址的一部分。
- 用反斜杠代替正斜杠,只在部分环境下能被纠正,不能依赖。
- 連結用 onclick 或 data 属性承载,實际跳轉地址不在 href 里,爬虫通常不會把它当作連結。
怎么自查入口頁輸出的連結
- 把入口頁 HTML 抓下来,別只看浏览器渲染後的结果。
- 逐個連結取出原始寫法,按目前頁 URL 或 base 地址手工拼一次绝對地址。
- 對比拼出来的地址和目标 URL 列表,看有没有多目錄、少目錄、跨域或 404 的情况。
- 用站長後台的 URL 检查或抓取工具,確認爬虫實际請求的就是目标地址。
- 在服務器日誌里核對,看請求落在哪個路径上,和预期是否一致。
相對連結本身不會影响收錄,真正影响的是解析出来的绝對地址對不對。地址對了,剩下的還是内容质量和站点整体是否值得抓取,這些不是靠連結寫法能解决的。
简單说,入口頁里的連結最终長什么样,爬虫说了算。寫相對路径或 base 标簽之前,先確認基准是什么、拼出来的地址指向哪里,比事後翻日誌要省事得多。