常见問题

入口頁連結带 # 锚点:搜尋蜘蛛抓的是哪個 URL

入口頁連結寫成 /target#section 时,搜尋蜘蛛請求的通常是 # 前面的地址,片段不會進入 HTTP 請求,也不會出現在訪問日誌里。本文說明带 # 連結的抓取處理方式、hash 路由的常见坑,以及蜘蛛池入口頁寫連結时如何让目标 URL 更清楚。

常见問题

入口頁連結带 # 锚点:搜尋蜘蛛抓的是哪個 URL

先给结论

如果你在入口頁里寫的是 /target#section,搜尋蜘蛛向服務器請求的通常是 /target,而 #section 不會出現在 HTTP 請求里。片段一般由浏览器或客戶端自己處理,用来定位頁内位置,不會作為獨立 URL 去抓取。因此,入口頁里带 # 的連結能不能帮你發現目标 URL,關键看 # 前面的地址是否是一個真實、可訪問、值得抓取的 URL。

搜尋蜘蛛看到带 # 連結时的處理顺序

可以按下面几步理解:

  1. 入口頁 HTML 里出現一個連結地址,比如 /target#section。
  2. 連結解析器會把它拆成路径 /target 和片段 #section。
  3. 抓取队列通常只把 /target 当成待抓取 URL,片段被忽略或僅作為同頁位置信息。
  4. 如果 /target 可訪問,搜尋蜘蛛可能抓取它;如果 /target 本身不存在,只看 # 後面的内容没有意义。

所以,同一個目标 URL 用不同的锚点寫成 /target#a、/target#b、/target#c,一般不會因此變成三個不同的待抓取 URL。它們最终指向的服務器請求地址都是 /target。

日誌里為什么看不到 # 後面的内容

網站訪問日誌记錄的是服務器實际收到的請求,片段不參與請求,自然不會出現在日誌里。你看到的是 GET /target,而不是 GET /target#section。如果你用日誌判断入口頁里的連結有没有被跟,记得不要拿 # 後面的内容去搜,找不到是正常現象。

需要驗證的是 # 前面的路径有没有被請求,以及請求来自哪個 IP、返回了什么狀態碼。

hash 路由是另一回事,但不要混用

有些站点用 # 做前端路由,例如地址形如 /page#/detail/123 或 /page#!/detail/123。這類寫法把重要内容藏在片段之後,服務器收到的仍然只是 /page。搜尋蜘蛛對 hash 路由的支持有限,且不同搜尋引擎處理方式並不完全一致。如果你希望目标 URL 更容易被發現,更稳妥的做法是:

  • 用真實路径或查询參數承载内容,例如 /detail/123 或 /detail?id=123。
  • 如果必须用前端路由,尽量使用 History API 生成不带 # 的地址,並保證服務器能返回對應内容。
  • 入口頁里给出的連結,優先寫成不依赖片段就能訪問的完整 URL。

蜘蛛池入口頁里寫連結的几個注意点

  • 把關键路径放在 # 之前。例如要暴露 /item/1001,就寫 /item/1001,不要只寫 /item#1001 這類把 ID 藏在片段里的形式。
  • 不要用锚点充当不同頁面。同一路径加不同片段,通常不會带来額外的 URL 發現。
  • 锚点連結可以保留,但不要指望它單獨抓取。頁内導航用 # 没問题,但目标 URL 本身要能被直接請求。
  • 检查前端渲染。如果連結是 JavaScript 動態寫出的,且地址里带 #,先確認最终寫入 DOM 的 href 到底是什么。

排查清單

  1. 從入口頁源碼里複製連結,去掉 # 及其後面的部分,得到候選目标 URL。
  2. 用這個候選 URL 直接請求,看狀態碼和内容是否正常。
  3. 在服務器日誌或抓取日誌里搜尋這個候選路径,確認是否出現過請求。
  4. 如果日誌里完全没有,检查入口頁是否被 robots 屏蔽、連結是否 nofollow、是否由 JS 异步注入、是否位于多层跳轉之後。
  5. 如果日誌里有請求但狀態異常,先解决 404、403、429 或驗證頁問题,再谈後續抓取。

小结

带 # 的連結不是洪水猛兽,但片段部分基本不會被搜尋蜘蛛当成獨立 URL 去抓。做入口頁和 URL 發現时,把真正希望被抓的地址放在 # 前面,並确保它能被直接訪問、能在日誌里看到請求,這样排查和运营都會更清楚。不要依赖片段制造“很多 URL”的假象,也不要把片段地址当成驗證抓取的有效依據。