常见問题

入口頁里的連結用相對路径還是绝對路径:搜尋蜘蛛解析目标 URL 时容易踩的坑

搜尋蜘蛛拿到入口頁 HTML 後,要先把你寫的 href 解析成绝對 URL,這一步出错,目标 URL 就不會被請求。本文說明相對路径、base 标簽、协议相對路径、未轉义字符與脚本連結容易造成的解析偏差,並给出一份可执行的自查清單。

常见問题

入口頁里的連結用相對路径還是绝對路径:搜尋蜘蛛解析目标 URL 时容易踩的坑

很多站点检查 URL 發現环节时,习惯盯着入口頁有没有被抓、日誌里有没有出現目标 URL,却忽略了一個更靠前的步骤:搜尋蜘蛛拿到入口頁的 HTML 之後,必须先把你寫在 href 里的那串字符,解析成一個完整的、可請求的绝對 URL。這一步出错,後面的抓取和收錄都無從谈起。

搜尋蜘蛛怎么把 href 變成要抓的 URL

搜尋蜘蛛讀到的是 HTML 源碼,而不是浏览器渲染後的结果(現代搜尋引擎會执行部分 JS,但連結發現的第一優先級仍是源碼里的 a 标簽)。解析时它需要一個基准地址,通常是目前入口頁自身的 URL;如果頁面里寫了 base 标簽,則以 base 為准。基准變了,同一個相對連結指向的目标就會跟着變。

几類容易解析错的寫法

相對路径:完全跟着入口頁地址走

寫 href="/a/1.html" 或 href="a/1.html",解析结果取决于入口頁自己的域名和目錄层級。同一段 HTML 放在不同入口頁上,會解析出不同的目标 URL。

  • 入口頁若能通過多個域名或子目錄訪問,同一個相對連結會产出多個目标版本
  • 入口頁地址结尾带不带斜杠,會改變上一級目錄的判断,/dir 與 /dir/ 下的 a.html 解析结果並不相同

base 标簽寫错或寫成相對值

base 标簽本意是给相對連結定基准。若 base 指向了另一個域名,或本身寫成了相對路径,頁面上所有相對連結都會整体偏移,蜘蛛請求的就不是你想推送的那個目标 URL。

协议相對路径與混合协议

href="//example.com/a" 這種寫法在 HTTP 與 HTTPS 入口頁下會被解析成不同协议。入口頁是 HTTPS、而目标站只支持 HTTP 时,請求可能直接失敗,URL 發現环节就在這一步断掉了。

未轉义的特殊字符與中文路径

空格、中文、# 在 URL 里都有特定含义。參數分隔用的 & 在 HTML 中應寫成實体形式,否則解析可能断在這里;带空格或中文的路径没有做编碼时,容易被截断或被理解成另一個地址;# 後面的内容属于頁内锚点,一般不會作為獨立的抓取目标。

寫在 JS、onclick、data-* 里的 URL

這些位置預設不作為連結被提取。如果入口頁的目标地址只存在于脚本拼接或点击事件中,能被發現並進入抓取队列的概率,明顯低于直接寫在 a 标簽 href 里的情况。

结尾斜杠與大小寫

/a 與 /a/、/Page 與 /page,在服務器上可能是同一頁面,也可能不是。解析出的版本如果和規范版本不一致,容易造成重复抓取,日誌里看起来“蜘蛛来了”,實际上抓的是另一個 URL 版本。

自查與统一寫法

  1. 從入口頁源碼里複製一個 href,按 URL 拼接規則手動與入口頁地址合並,看结果是否等于你要推送的目标 URL
  2. 抽查日誌中蜘蛛實际請求的 URL 字符串,與目标清單逐條比對,重点看斜杠、大小寫、參數顺序
  3. 检查入口頁是否存在 base 标簽,確認它指向的基准符合预期
  4. 尽量统一寫成带协议的绝對路径,减少對入口頁地址的依赖
  5. 如果目标 URL 只由脚本生成,考虑在源碼中补一個可直接解析的連結
連結能被正确解析出来,只代表進入了發現环节。後面還要经過抓取、内容判断、索引等步骤,任何一步的條件不满足,都不會出現在搜尋结果里。

把 URL 解析這一步對齐,入口頁的作用才能稳定落到目标 URL 上,日誌里的记錄也才有對照價值。