常见問题

入口頁連結末尾带 # 锚点,搜尋蜘蛛會当成新 URL 抓取吗

入口頁里的連結加上 # 锚点,是不少人在整理站点連結时會纠结的细节。片段标识符不會随請求發送到服務器,/page#a 與 /page#b 通常被视為同一個 URL。本文說明搜尋蜘蛛處理锚点的實际過程、几種常见寫法的结果差异、如何用訪問日誌核對,並给出入口頁連結寫法上的實用建议。

常见問题

入口頁連結末尾带 # 锚点,搜尋蜘蛛會当成新 URL 抓取吗

先说结论:锚点不會變成新的 URL

URL 中 # 後面的部分叫片段标识符(fragment),它只對浏览器和頁面内定位起作用,不會發送给服務器。也就是说,訪問 /article 时,浏览器或搜尋蜘蛛向服務器發出的請求路径里只有 /article,#section 這一段會被去掉。因此 /article#a 和 /article#b 在服務器眼里是同一個地址,搜尋引擎通常也只把它們当作同一個 URL 處理。

搜尋蜘蛛請求时到底發生了什么

發現連結时,搜尋蜘蛛會先從 href 里提取出一個 URL,再做規范化:去掉 fragment、统一主机名大小寫、處理預設端口和多余斜杠等,然後把規范後的地址放進抓取队列。真正發起 HTTP 請求时,不會带上 # 後面的内容。所以正常情况下,服務器訪問日誌里是看不到 # 的;如果看到了,多半是日誌被手工拼接,或者来自其他抓取工具。

几種常见寫法的實际结果

  • /target#a 與 /target#b 同时出現在入口頁:一般只會發現一個 URL,不會因此多出两條待抓地址。想靠改锚点扩充 URL 數量,基本無效。
  • 寫成 <a href="/target#section">:這是最常见的用法,目标 URL 依然會被發現,锚点只影响用戶点击後滚動到頁面的哪個位置。
  • 同一入口頁里 /target 和 /target#top 混用:属于自我重复,對發現没有帮助,只會让頁面連結顯得杂乱。
  • SPA 的 hash 路由,例如 #/detail/123:真正的路径寫在 fragment 里,搜尋蜘蛛拿到的 HTML 往往只是一個空壳。這類地址能否被当成獨立頁面處理,取决于頁面渲染方式和搜尋引擎的具体實現,不确定性明顯更高,不适合作為蜘蛛池的主要發現手段。
  • 舊式 #! 寫法:早期那套 AJAX 抓取约定已被主流搜尋引擎放弃,繼續依赖它意义不大。

不确定时可以用這几種方式核對

  1. 打開服務器訪問日誌,搜尋目标路径,看請求行里是否出現 # 字符。
  2. 用浏览器開發者工具的 Network 面板,對比地址栏和實际發出的請求 URL。
  3. 把同一條連結临时改成不带锚点的寫法,观察日誌中的抓取情况是否有變化。如果两者表現一致,說明锚点從未參與過發現。

想让锚点發挥作用的做法

锚点本身不是坏東西,只是它承担不了發現新 URL 的职责。如果你确實需要多個可被獨立訪問的地址,應该把它們做成真實路径,例如 /list/1/list/2,而不是 /list#1、/list#2。這样每個地址都能單獨返回 200、單獨被連結、單獨出現在日誌里,後續排查起来也清楚。

對于需要滚動定位的長頁面,繼續保留锚点是合理的,但要把它們当成用戶体驗的一部分,而不是抓取策略的一部分。

對蜘蛛池入口頁的几点提醒

  • 入口頁的價值在于把真實可訪問的 URL 暴露出来,通過拼接片段来增加數量,不會带来額外的發現机會。
  • 检查入口頁时,優先看連結是否可点、是否返回 200、是否指向最终地址,而不是锚点寫得好不好看。
  • 被抓取和被抓取後的收錄是两件事。被發現不代表一定被收錄,還取决于目标頁的内容质量、重复程度和站点整体情况。
  • 不要因為日誌里没出現某條 URL,就立刻判断是锚点寫法的問题,先排除抓取配額、robots.txt、服務端响應等更常见的原因。
锚点解决的是頁面内定位,不是 URL 發現。把這两件事分開,入口頁的排查思路會清楚很多。