为什么先审筛选链接,而不是先改关键词
外贸独立站的产品分类页常同时提供材质、应用、规格、认证、颜色和排序筛选。它帮助采购人员缩小范围,却也可能把一个分类扩成成千上万个参数 URL:?material=steel&size=10&sort=price 与参数顺序变化、空结果组合、分页组合都会形成新地址。Google 的筛选导航抓取指南指出,这类近乎无限的 URL 空间会消耗服务器资源,并减慢重要新页面的发现。
本文适合有 50 个以上产品、已经使用分类筛选、能读取访问日志或 Search Console 数据的小团队。目标不是让所有筛选页收录,也不是简单把全部参数写进 robots.txt,而是完成一次可复核的路径盘点:哪些页面承担搜索需求,哪些只服务站内交互,哪些空组合必须返回 404,哪些链接不应进入 sitemap。前置页面模板可参考站内的外贸独立站产品页响应式图片审核。
先建立 URL 样本表
不要凭后台配置猜测。分别从分类页 HTML、站点地图、服务器日志和 Search Console 导出样本,建立最小审计表:
| URL 样本 | 来源 | 页面结果 | canonical | 是否内链 | 预期策略 |
|---|---|---|---|---|---|
/products/pumps |
导航 | 完整分类 | 自引用 | 是 | 保留索引 |
/products/pumps?material=steel |
筛选链接 | 有独有集合 | 待确认 | 是 | 人工评估 |
/products/pumps?sort=price |
排序 | 内容重复 | 指向分类 | 否 | 不索引 |
/products/pumps?size=x&size=x |
日志 | 无效组合 | 缺失 | 否 | 404 |
/products/pumps?page=999 |
日志 | 空列表 | 指向首页 | 否 | 404 |
抽样不能只取正常地址。每个参数至少包含单值、多值、顺序互换、重复参数、未知值、空结果、分页末页和大小写变化。再记录状态码、响应字节、产品数量、title、H1、canonical、robots meta 和页面内可点击链接数。团队由此能区分“模板看起来一样”和“HTTP 行为确实一样”。
可用一段小脚本做第一轮检查:
import requests
from bs4 import BeautifulSoup
urls = [line.strip() for line in open("facet-urls.txt", encoding="utf-8") if line.strip()]
for url in urls:
response = requests.get(url, timeout=20, allow_redirects=False)
soup = BeautifulSoup(response.text, "html.parser")
canonical = soup.select_one('link[rel="canonical"]')
robots = soup.select_one('meta[name="robots"]')
print({
"url": url,
"status": response.status_code,
"bytes": len(response.content),
"canonical": canonical.get("href") if canonical else "",
"robots": robots.get("content") if robots else "",
"products": len(soup.select("[data-product-card]")),
})
脚本输出只是证据,不替代人工审核。若站点依赖 JavaScript 渲染,应同时查看初始 HTML 和浏览器渲染后的 DOM,确认筛选入口是否是真正的 <a href>。Google 的电商站点结构文档提醒,抓取器通常不会像用户一样操作搜索框,产品仍需通过导航链接或 sitemap 被发现。
给参数分组,而不是给每个 URL 单独拍脑袋
把参数按业务作用分为四组。第一组是排序和展示参数,如 sort、view、columns,通常不改变产品集合的搜索意图,不应生成索引页。第二组是跟踪和会话参数,如 utm_*、session、临时时区,不能成为内部链接的长期地址。第三组是库存筛选,如材质、应用或认证,其中少数组合可能对应稳定的采购需求。第四组是分页参数,应保持唯一、连续且可抓取,但不要把带排序或无结果的分页混进 sitemap。
对每组写出一条统一决策:是否允许抓取、是否允许索引、canonical 指向哪里、内部链接是否可跟随、是否进入 sitemap、无结果返回什么状态。不要出现同一参数在分类 A 被禁止、在分类 B 又因模板遗漏而自引用的情况。
只有满足下列条件的筛选落地页才值得候选索引:有稳定需求和清晰业务对象;产品集合长期存在而非临时库存;title、H1、简介和 FAQ 有真实独有信息;页面有导航入口和站内链接;页面能被销售或运营明确负责。仅仅“结果有三个产品”不构成索引理由。
选择阻止抓取还是优化可抓取页面
如果团队不需要筛选 URL 出现在搜索结果,可对明确参数模式使用 robots.txt 阻止抓取,或让纯交互筛选使用片段。Google 文档同时说明,canonical 和 nofollow 的长期效果通常不如直接控制抓取路径;nofollow 还要求所有指向该 URL 的链接保持一致。robots.txt 不是删除已收录页面的按钮,也不能代替页面级索引决策,因此上线前要先确认这些 URL 是否已经被搜索引擎发现。
示例规则必须按真实参数审核后再用:
User-agent: Googlebot
Disallow: /*?*sort=
Disallow: /*?*view=
Disallow: /*?*session=
Disallow: /*?*material=
Allow: /products/pumps?material=steel$
如果少数筛选页确实承担搜索需求,就必须把它们当正式落地页维护。参数使用标准的 ?key=value 和 &;顺序固定;重复或未知参数返回 404;空结果在原 URL 返回 404,不要 302 到首页;可索引页使用自引用 canonical,并在 sitemap、内部链接和 canonical 中保持完全相同的 URL。Google 的电商 URL 文档建议减少返回相同内容的替代地址,并避免内部链接携带临时参数。
不要把所有筛选页 canonical 到主分类后就认为问题结束。canonical 是信号,需要抓取后才能被处理,而且搜索引擎可能选择不同规范页。它适合合并少量重复变体,不适合无限组合的源头控制。
修正分类页的链接生成
很多过度抓取来自模板本身:每个筛选选项都输出可跟随链接,用户每勾一次又把现有全部参数排列成新顺序。修复时先规范化参数:白名单键、白名单值、固定键顺序、去重值、移除默认值;再决定哪些组合输出 <a href>,哪些只用表单或客户端状态。
伪代码如下:
ALLOWED = {"material": {"steel", "plastic"}, "application": {"food", "chemical"}}
def normalized_facets(args):
cleaned = []
for key in sorted(ALLOWED):
values = sorted(set(args.getlist(key)))
cleaned.extend((key, value) for value in values if value in ALLOWED[key])
return cleaned
def facet_url(category, pairs):
return f"/products/{category}?{urlencode(pairs)}" if pairs else f"/products/{category}"
服务端同时验证组合。未知值、重复维度、超出允许组合数、分页超过末页都返回真正的 404。不要返回状态 200 再在正文写“没有产品”,这容易形成软 404;也不要把所有错误组合重定向到分类首页,否则日志无法区分用户错误和爬虫探索。
用 Search Console 与日志做双重验收
上线前保存七天基线:筛选路径的 Googlebot 请求数、非 200 比例、平均响应时间、分类页和新品页被发现所需时间、Search Console 页面索引报告中的重复或已抓取未编入索引样本。上线后按相同口径观察,而不是只看总收录量。
如果站点流量较小,Search Console 样本可能不完整,此时服务器日志和应用路由统计更重要。为参数 URL 增加规范化结果字段,例如 normalized、rejected_unknown_value、empty_result,按天汇总而不是记录采购人员输入的敏感内容。数据量不足时延长观察窗口,不要为了得到漂亮曲线频繁切换 robots.txt 规则。
人工验收至少包含:随机抽取二十个旧参数 URL;验证被保留页的 canonical、H1、产品集合和站内入口;验证被废弃组合返回预期状态;确认 sitemap 只包含规范分类、分页和正式筛选落地页;检查导航到产品详情页使用普通 <a href>。对于少量重要 URL,可用 Search Console URL Inspection 检查 Google 选择的 canonical,但不要把人工检查结果理解为排名承诺。
日志查询可以按真实格式改写,例如:
rg 'Googlebot.*GET /products/[^ ]+\?' access.log \
| sed -E 's/.*GET ([^ ]+) HTTP.*/\1/' \
| sort | uniq -c | sort -nr | head -50
重点不是请求数一定下降多少,而是无价值组合占比下降、404 行为稳定、重要分类和新品页面仍能被发现。小站点未必受 crawl budget 限制,但无限 URL 同样会浪费服务器和排查时间。
发布边界与回滚
不要一次封锁全部参数。先选择一个分类和一组明确无价值的排序参数,部署后观察日志与 Search Console,再扩展规则。发布前导出当前 robots.txt、路由配置、canonical 模板和 sitemap,确保可在一次部署内回滚。
若发现重要筛选页请求和展示同时消失,先恢复其内部链接与抓取许可,再检查该 URL 是否仍自引用 canonical、是否意外 noindex、是否从 sitemap 删除。若服务器 404 激增,核对是不是正常分页或库存变化被误判。robots.txt 规则使用子串匹配时尤其要测试,避免 sort 误伤产品型号或其他路径。
人工复核清单
- 是否从 HTML、sitemap、日志和 Search Console 四个来源建立样本。
- 是否区分排序、跟踪、库存筛选和分页参数。
- 可索引筛选页是否有稳定需求、独有内容、负责人与站内入口。
- 参数是否白名单化、固定顺序并去重,空结果与无效组合是否返回 404。
- canonical、内部链接和 sitemap 是否使用同一个规范 URL。
- 上线是否分批,有七天前后对照数据和可执行回滚方案。
完成这轮审核,交付物应该是一张可复查的 URL 策略表、若干明确的模板与路由改动,以及上线前后的日志证据,而不是一句“筛选页做 noindex”。