先把结论说清楚:锚点不参与抓取请求
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。