搜尋抓取

URL 寫法里的细节:相對路径、大小寫與轉义字符,蜘蛛會怎么解析

蜘蛛發現 URL,靠的是 href 属性里那串最终地址。相對路径何时會被 base 标簽改寫、路径大小寫與结尾斜杠如何制造重复地址、井号與轉义字符為什么會被忽略——這些细节不决定頁面能不能打開,却决定蜘蛛會不會走弯路。本文梳理常见的連結寫法問题與自查方法。

搜尋抓取

URL 寫法里的细节:相對路径、大小寫與轉义字符,蜘蛛會怎么解析

蜘蛛讀連結,只認 href 里那串最终地址

搜尋引擎蜘蛛解析 HTML 时,關注的不是連結看起来像不像連結,而是 href 属性里最终得到的那個字符串。浏览器會替用戶纠正很多模糊寫法,蜘蛛的解析過程更接近“按規則照做”:規則清楚就往前跟,規則不清楚就放弃。所以連結寫法上的细节,常常决定一個 URL 能不能進入抓取队列。

相對路径能用,但要留意 base 标簽

相對路径(例如 /list/1.html、../about.html)蜘蛛能正常解析,前提是它知道目前頁面的基础地址。大多數情况下這個基础地址就是頁面自身的 URL,但如果頁面头部出現了 base 标簽,所有相對路径都會以 base 里的地址為基准計算。

歷史上因為 base 寫错、或者複製模板时忘了改,導致整站内鏈指向错誤目錄甚至別的域名的情况並不少见。對蜘蛛来说,這類問题的後果不是“抓不到”,而是“抓错”:它會顺着错誤地址去請求,可能拿到 404,也可能在別的路径下發現一批並不存在的 URL。

稳定起见,關键導航、面包屑、Sitemap 里的地址尽量寫成绝對 URL,路径细节不容易被模板层級影响。

大小寫與结尾斜杠:两個地址,還是同一頁

路径大小寫

域名部分大小寫不敏感,路径部分在多數服務器上是敏感的。/News/1.html 和 /news/1.html 在 Linux 环境下通常是两個不同资源。如果站内連結一會儿大寫一會儿小寫,蜘蛛就會把它們当成两個 URL 分別抓取,日誌里也會留下两份记錄。统一成小寫是最省事的做法。

结尾斜杠

/about 和 /about/ 是否算同一頁,取决于服務器配置。有的返回 301,有的两個地址都返回 200。如果两種情况都存在,等于给同一份内容制造了两個入口。建议全站保持一種風格:目錄型地址带斜杠,文件型地址带扩展名。

共同点是重复,不是打不開

上面两類問题的共同点在于:頁面没有坏,只是被拆成了多個地址。抓取预算有限,同一内容被抓两遍,真正的新頁面就少了一次机會。

井号後面的内容,蜘蛛基本不參與

URL 里 # 之後的部分叫片段标识,浏览器用它做頁内定位,但不會把它發给服務器——因為請求里根本没有這一段。蜘蛛也不會把 #section 当成一個新 URL。

  • 普通锚点如 #comment,只影响頁面定位,不影响抓取。
  • 用 #!/detail?id=1 這類 hash 路由组织的頁面,蜘蛛最初看到的是 # 前面的地址,後面的内容是否出現,取决于它是否执行脚本、以及脚本渲染得對不對。
  • 想保證可抓取,尽量使用真實路径(/detail/1),而不是靠 # 切換内容。

轉义與编碼:空格、中文與 & 符号

連結里出現空格、中文、& 等字符时,需要按規則编碼。常见的坑有:

  • 空格寫成 %20;寫成 + 只在查询字符串中表示空格,放在路径里含义不同。
  • 中文字符编碼後是一串 %E4%...;如果不同位置的連結有的用原始中文、有的用编碼形式,服務器可能视為两個地址。
  • HTML 属性里的 & 最好寫成 &。直接寫單個 & 有时仍能解析,但在部分解析器里可能被截断,導致後面的參數丢失。
  • 參數顺序不同(?a=1&b=2 與 ?b=2&a=1)服務器往往認為是同一頁,但對蜘蛛来说是两條字符串,需要靠規范化處理。

不要用脚本代替 href

把一個可点击入口寫成 a 标簽加 onclick 跳轉、href 却填 javascript:void(0),等于把人能点的入口變成蜘蛛看不见的入口。類似的還有用 div 加点击事件、用 span 做按钮、图片外面没有連結。

只要不是 a 标簽的 href,或者 href 里没有真實地址,蜘蛛通常不會把它当成發現 URL 的路径。如果确實需要脚本跳轉,至少保留一個指向目标地址的 a 标簽,脚本只做体驗增强。

容易被忽略的一類字符

  • 零宽空格、全角空格、全角問号混進 href,肉眼看不出来,連結直接失效。
  • 從後台編輯器或文档软件粘贴时,英文引号被替換成中文引号,属性解析出错。
  • 換行符、制表符插在 URL 中間。
  • URL 中出現分号或逗号,在部分服務器上會被当作路径參數處理。

怎么自查

  1. 抓取几十個典型頁面,把 href 提取出来列成表格,看有没有大寫路径、双斜杠、错誤的 base 影响。
  2. 在服務器日誌里找同一内容的多個地址變体,看它們是否都在被抓。
  3. 核對 Sitemap 里提交的地址與實际内鏈指向的地址是否一致。
  4. 對带參數的頁面,確認哪些是篩選产生的、哪些是可以長期存在的,再决定怎么收敛。
連結寫法規范化的收益,不体現在某一次抓取上,而体現在長期:蜘蛛每次来都少走一点弯路,省下来的額度才會回到真正的新内容上。

URL 寫法不是排版問题,而是蜘蛛理解站点结构的第一层輸入。把這些细节提前统一,比事後用各種規則去补救要轻松得多。