常见问题

入口页目标链接带 # 锚点或 utm 参数,搜索蜘蛛到底会发现哪个 URL

入口页里的链接多写一个 # 或几个跟踪参数,搜索蜘蛛看到的 URL 可能完全不同。# 后面的内容通常不参与抓取,而 ? 开头的查询参数会被当成 URL 的一部分,容易把一个目标页面拆成十几条地址。本文说清两者的区别、常见坑和验证方法。

常见问题

入口页目标链接带 # 锚点或 utm 参数,搜索蜘蛛到底会发现哪个 URL

入口页里的链接写起来很简单,但 URL 里多一个 # 或者多几个 ?utm_xxx 参数,搜索蜘蛛看到的东西就可能和你以为的不一样。这两类符号的处理逻辑几乎相反,混在一起谈很容易得出错误结论。

先说 # :锚点后面的内容通常不参与抓取识别

URL 里 # 之后的部分叫片段标识符(fragment),它本来就不是给服务器看的,浏览器请求时不会把它发出去。对搜索蜘蛛来说,情况类似:

  • http://a.com/page#top 和 http://a.com/page#section2,一般被当成同一个 URL
  • 服务器日志里通常看不到 # 后面的内容,因为这部分不会进入 HTTP 请求行
  • 入口页只放带锚点的链接,目标 URL 依然可能被发现,只是被发现的是去掉锚点后的那个地址

也就是说,想用锚点来区分同一个页面上的不同位置,对搜索抓取是没有意义的。真正决定抓取的是锚点前面的路径和参数。如果目标页面是单页应用、靠 # 路由切换内容,那更需要留意:搜索蜘蛛看到的很可能只是那个 HTML 外壳。

再说 ? :查询参数是 URL 的一部分,情况正好相反

查询参数会随请求发给服务器,属于 URL 的组成部分。搜索蜘蛛一般会把带不同参数的地址当成不同 URL,比如:

  • ?utm_source=xxx&utm_medium=xxx
  • ?ref=1
  • ?from=spider

同一个目标页面,如果在入口页里用十几种参数拼出十几条链接,就可能被当成十几个地址。结果是抓取预算被摊薄,同一个内容重复抓取,真正想被发现的页面反而排到后面。参数越多、组合越随意,这种浪费越明显。

参数很多时,搜索蜘蛛不一定全抓

搜索引擎对参数 URL 通常有自己的取舍策略,常见做法包括:按规则合并相似参数、只抓其中一部分、或者干脆降低这类地址的优先级。所以你可能看到入口页里写了 50 条链接,日志里只来了 8 条请求。这不一定代表入口页失效,而是对方在按自己的节奏筛选。

反过来说,如果你的目标是让某个具体页面被尽快发现,就不要把它的地址包装成一堆带参数的变体,那样只会让发现路径变模糊。

实操上怎么减少无意义的重复发现

  1. 入口页里指向同一目标的链接,参数写法保持统一。不要一会儿带 utm、一会儿不带、一会儿又换成 ref,同一个目标只用一种干净形式。
  2. 把统计参数交给前端脚本拼接,不要写死在 HTML 的 a 标签里。抓取到的是静态 HTML,前端拼的参数通常不会被当成链接地址收录。
  3. 用 canonical 指向不带参数的主版本。注意这是建议而非命令,搜索引擎可以忽略,所以它能减轻问题,但不能替代前两条。
  4. 必要时在 robots.txt 里屏蔽特定参数模式,或在站长平台使用 URL 参数相关工具做统一处理。屏蔽前先确认这个词组不会误伤正常页面。
  5. 内链和 sitemap 只提交干净版本,让主要的发现入口保持一致。

怎么验证你的入口页实际被发现了哪些 URL

  • 看服务器日志里的请求行,重点留意 query string 部分,不要只看路径
  • 用站长平台的抓取统计或 URL 检查功能,看对方实际记录的地址形态
  • 把日志里去重后的 URL 数量,和入口页里实际写的链接数量做对比,差值往往就藏着参数问题
别只看入口页写了多少条链接,要看服务器实际收到了多少条不同的请求 URL。两条链接在页面上看起来不一样,在日志里可能就是同一个地址;反过来,看起来一样的页面,可能已经变成十几条地址。

几个容易忽略的细节

  • 参数顺序不同(?a=1&b=2 与 ?b=2&a=1)通常被视为不同 URL,入口页生成的链接最好固定顺序
  • 大小写敏感的参数值也会造成分裂,例如 ?id=abc 与 ?id=ABC
  • 目标 URL 结尾带不带斜杠,很多时候是两个地址,入口页里保持一致即可
  • 如果入口页链接里同时出现 # 和 ?,比如 page?p=2#comment,抓取识别一般以 page?p=2 为准

这些都不是什么高深技巧,只是把 URL 写得干净一致。入口页的作用是把路径铺清楚,而不是制造一堆近似的地址让搜索蜘蛛自己去猜。把参数和锚点这两件事分清楚,再用日志验证一次,通常就能知道问题出在哪一步。