常见問题

入口頁用相對路径或 base 标簽寫連結,搜尋蜘蛛還能正确解析出目标 URL 吗

入口頁里寫相對連結很常见,但爬虫解析时會以目前頁面 URL 或 base 标簽為基准拼接成绝對地址。基准错一点,拼出来的目标 URL 就可能指向別的路径。本文讲清相對路径、协议相對連結、base 标簽和字符轉义對連結發現的影响,以及怎么自查入口頁輸出的連結落点是否正确。

常见問题

入口頁用相對路径或 base 标簽寫連結,搜尋蜘蛛還能正确解析出目标 URL 吗

入口頁輸出連結时,很多人图省事寫相對路径,或者在頁头加一個 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 里,爬虫通常不會把它当作連結。

怎么自查入口頁輸出的連結

  1. 把入口頁 HTML 抓下来,別只看浏览器渲染後的结果。
  2. 逐個連結取出原始寫法,按目前頁 URL 或 base 地址手工拼一次绝對地址。
  3. 對比拼出来的地址和目标 URL 列表,看有没有多目錄、少目錄、跨域或 404 的情况。
  4. 用站長後台的 URL 检查或抓取工具,確認爬虫實际請求的就是目标地址。
  5. 在服務器日誌里核對,看請求落在哪個路径上,和预期是否一致。
相對連結本身不會影响收錄,真正影响的是解析出来的绝對地址對不對。地址對了,剩下的還是内容质量和站点整体是否值得抓取,這些不是靠連結寫法能解决的。

简單说,入口頁里的連結最终長什么样,爬虫说了算。寫相對路径或 base 标簽之前,先確認基准是什么、拼出来的地址指向哪里,比事後翻日誌要省事得多。