商品页从首页点两下到不了,六成还挂在sitemap上

商品页从首页点两下到不了,六成还挂在sitemap上
张文保 更新 24 分钟阅读 4,798 阅读
本文目录
  1. 这次实测是怎么搭的,你要复现该注意什么?
  2. 分母:这个店到底有多少件货
  3. 分子:从首页出发两跳能走到的货
  4. 哪些站被扣掉了,为什么
  5. 从首页点两下,到底走得到多少件货?
  6. 最差的那个站,问题不在漏了几个链接
  7. 其余几个低覆盖的站,各有各的毛病
  8. 走不到的那2556件,都去哪儿了?
  9. 在sitemap里的那1520件:能被发现,但没有分量
  10. 连sitemap都没有的那1036件:真的谁都不知道
  11. 走得到,不等于看得见
  12. 哪些站的货排得最靠后?
  13. 静态HTML数出来的导航为什么不能信?
  14. 我的尺子坏了六次,每次都差点写出一个错结论
  15. 这件事在你自己站上怎么查?
  16. 第一步:拿到商品全集
  17. 第二步:拿到首页真正能点到的分类
  18. 第三步:把两跳的并集减出来
  19. 查出来之后,改哪几处最划算?
  20. 改完怎么确认真的生效了
  21. 这条结论在什么情况下不成立
  22. 常见问题解答
  23. 两跳走不到,是不是就等于孤岛页面?
  24. 那1520件在sitemap里的商品,Google到底会不会收录?
  25. 为什么不直接看Search Console的内链报告?
  26. 把每页商品数调大,是不是就能解决排队问题?
  27. 我的站不是Shopify,这套方法还能用吗?
  28. 分类页做了无限滚动,这个测量还准吗?
  29. 覆盖率要做到多少才算合格?
  30. 权威参考资料

摘要:拿41个英文电商站做了一次可达性实测。分母是这些站自己的商品清单,一共15643件;从首页出发、经过首页上能点到的分类页,两跳之内能走到13087件,走不到2556件,占16.3%。走不到的那批里有1520件仍然老老实实地写在sitemap里——爬虫知道有它,站内却没有一条路指过去。走得到的也不是都在明面上:按每页36件算,70.7%落在分类第一页,4.7%要翻到第11页往后才见得到,最靠后的一件排在第1033位。

先说清楚这件事的起点。做电商SEO的人多半有过这么一段经历:某个商品页迟迟不进索引,于是去改title、补描述、加结构化数据、往sitemap里再推一次。折腾一圈没动静,最后才发现——那个页面在整个站里没有任何一条链接指向它。

这个毛病有个不太好听的名字,叫孤岛页面。站内工具能扫出来,但扫出来的准不准,本身就是另一件事(保哥之前专门拆过孤岛页面检测的抽样口径怎么影响结论)。这次换个角度:不扫自己的站,去看别人的。

这次实测是怎么搭的,你要复现该注意什么?

先把口径钉死,不然后面所有数字都没意义。

分母:这个店到底有多少件货

用的是各站自己的商品清单接口,也就是Shopify那个不用登录就能读的 /products.json。这个出口本身保哥单独写过一篇,那篇讲的是它泄露了什么;这次只把它当尺子用,拿它回答一个问题:这个店对外发布了多少件商品。

它带分页,一页最多250条。我一直翻到返回不足250条为止,最多翻12页。翻满12页的站说明还没到底,分母只是个下界,这类站全部单独列出来,不进任何比例。

分子:从首页出发两跳能走到的货

第一跳是首页上出现的 /collections/ 链接,第二跳是这些分类各自的商品清单。两跳的并集,再加上首页直接链到的商品,就是分子。

为什么卡在两跳?因为这是绝大多数电商站的设计意图——首页挂导航,导航进分类,分类列商品,也就是常说的扁平三层架构谷歌在电商站点结构那份文档里把这条路径写得很直白:从菜单链到分类页,从分类页链到子分类页,最后从子分类页链到所有商品页。文档里还有一句话,基本上就是本文要验证的东西:如果分类页没有直接链到这个分类下的全部商品,光靠爬取,Googlebot可能找不到你所有的货。

哪些站被扣掉了,为什么

这一步花的时间比采集本身还长。60个候选站里,2个域名当时打不开,2个的商品清单返回空,剩下56个进了分析,最后只有41个进了干净口径。扣掉的理由分五类:

