常见问题

入口页链接末尾带 # 锚点,搜索蜘蛛会当成新 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 发现。把这两件事分开,入口页的排查思路会清楚很多。