faceted navigation:哪些筛选网址该放给爬虫,哪些该关掉

faceted navigation 里的筛选网址值不值得被抓,只看有没有人在搜它筛出来的那个东西。Google 写明的四种机制里只有两种拦得住抓取。这里给五类筛选网址的判读表,以及一套上线前逐条跑过的 robots.txt 规则 —— 外加托管平台上你还剩哪几种机制。

抓取与收录11 分钟读完2440 次阅读
faceted navigation:哪些筛选网址该放给爬虫,哪些该关掉

faceted navigation 是按单个筛选项去争取抓取的,不是整个功能一起争取。有人真在搜的那几个留给爬虫,其余的在 robots.txt 里关掉,空结果的组合返回真正的 404。爬虫不先取一次就分不出哪个筛选网址有用 —— 这句是 Google 自己写的,所以分类只能你提前做。判读表和一套验过的规则在下面。

读这篇前

这一篇接在另一个问题后面:抓取量到底是不是你的问题。几百个页面、没有筛选功能的站通常答不是,那种情况写在 crawl budget 是不是你的问题。另外两种机制在本篇只作为备选出现,各自有专章:canonical 标签该保留哪个网址noindex 与 robots.txt 冲突时听谁的。什么时候该读这一篇:Search Console 的报告里开始出现大量你没有手写过的网址。

faceted navigation 为什么会长出这么多网址

典型场景是这样的:一个开了半年的独立站,商品几百个,分类页上挂了颜色、尺码、材质、价格区间四个筛选维度,再加一个排序。没人专门做过这些页面,但 Search Console 的报告里已经躺着上万条网址,点开一看全是参数拼出来的组合。四个维度每个十个值,光是组合就是一万种,而货架本身只需要一个页面。

Google 对这个功能的定义很朴素:它 "allows its visitors to change how items (for example, products, articles, or events) are displayed on a page"。真正要紧的是爬虫遇到这些地址时会做什么:「Because the URLs created for the faceted navigation seem to be novel and crawlers can't determine whether the URLs are going to be useful without crawling first, the crawlers will typically access a very large number of faceted navigation URLs」(Faceted navigation best practices,2026-09-06 访问)。代价写在紧接着的一句里:「If crawling is spent on useless URLs, the crawlers have less time to spend on new, useful URLs.」

还有一笔账落在你自己的服务器上。同一份文档写着,抓取这类网址「tends to cost sites large amounts of computing resources due to the sheer amount of URLs and operations」。每一次请求都是一次带条件的数据库读取、一次模板渲染、一条再也不会有人访问第二次的缓存 —— 独立站用的又多是按流量或按算力计费的托管,这笔钱是真出账的。

一个筛选网址值不值得被抓,只看有没有人在搜它筛出来的那个东西。剩下的都是你自己拼出来的组合。

这句话两个方向都成立,这也是它是一道取舍题而不是一条可抄规则的原因。把带参数的地址全关掉,就会连真有需求的筛选页一起丢掉 —— 品牌页、某个被单独搜的尺码,这类页面在有些站上是实打实带量的。什么都不关,抓取就花在没有人输入过的组合上。两种做错都不会报错。

四种机制里只有两种拦得住抓取

Google 一共写了四种处理方式,它们不能互相替代。两种能让请求根本不发生,两种是写在页面里的说明 —— 而页面得先被取回来,说明才被读到。如果你要解决的是抓取量,只有前两种是冲着它去的。

机制拦得住抓取吗坑在哪
robots.txt 里 disallow得有一份你能改的 robots.txt
URL 片段(井号)要把每个筛选链接都改成前端形态
rel="canonical"不能慢,而且页面照样被取
rel="nofollow"不能全站每一个指过去的链接都得带

片段那一条能成立,靠的是一个限制而不是一个功能:「Google Search generally doesn't support URL fragments in crawling and indexing」,所以写在井号后面的筛选条件「will have no impact on crawling (positive or negative)」。如果你的筛选本来就在前端完成,这是很干净的结果;如果不是,它等于把整个列表交互重写一遍。

canonical 是最多人先伸手去拿、也最容易失望的一条。把筛选变体指回未筛选的列表页,官方的说法是「may, over time, decrease the crawl volume」。请读这句里的两个限定词:可能,而且要过一段时间。标签写在页面里,页面得先被取回来标签才存在 —— 你想省掉的那次请求,已经发生过了。

nofollow 的失败条件写在它自己的要求里:「every anchor pointing to a specific URL must have the rel='nofollow' attribute」。页脚漏一个、站内搜索结果漏一个、某人去年生成的一份网站地图里漏一个,这个属性就不再起作用。带筛选功能的站要长期守住这个条件,比想象中难得多。

动手做:先给筛选项分类,再写规则