扣除理由怎么发现的
出口列的地址前台打不开ugreen抽6个handle只有1个是200,页面还提示This site doesn't match your current location
出口把颜色尺寸拆成了独立记录bollandbranch、peakdesign浏览器打开发现全部收敛到主商品页加参数
站里根本不用 /collections/ 这套地址harrys、functionofbeauty首页导航43条链接全挂在 /en/ 下面
商品清单翻页到顶还没到底aloyoga、everlane、flyingtiger、gymshark等翻满12页仍返回250条
导航分类数超过采样上限80chubbiesshorts、fahertybrand、menuspace等脚本自己记的标志位

第二类值得单独说几句。peakdesign的出口给了208条商品记录,sitemap给了247条,两边居然一个都对不上。第一反应是这站的sitemap漏得离谱。

实际不是。浏览器打开出口给的那个地址,比如 city-tote-15l-eclipse,直接301到了 city-tote?Size=15L&Color=Eclipse——它不是一件商品,是一个颜色尺寸组合。bollandbranch更彻底,2188条记录里2177条的handle结尾带一个下划线,全部收敛到主商品页加 ?color= 参数。这两个站的出口条数根本不是商品数,跟sitemap放在一起比是自找的。变体到底该合还是该拆,本身就是个老问题,产品变体的URL策略那篇讲得更全。

从首页点两下,到底走得到多少件货?

41个站,15643件商品,两跳走得到13087件,整体覆盖率83.7%。但逐站算的话,中位是96.5%,均值86.5%,最低的那个站只有27.2%,另有14个站是满分。

中位96.5%和整体83.7%差了13个百分点。这个差距本身就是结论:大多数站没问题,问题集中在少数几个站,而这几个站恰好是商品最多的那几个。拿中位数汇报会让你觉得天下太平,拿总量汇报又会让你觉得遍地是坑。两个数得一起看。

最差的那个站,问题不在漏了几个链接

magicspoon的覆盖率是27.2%,184件商品只有50件走得到。这个站的出口里有37个分类,但首页导航里能点到的只有一个,叫 shop-all

一开始我以为是浏览器没把菜单展开完。换了一套更凶的展开逻辑重跑,又数了一遍首页导航里的链接——确实有十几条指向 /collections/,但它们全是 /collections/shop-all?filter=granola/collections/shop-all?filter=pastries 这样的写法。去掉参数之后,还是同一个分类。

这就是问题的全貌:整站的商品导航是靠一个分类页加前端筛选参数实现的。对用户来说很顺手,点一下就换一组货;对爬虫来说,这些筛选参数不产生新的可抓取地址,shop-all 里装了50件,剩下134件就没有第二条路可走了。分面导航这套东西的治理老早就有成熟方案,筛选过滤怎么不拖垮抓取预算那篇拆过完整清单,只是多数人担心的是筛选器生成太多URL,很少有人反过来担心它一个URL都不生成。

其余几个低覆盖的站,各有各的毛病

商品两跳走得到走不到其中在sitemap里
magicspoon18450(27.2%)13441
framebridge23971(29.7%)16847
dreametech485241(49.7%)24457
mackweldon575306(53.2%)26911
liquiddeath210121(57.6%)8989
brooklinen471287(60.9%)18414
marinelayer25561680(65.7%)876872
decathlon518347(67.0%)171171

这几个站的分类页本身做得都不差(商品列表页那97条准则里,大半他们都照做了),问题出在上一层。marinelayer那一行最值得盯着看:走不到的876件里,872件在sitemap里。decathlon更整齐,171件走不到,171件全在sitemap里,一件不多一件不少。

走不到的那2556件,都去哪儿了?

把41个站走不到的商品并到一起,2556件里有1520件出现在自家sitemap中,占59.5%。剩下1036件两头都没有。

这两拨货的处境完全不一样,得分开说。

在sitemap里的那1520件:能被发现,但没有分量

sitemap的作用是帮搜索引擎发现地址,它不负责说明这个地址有多重要。sitemap能不能提升排名这个话题被讨论烂了,结论一直没变:能被发现和值得被排名是两码事。谷歌自己在电商文档里那句话也说得很客气——站内指向一个页面的链接越多,这个页面相对于站内其他页面就越重要。反过来读就是,一条站内链接都没有的页面,重要性下限是零。

所以这1520件的状态是:地址交出去了,Googlebot大概率也抓了,但站内没有任何一个页面替它说过话。它进不进索引全看内容本身够不够硬,一点外力都借不上。

连sitemap都没有的那1036件:真的谁都不知道

rothys是个极端例子。这个站有734件商品,175件两跳走不到,而这175件一件都没进sitemap。既不在导航路径上,也不在给爬虫的清单上,它们唯一的存在证明是那个不用登录就能读的商品出口。

