先把结论说清楚:锚点不參與抓取請求
URL 里的 # 及其後面的部分叫片段标识符,它只在浏览器本地生效,不會随 HTTP 請求發送给服務器。也就是说,当搜尋蜘蛛請求 https://example.com/a.html#part2 时,它實际發出的請求是 https://example.com/a.html,#part2 這一段在請求里根本不存在。
因此,入口頁里寫 /a.html#top、/a.html#price、/a.html#comment 三條連結,對搜尋蜘蛛来说是同一個 URL 被重复列了三次,而不是三個可發現的新地址。
搜尋蜘蛛處理锚点連結的常见方式
- 發現阶段:連結會被提取,但提取出来的地址已经去掉了 # 後面的部分。
- 去重阶段:同一入口頁里指向同一路径、只有锚点不同的連結,通常會被合並成一個待抓 URL。
- 抓取阶段:請求只包含路径和查询參數,服務器返回的永遠是頁面的完整内容,不會因為锚点返回不同片段。
- 索引阶段:搜尋引擎可能把带锚点的連結当作跳轉到頁面某一段的入口来展示,但归属的仍是同一個頁面地址。
所以,用锚点来“把同一個目标 URL 變成多條不同連結”這個想法,在發現环节基本不起作用,只是让入口頁的連結數量看起来更多。
真正需要留意的三種情况
1. 目标站用 hash 做前端路由
如果目标 URL 属于 #/list/123 這種前端 hash 路由形式,那么路径對服務器是同一個,而真實内容靠浏览器里的 JavaScript 渲染。搜尋蜘蛛請求到的往往只是應用的外壳頁面,拿不到對應資料。這不是锚点寫法的問题,而是内容没有以服務端可返回的形式存在,這類地址很难被單獨收錄。更稳妥的做法是改成服務端可响應的真實路径,或配合预渲染。
2. 锚点後接了查询參數
要注意顺序:锚点是 URL 的末端。寫成 /a.html#x?id=5 时,?id=5 已经落在锚点内部,不會被当作查询參數传给服務器,連結實际上等同于 /a.html。如果本意是传參,參數必须放在 # 前面。
3. 入口頁里锚点連結過多
入口頁如果在同一批目标 URL 上挂了大量無意义的锚点變体,只會稀释連結密度,让真正需要被發現的地址在頁面结构里顯得更靠後。對搜尋蜘蛛来说没有增益,對人看頁面也没有帮助。
實用寫法建议
- 需要被發現的每個目标 URL,在入口頁里出現一次即可,不必為了“多几條連結”反复加锚点。
- 锚点只在頁面内部跳轉时使用,例如目錄、回到顶部,不要指望它改變被抓取的地址。
- 入口頁連結尽量使用带协议的绝對路径,减少拼接歧义。
- 如果确實需要区分不同内容,用不同的真實路径或查询參數,而不是锚点。
- 定期检查入口頁,把指向同一路径的锚点重复連結清理掉,让頁面里的連結清單更干净。
- 目标站若是前端渲染,優先確認服務端能否直接返回内容,再考虑是否值得放進入口頁。
锚点解决的是“跳到頁面哪一段”,不是“發現哪個新地址”。把它当成連結數量的放大器,通常只是白費功夫。
把锚点用回它本来的用途,入口頁的連結清單會更清晰,搜尋蜘蛛在發現阶段也更容易识別出真正有效的那批目标 URL。