五步,每一步当天就能验完。第四步是防止你把自己的分类页一起关掉的那一步,别跳。

  1. 把筛选界面能吐出来的参数名全部列出来。从代码里读,或者抓一遍分类页看它实际生成什么 —— 不要凭印象,筛选功能长出来的参数经常没人记录过。完成标志:一份写下来的参数名清单。
  2. 逐个标「留」还是「关」,判据只有一条:有没有人在搜这个筛选项筛出来的东西。完成标志:清单上每个名字都有结论,外加一行理由。
  3. 先定好两个筛选叠在一起怎么办。默认答案是关,因为组合的需求几乎总比单个筛选项稀薄。完成标志:一条写下来的通则,免得每加一个参数就重新吵一次。
  4. 把 robots.txt 规则写出来,上线前拿自己站的真实网址跑一遍。完成标志:基础列表页和纯翻页返回「放行」,「关」那一栏里的每个地址返回「屏蔽」。
  5. 让空结果返回正确的状态码。Google 这里写得很直白:「Return an HTTP 404 status code when a filter combination doesn't return results.」单页应用拿不到真实状态码时,官方指向它自己的 JavaScript SEO 指南。完成标志:一个筛不出商品的组合返回 404,而不是一个 200 的空列表。

交付物:判读表 + 一套验过的 robots.txt

先看哪类筛选网址该怎么处理。最右一列才是这张表的重点 —— 每一行都要付出点什么,而这正是你没法照抄别人那份 robots.txt 的原因。

筛选网址怎么做用哪种机制代价是什么
单个筛选项,且有人在搜留着让它被抓,从列表页链过去不用机制 —— 别让规则覆盖到它这一种形态的抓取开销要长期背着
只是排序或视图切换关掉robots.txt disallow没有代价。商品集合完全相同
两个以上筛选项叠加关掉robots.txt disallow少数真有需求的组合。把那一个单独做成一个正式网址
翻页上叠着筛选关掉,纯翻页保持放行robots.txt disallow靠后的商品只能靠不带筛选的翻页和网站地图被走到
筛不出结果的组合返回 404HTTP 状态码没有代价。Google 要的就是这个

再看规则本身。这套规则默认把带参数的地址全关掉,再单独放开两样:纯翻页,以及一个真有需求的筛选项。它只用了 robots.txt 真正支持的东西:* 匹配任意字符、$ 锚定结尾、最长的那条规则优先、长度相同时放行胜过屏蔽。

# robots.txt —— 默认关掉带参数的地址,再放开值得被抓的那几种
User-agent: *