mackweldon也类似:269件走不到,只有11件在sitemap里。

这类货怎么被发现?大概只剩三条路——外部链接、站内搜索结果页(多数站这类页面是noindex的,而且查得到和查不到长得还一模一样)、或者商品出口本身被当成feed抓走。都不是能指望的路。

走得到,不等于看得见

第一问答完了,还有半个问题没答:走得到的那些货,是站在门口,还是排在队伍最后面?

我记了每件商品在它所在的每个首页可点分类里的位置,取最好的那个名次。能算出名次的有13027件——比可达的13087件少60件,那60件是首页直接链过去的,压根没经过分类页,不参与排队。这13027件里,中位名次是14——大半的货确实站在门口。往后就陡了:第75百分位是46,第90百分位跳到150,第95百分位333,第99百分位796,最靠后的一件排在第1033位。

名次要换算成页码才有意义,而每页放几件是主题定的。Shopify官方的collection对象文档写明 paginate 每页上限是50件,实际主题常用24、36、50三档。我不去猜哪个站用了哪一档,三档各算一遍:

每页件数第1页第2页第3-5页第6-10页第11页往后
2462.8%13.1%12.4%4.8%6.9%
3670.7%11.9%8.8%4.0%4.7%
5076.5%10.3%6.6%3.9%2.7%

三档的结论方向一致:七成左右的货在第一页,但有3%到7%要翻过十页。翻十页是什么概念——用户不会翻,爬虫翻不翻取决于它愿意在这个站上花多少预算,而分页链接本身还会顺手把权重稀释掉一部分(内链权重漏进分页和重定向链这件事另有一篇专门讲)。

这个数比“走不走得到”更值得盯。走不到的是16.3%,是明确的病;排在第11页往后的这4.7%,账面上是健康的,实际处境跟前者差不了多少。

哪些站的货排得最靠后?

按每页36件换算,逐站算一遍“有多少比例的货要翻过第一页”:

可达商品第1页要翻页第6页往后翻页占比
casper215991162254.0%
baseus2181021162553.2%
marinelayer167980087924652.4%
awaytravel101149851330050.7%
outdoorvoices59032226820545.4%
untuckit53030422612542.6%
parachutehome151398153213635.2%
allbirds29421876225.9%

awaytravel那一行的第四列值得留意:1011件可达商品里有300件排在第6页往后,占了29.7%。这个站的两跳覆盖率是98.3%,账面上近乎满分。

另一头,有六个站一件货都不用翻页:brooklynbedding、drinkolipop、liquiddeath、materialkitchen、oclean、ritual。共同点是商品少(最多210件)、分类切得细,每个分类都装不满一页。货少的站在这件事上天然占便宜,这不是能力问题,是规模问题。拿这几个站当榜样去要求一个几千SKU的站,没有意义。

静态HTML数出来的导航为什么不能信?

整个实验里最容易翻车的是第一跳。我最初的做法是直接抓首页HTML,用正则捞 /collections/。跑完之后有四个站的读数是0——首页一个分类链接都没有。这个结论看着就不对劲。

换浏览器渲染一遍,答案出来了:

静态HTML渲染后DOM
gymshark092
avocadogreenmattress014
brooklinen529
thirdlove1149
chubbiesshorts98136

58个站里,渲染后更多的有11个,一样的39个,渲染后反而更少的有8个。最后一类挺反直觉:浏览器跑一遍,有的站菜单还没等脚本挂上去就被读走了,也有的站那个组件本身就没能正常起来。

所以两个通道都会漏,最终口径取的是两边的并集。就算这样,这个数仍然只是下界——爬虫和用户看到的页面不一样这件事,从来不是一次测量能测干净的。

我的尺子坏了六次,每次都差点写出一个错结论

这部分本来不打算写,后来觉得比结论更有用。做这类普查,最大的风险不是数据不够,是你量出来的东西根本不是你以为的那个东西

坏在哪差点写出的错结论怎么发现的
把扁平的sitemap当成分卷索引,去抓了8个商品页当地图这个站的sitemap里一件商品都没有打印根文件的头几行,发现是urlset不是sitemapindex
/es/ 语言版本也并进商品清单wusthof的sitemap比商品出口多出292件按分卷地址里的语言前缀拆开重算,翻译过的handle被算成了另一批货
只用静态HTML抓导航有四个站首页一个分类入口都没有浏览器渲染一遍,gymshark从0变成92
把出口条数当商品数peakdesign的出口和sitemap完全对不上浏览器打开发现全是变体级地址,301收敛到主商品
没验证出口地址在前台还活着ugreen有1270件商品没进sitemap抽样请求,6个里5个404,站按地区路由到了另一个店
把导航里的链接条数当成分类数magicspoon的首页其实能点到12个分类去重后只有1个,那12条全指向 shop-all 加不同筛选参数

最后一条是我自己看错了自己的中间输出,不是站的问题。写下来是因为这个错误形态很典型:看到一个反常的数,先确认自己读的是哪个口径的数,再去怀疑数据源。同样的道理在补一组自对照就能把74%的差异砍到2.2%那篇里讲过一次,这次又碰上了。

这件事在你自己站上怎么查?

不需要写爬虫,三步就够。Shopify站可以照着抄,别的平台把地址换成对应的接口或者站点地图。

第一步:拿到商品全集

curl -s "https://你的域名/products.json?limit=250&page=1" | jq -r '.products[].handle' > all.txt
# 一直翻到返回不足 250 条为止,逐页追加
wc -l all.txt

翻页一定要翻到底。这一步偷懒,后面全白做。

第二步:拿到首页真正能点到的分类

别用 curl 加正则,前面那张表已经说明问题了。用无头浏览器打开首页,把鼠标从导航项上依次划过一遍,再取链接:

// playwright,取渲染后 DOM 里的分类 handle
const s = new Set();
document.querySelectorAll('a[href]').forEach(a => {
  const m = (a.getAttribute('href')||'').match(/\/collections\/([^/?#]+)/);
  if (m) s.add(m[1].toLowerCase());   // 注意去掉查询参数再去重
});

去重必须在去掉查询参数之后做,否则 shop-all?filter=ashop-all?filter=b 会被当成两个分类,覆盖率立刻虚高。

第三步:把两跳的并集减出来

for h in $(cat navcols.txt); do
  curl -s "https://你的域名/collections/$h/products.json?limit=250" | jq -r '.products[].handle'
done | sort -u > reach.txt
comm -23 <(sort -u all.txt) reach.txt > unreachable.txt
wc -l unreachable.txt

unreachable.txt 就是从首页两跳走不到的货。再跟sitemap对一次,就知道它们属于前面说的哪一拨。整个过程对一个几百SKU的站,跑完不超过十分钟。

查出来之后,改哪几处最划算?

按投入产出排,从便宜的开始。

先看筛选参数有没有吃掉你的导航。这是magicspoon那个形态,也是最值钱的一处。判断方法很简单:把首页导航的链接抓下来,去掉查询参数再去重,如果去重后剩下的分类数是个位数、而你的分类总数是几十上百,那么你的分类体系在爬虫眼里几乎不存在。改法是给主要的筛选条件生成真实的分类地址,而不是全部塞进参数里。这件事牵动的不只是抓取,类目导航改版本身就是个反复返工的活。谷歌那份筛选类地址的抓取管理文档是从反面写的——它教你怎么让爬虫少抓一点,但同一套判据反过来用同样成立。

再看有没有一个真正的全集入口。14个覆盖率100%的站里,多数都在导航或者页脚挂了一个装下全部商品的分类。这一条几乎零成本,加一个链接的事——不用担心链接多了摊薄权重,那个稀释惩罚早就是个过时的幽灵。入口摆在首页首屏的分类区最省事。要注意的是这个入口本身可能很深——如果全集里有两千件货,那商品仍然排在第几十页,只解决了“走得到”,没解决“看得见”。

然后看分类的排序和分页。排在第11页往后的那批货,靠调排序规则就能救一部分。常见做法是给新品、有货、高毛利的商品加权重往前提,而不是一律按上架时间倒序。另外别把每页件数调得太小——每页24件和每页50件,第11页往后的比例差了2.6倍。

最后才是补sitemap。顺序不能反。sitemap解决的是发现,内链解决的是分量,先补sitemap会让你看到收录数上升然后停住,因为那些页面在站内仍然一票没有。顺带一提,生成器说格式正确的时候其实只查了三件事,它不会告诉你少列了谁。电商站的sitemap该怎么分片、lastmod怎么写才诚实,百万SKU的sitemap实战那篇有完整方案。

改完怎么确认真的生效了

把第三步的脚本存成定时任务,每周跑一次,只看 unreachable.txt 的行数。这个数应该单调往下走。如果改完之后行数没变,多半是你新加的分类页本身没被首页链到——那就成了套娃,新开的分类页自己变成了孤岛。

这条结论在什么情况下不成立

写到这儿必须把边界交代清楚,不然这篇文章就是在推销一个万能判据。

两跳这个口径本身是人为的。真实站点常有三层结构:首页到大类,大类到子类,子类才到商品。按两跳算,第三层的货全算“走不到”,但它们其实是设计好的、健康的。所以16.3%这个数应该读成“两跳之内的可达率”,不是“孤岛率”。要判断真孤岛,得把爬取深度放开到三跳四跳,代价是请求量翻好几倍。

货少的站没必要看这个指标。几十件商品的站,随便怎么摆都是全可达,测出来100%也说明不了什么。前面那六个零翻页的站就是例子。这套东西的价值区间大概是三百件商品往上。

不用 /collections/ 结构的站,这把尺子直接失效。harrys和functionofbeauty就是被这一条扣掉的。自建站、Magento、Shopify的无头前端,路径结构各不相同,得换成对应平台的分类地址规则重写正则,逻辑不变但代码要重写。

商品出口关掉的站测不了。这一整套的分母依赖那个公开的商品清单,站主把它关掉之后就只能退回到爬全站。这也是为什么样本只有六十个站——一百三十多个候选里,出口还开着的就这些,再走完一遍扣除只剩41个能算比例。

还有一点:这次采集是单线程、每个请求间隔2秒跑的,接口请求合计4893个,另外用无头浏览器打开了130多个页面,全程没有触发任何一个站的限流。如果你要对别人的站做这类测量,请保持同样的克制。

常见问题解答

两跳走不到,是不是就等于孤岛页面?

不等于。孤岛页面的定义是站内没有任何一条内链指向它,而两跳走不到只说明它不在“首页到分类到商品”这条主路径上。它可能挂在第三层的子分类下,可能被博客文章链过,也可能出现在推荐位里。要确认是真孤岛,得把全站爬完再看入链数。两跳这个口径低估了可达性,所以16.3%要读成孤岛率的上界,真实的孤岛只会比它少。

那1520件在sitemap里的商品,Google到底会不会收录?

会抓,收不收录看内容本身。sitemap负责发现,不负责证明重要性。实际影响更多体现在优先级上——同一个站里,一个有几十条站内链接的商品页和一个一条都没有的,抓取频率和进索引的速度会拉开差距。想直观感受这件事,可以拿这两类页面各挑十个,去Search Console的网址检查里对比一下上次抓取时间,量大就走检查API批量拉

为什么不直接看Search Console的内链报告?

可以看,但它回答的是另一个问题。内链报告统计的是Google已经发现的链接,是结果;本文测的是站点当前的导航结构能通向哪里,是原因。而且内链报告的数字和站内爬虫扫出来的经常对不上,两边口径不同,别硬凑。

把每页商品数调大,是不是就能解决排队问题?

能缓解,但有代价。每页50件比每页24件确实把第11页往后的比例从6.9%压到2.7%,可是每页塞得越多,页面越重、首屏越慢。关键渲染路径那笔账要一起算。比较稳妥的做法是每页36件加排序优化,而不是一味往上堆。

我的站不是Shopify,这套方法还能用吗?

逻辑通用,实现要换。核心是三样东西:一份完整的商品清单、一份首页真正能点到的分类清单、每个分类下的商品清单。Magento有分类接口,WooCommerce有REST API,自建站最不济也能从sitemap拿商品全集、用无头浏览器爬两层。唯一不能省的是第二步必须用浏览器,静态HTML在这件事上不可靠。

分类页做了无限滚动,这个测量还准吗?

分子的口径不受影响,因为我用的是分类的商品清单接口,不是页面上渲染出来的卡片。但“排在第几页”这个换算对无限滚动没有意义,得换成“要滚多少屏”。粗略换算是把每页件数换成一屏的商品数,通常是6到12件,那么名次150大约要滚十几屏——比翻四页还难指望。

覆盖率要做到多少才算合格?

没有权威阈值,本文样本的中位是96.5%。保哥的经验判断是:低于90%就该查一下原因,低于70%基本可以断定导航结构出了系统性问题,而不是漏了几个链接。更重要的是看趋势——上新之后这个数掉不掉,比绝对值有用得多。

权威参考资料

分享到
标签
版权声明

本文标题:《商品页从首页点两下到不了,六成还挂在sitemap上》

本文链接:https://zhangwenbao.com/product-two-click-reachability-audit.html

版权声明:本文原创,转载与引用请注明作者与原文链接。许可协议: CC BY 4.0

继续阅读
发表评论
分享到微信 或在下方手动填写
支持 Ctrl + Enter 提交