# 1. 任何带参数的网址一律关掉
Disallow: /*?

# 2. 纯翻页放行;翻页上叠了筛选的不放行
Allow: /*?page=
Disallow: /*?page=*&

# 3. 有需求的那个筛选项放行;同一个筛选项跟别的叠在一起不放行
Allow: /*?brand=
Disallow: /*?brand=*&

# 按「最长规则优先」逐条跑过的结果:
#   /shoes                                    基础列表页       放行
#   /products/acme-runner                     商品页           放行
#   /shoes?page=3                             纯翻页           放行
#   /shoes?brand=acme                         有需求的筛选     放行
#   /shoes?brand=acme&color=green              两个筛选叠加     屏蔽
#   /shoes?page=3&color=green                  翻页 + 筛选      屏蔽
#   /shoes?sort=price_asc                     排序             屏蔽
#   /shoes?products=fish&color=radioactive_green&size=tiny   屏蔽
#   /shoes?color=green&brand=acme              brand 不在第一位 屏蔽  <-- 见下文

最后一行就是「必须自己跑一遍」的理由。被放开的那个筛选项,只有排在第一个参数位时才留得住,因为放行规则锚定在参数串开头的那个问号上。同一个筛选项换到第二位,就被那条大范围的屏蔽规则接住了。这不是要绕开的缺陷,它恰好解释了 Google 那条最佳实践为什么要求筛选项在网址里的顺序保持一致且合理。挑一种顺序,全站都按它生成,规则才可预测。

同一次检查里还有三件事要一起做。基础列表页必须留着。这一条要单独验,因为一条为了抓参数写的规则,完全可能顺手匹配上某段路径。想保留的筛选网址请用标准的 & 分隔参数,不要用逗号、分号或方括号,这是官方明确的偏好。另外别把 robots.txt 的 user agent 想得太细:Google 写明 Googlebot 的两种形态「obey the same product token (user agent token) in robots.txt, and so you cannot selectively target either Googlebot Smartphone or Googlebot Desktop using robots.txt」(Googlebot,2026-09-06 访问)。

上线前后各核一次。上线前,把你在意的每一种网址形态都过一遍「最长规则优先」的匹配器,或者在 Search Console 的 robots.txt 报告里一条条试。上线后,抓取量的变化会体现在抓取统计报告里,筛选出来的地址应该不再作为新发现的网址出现在网页索引编制报告里。要多久才看得出来,我们没测过,不给这个数。

托管平台上你还剩哪几种机制

这一节是给用 Shopify、各类建站工具或者第三方市场的人的。四种机制需要的权限不一样,先确认自己够得着哪几种,再去设计方案,别对着一种你根本改不了的机制做规划。具体到你的套餐和主题能改什么,得自己去后台确认一遍,这里只给对应关系。

你能改什么还剩哪几种
robots.txt 可编辑四种都能用
只能改主题模板URL 片段、canonical、nofollow
只能改页面级设置canonical
只有后台表单(市场平台)一种都没有,别在这件事上花时间

值得单说的是第二行。改主题模板意味着你能动筛选链接的写法,但动不了服务器怎么回应 —— 这时候真正能省下请求的只有片段那一条,而它要求筛选逻辑已经在前端完成。做不到就承认做不到,改去做 canonical,同时接受它省不下抓取。

三种常见的做错

最贵的一种是把自己要保护的那个列表页一起关掉。一条写得太松的规则,可能同时匹配上恰好含有同样字符串的分类路径,于是列表页连同它的筛选一起不再被抓。没有任何报错。等发现的时候通常已经过去几周,而且是从报告里发现的,不是从站上。检查只有一行:把基础列表页的地址扔进自己的规则里,确认它返回放行。

第二种是想省抓取,伸手去拿 canonical 或 nofollow。这两个都是对一个「已经被请求过」的网址提的说明,所以它们减不了请求数。canonical 按官方那句带保留的说法,可能随时间降低变体的抓取量;nofollow 要求全站每一个指过去的链接都带上属性,一直带下去。要解决的是请求量,就别开这两个抽屉。

第三种是把本来在带量的筛选页关掉了。品牌、尺码、材质这类筛选出来的列表,在有些站上确实有自己的需求,而且在你写规则之前它们是有展示次数的。关掉它们损失是实的,换回来的很少 —— 一种形态占整体抓取的比例本来就不高。先去看这些地址的搜索表现数据,再决定。等关完再想起来看,你手上已经没有可比的数了。

这条路到哪儿为止

四条边界。前两条是关于「没人知道」,后两条是关于「你够不够得着」。

  1. Google 公布了机制和各自的注意事项,没有公布「多少个筛选网址算太多」的阈值。没有一个可以拿来对照的数字,我们手上也没有。任何人给你一个「筛选页与商品页的比例应该是多少」的说法,那个数是编的。
  2. 我们没有做过能把「屏蔽筛选网址」的下游效果单独拆出来的对照实验。线上站也做不到,除非你有第二个一模一样的站同时跑着。有据可查的是机制,机制是行动的理由,不是结果的承诺。
  3. 托管平台上四种机制未必都在你手里,上面那张表就是干这个用的。改不了 robots.txt、改不了筛选链接的写法、决定不了空组合返回什么状态码,这三件事各自砍掉一种机制。
  4. robots.txt 管的是取不取,不管已经在索引里的东西。如果那些地址已经被收录、你想让它们消失,那是另一件事、另一套工具,而且先把路堵上只会让它更慢。

还有一件事该排在以上全部之前:确认爬虫真的能走到你的列表页。如果基础页面在你的应用上面那一层就被拒了,再怎么调整抓取的分配也没有意义,这一步可以用 AI 爬虫抓取检查 跑一次。

常见问题

faceted navigation 会拖累 SEO 吗?

不会因为它存在就拖累。有据可查的问题是:爬虫因为无法预先判断有没有用,会去访问大量这类地址,而花在无用网址上的抓取就是没花在有用网址上的抓取。一个几百页的站挂着两三个筛选项,不是这句话描述的处境。

该用 robots.txt 屏蔽筛选网址,还是用 canonical?

想拦住的是请求,就用 robots.txt。canonical 写在一个已经被取回的页面里,官方的说法也只是可能随时间降低抓取量。想让筛选页存在并把权重收拢到主列表,canonical 是对的工具;想让它压根不被请求,canonical 是错的工具。

Shopify 这类平台上的筛选网址怎么处理?

先确认你的套餐和主题实际开放了四种机制里的哪几种,再决定方案。有的托管平台允许通过模板改 robots.txt,有的不允许;筛选链接的写法通常由主题生成,不由你写。robots.txt 改不了时,剩下的是片段和 canonical 这两条,而它们回答的是不同的问题。

屏蔽筛选网址会把分类页一起弄没吗?

只有当你的规则同时匹配上分类页时才会 —— 这正是第四步存在的理由。上线前把基础列表页和一个商品页的地址过一遍规则,确认两个都返回放行。

筛不出结果的组合该返回什么?

返回 404。Google 的最佳实践要的就是「an HTTP 404 status code when a filter combination doesn't return results」,这样空列表不必靠给每一种不可能的组合单写一条规则就能挡在抓取之外。拿不到真实状态码的单页应用,官方给的替代路径是它的 JavaScript SEO 指南。

本文属于 QueryWin 实操手册 · 第 3 阶

faceted navigation:哪些筛选网址该放给爬虫,哪些该关掉