虎扑 SEO 实测:6.44 亿个帖子 ID,站内地图只写 238 个地址
虎扑社区六类模板实测:分页控件有 UI 却没有链接,参数分页与首屏完全重合,sitemap 238 条地址里只有 1 条帖子。
虎扑的问题不在内容量。按站内自增的帖子 ID 算,这个社区的帖子编号已经走到 6.44 亿;按 sitemap 算,站方主动交给搜索引擎的地址只有 238 条,其中帖子 1 条。
两个数字之间不是「收录慢」,而是结构上就走不到。版块首屏 49 到 70 条之后,服务端没有输出任何一条可跟随的分页链接;换参数翻页,返回的仍是第 1 页,两个响应的帖子集合完全重合。
这篇用六类模板的原始 HTML、四种 UA 的对照请求和 sitemap 逐条解析,把「入口在哪一层断掉」拆开来看,并给出按优先级排序的修改清单。
一、先看分母:帖子 ID 已经走到 6.44 亿
两条版块的最新帖指向同一个自增区间
我取了两个入口:「步行街主干道」(bbs.hupu.com/1)与「步行街」(bbs.hupu.com/all-gambia)。
前者首屏 49 条帖子链接,ID 从 641,967,310 到 643,901,886;后者 70 条,最大 ID 同一量级。
两个不同版块的最新帖落在同一个编号区间,说明 ID 是全局自增的。因此 643,901,886 可以当作「历史上创建过的帖子数量级」的上界,它包含已删除、已私密、已合并的条目,不等于可索引帖数。
但它足以定位问题:一个存量以亿计的 UGC 站点,搜索引擎能顺着链接走到的帖子,是每版块首屏的那几十条。
入口侧的地图只有 238 条地址
bbs.hupu.com 的 robots 里声明的 sitemap 是 pc-sitemap.xml,22,840 字节,238 条 <loc>,去重后仍是 238 条。
| 归属 | 条数 | 说明 |
|---|---|---|
| bbs.hupu.com 数字版块 | 213 | 形如 /1、/74、/294 的版块首页 |
| nba / cba / soccer 频道 | 17 | 赛事频道首页与数据页 |
| my.hupu.com | 3 | 个人中心入口 |
| www.hupu.com | 2 | 站点首页等 |
| 帖子详情页 | 1 | /54779217.html |
| 被 robots 禁止的 /search | 1 | 见下一节 |
238 条里帖子只有 1 条,占比 0.42%。同时 238 条全部带 changefreq=always,0 条带 lastmod,0 条带 priority——「永远在变」这个信号对每个地址都成立,等于没有信号。
而 www.hupu.com/sitemap.xml 本身是 302 跳回首页:一个按惯例请求 sitemap 的引擎,拿到的是一份 HTML。
sitemap 里还躺着一个被 robots 拒绝的地址
bbs.hupu.com/robots.txt 里写着 Disallow: /search。
而同一份 robots 声明的 pc-sitemap.xml 里,第 20 条 <loc> 就是 https://bbs.hupu.com/search——紧挨着它上一条,恰好是整份地图里唯一的那条帖子。
这不是致命错误,但它说明 sitemap 是手工或半自动拼出来的,没有和抓取规则做交叉校验。引擎抓这个地址会吃一个「已禁止」,长期会降低 sitemap 的可信度。
同一份 robots 还有两处值得记下:19 组 UA 逐个写 Allow: /,最后用一个通配组(User-agent: *)关门;以及 Disallow: /*_*.html$,它拦的是文件名带下划线的地址。

图 1:条形按同一线性比例绘制,能看到「存量」与「入口」不在一个数量级上。
二、页面结构:六类模板的五项基础项
分页控件有 UI,没有 href
「步行街主干道」的版块页,服务端渲染出的分页控件是这样的:
把这三行的标签摊开看:
- 第 2 页:
li.pagination-item-2 > a,锚点文本为 2 - 省略位:
li.pagination-item-8 > a,锚点文本为 ... - 第 20 页:
li.pagination-item-20 > a,锚点文本为 20
三个 <a> 全部没有 href。控件上写着 20 页,服务端一条链接都没给,翻页完全依赖 React 绑定的事件。抓取端拿到的 HTML 里,第 2 页起的 19 页等于不存在。
「步行街」(/all-gambia)更彻底:连分页控件都没有,首屏 70 条之后没有任何入口。
这条问题的量级可以直接算:213 个数字版块 × 49 到 70 条 ≈ 1.05 万到 1.49 万条帖子,是站内直线可达的上限;而帖子 ID 已经走到 6.44 亿。
参数分页与四种写法:全是 200,全无 canonical
我试了四条路径:/1、/1?page=2、/1-2、/1/。四条全部返回 200。
其中 /1?page=2 与 /1 的帖子集合完全相同:各 49 条,交集 49 条,Jaccard 系数 1.000,两个响应的字节数同为 304,121 B。也就是说,参数分页没有生效,只是把第 1 页又发了一遍。
更麻烦的是这三种变体都没有 canonical 指回主地址,也没有 rel=prev/next。
大小写变体 /All-Gambia 返回 200(293,460 B,等于社区首页),带斜杠的 /all-gambia/ 返回 200(284,454 B,另一个版本)。
一条版块地址能派生出四种 200 响应、四个不同字节数、零条 canonical。这类重复不会直接掉排名,但会持续消耗抓取预算——分配逻辑可参考这份 17 分钟抓 1.7 万页的实测。

图 2:左边是服务端真实输出的分页 HTML,右边是两个地址的帖子集合重合度。
软 404:随机串回到社区首页
请求 bbs.hupu.com/zzz-not-exist-98765,返回的是 200,292,943 字节。
把它和社区首页(293,460 字节)的脚本、时间戳去掉后做标准化比对,两份 DOM 完全相等——包括 67 条帖子链接。这不是「404 页面」,而是「把首页当 404 发出去」。
帖子地址去掉后缀也一样:/643897939(无 .html)返回 200 与 293,902 字节,落回社区首页。
一个亿级 URL 的站点允许任意字符串返回 200,等价于对引擎说「我这里没有不存在的页面」。任何一次外链写错、任何一次拼接错误,都会变成一条可被抓取的重复首页。
标题、描述、H1 的模板化
六类模板的原始 HTML 统计如下,图片 alt 的数据放在第三节单列(2026-11-13 抓取):
| 模板 | 载荷(KB / 汉字 / B·字) | H1 | canonical | JSON-LD | viewport |
|---|---|---|---|---|---|
| www 首页 | 427.4 / 10,079 / 43.4 | 0 | 无 | 0 | 无 |
| 社区首页 | 286.6 / 3,443 / 85.2 | 0 | 无 | 0 | 无 |
| 版块页 | 272.8 / 3,383 / 82.6 | 0 | 无 | 0 | 无 |
| 帖子详情 | 223.0 / 9,111 / 25.1 | 1 | 无 | 0 | 有 |
| 回帖第 2 页 | 15.9 / — / — | 0 | 无 | 0 | 无 |
| nba 频道 | 158.8 / 3,360 / 48.4 | 0 | 有(自指) | 0 | 有 |
三件事在这一张表里同时成立:
其一,结构化数据全站为零。一个讨论型社区最该用的 DiscussionForumPosting,六类模板一条都没有;帖子页有 9,111 个汉字、42 张图、1 个 H1,却没有任何机器可读的实体声明。
其二,canonical 只在 nba 频道出现,且是自指;首页、社区首页、版块页、帖子页、回帖第 2 页五个模板全部缺失。
这与晋江文学城那次的结论是同一类问题:不是不知道 canonical,而是只在某一个子系统里做了。
其三,视图声明分裂。首页、社区首页、版块页都没有 viewport,帖子页和 nba 频道有——同一站点的移动体验取决于用户落在哪个模板上。
描述字段的复用更直接:首页、社区首页、版块页、软 404 页共用同一句 92 字描述,只有帖子页与频道页是专属文案。
而帖子页的描述是从正文硬截断的 65 字,断在半句——这次抓到的样本停在「你手里多了一份加热好」。

图 3:五项基础项里,只有结构化数据一列是六行全空。
三、关键词布局与外链:title 装得下什么词
三种分隔符并存的 title
抽六个页面的 title 摆在一起:
| 页面 | title | 字数 |
|---|---|---|
| www 首页 | 虎扑体育-虎扑网 | 8 |
| 社区首页 | 虎扑社区-虎扑网 | 8 |
| 版块页 | 虎扑步行街-虎扑社区 | 10 |
| 另一版块 | 步行街主干道 - 虎扑社区 | 12 |
| nba 频道 | 篮球|虎扑篮球-虎扑网 | 11 |
| 帖子页 | 水池干了, 不是小鱼的错-历史区-虎扑社区 | 21 |
分隔符出现了三种写法:连字符、连字符加空格、竖线(上表里显示为全角|)。这属于模板层不统一,本身不影响排名,但会让标题在搜索结果里显得零散。
真正的问题是信息密度。版块页 title 只有「版块名 + 社区名」10 个字,没有地域、没有品类、没有赛季,等于放弃了「版块名 + 长尾词」这一层关键词。
帖子页的 title 把「标题 - 版块 - 社区」拼在一起,21 个字里有效信息 9 个字,剩下全是后缀。
meta keywords 还在:首页是「虎扑,NBA,足球,英超,LPL」,版块页是「虎扑,生活,情感,社会,热点」。这个字段对主流引擎已无作用,但说明旧的填写习惯还在,且没有迁移到 description 与结构化数据上。
图片 alt:378 张全空,等于放弃图片搜索
首页 378 个 <img>,378 个没有 alt 属性;帖子页 42 张全部没有;版块页 5 张全部没有;nba 频道 87 张里 86 张没有。
虎扑的流量结构里图片占比不低——比赛图、球员图、赛后数据图。全部无 alt,等于把这部分入口完整让给了别人。这不是「SEO 玄学」,是几十万张图的可访问名称字段空着。
外链:3 到 8 条,且没有 nofollow
四个模板的出站链接数分别是 8、3、3、3,几乎全部是招聘页(app.mokahr.com、lagou.com)与备案链接(beian.miit.gov.cn)。
没有一条带 nofollow。招聘站与备案站都是可信来源,风险不大,但这反映的是同一个问题:外链在模板里是硬编码的装饰件,没有经过 rel 治理,也没有随内容变化。
内部链接集中在头部:首页 269 个 <a>、74 条指向帖子;社区首页 481 个、67 条;版块页 486 个、70 条。帖子页 138 个,其中 54 条指向用户主页,只有 19 条指向其它帖子。
用户主页占掉帖子页三分之一的链接配额,是「社区感」的代价,也是抓取预算的分流。这一点与游民星空那次的发现同源:不是没有内链,而是内链全部堆在首屏和导航上。
另外两条与抓取直接相关的观察:
- 空 UA 与 python-urllib/3.11 请求版块页,返回 405(4,681 字节的错误页);curl、GPTBot、ClaudeBot、PerplexityBot、Baiduspider 全部 200。
- 移动端不统一:bbs 的桌面地址对 iPhone UA 返回 302 到 m.hupu.com/gambia,www 首页不跳;m 站的 canonical 自指 m.hupu.com,不与桌面版建立对应关系,而 m 站首页只有 43 个
<a>、0 条帖子链接。
四、优化建议:按投入产出排优先级
下面的清单按「改一处、影响多大」排序,每条都标了优先级与改动位置。P0 是本迭代该做的,P1 排到下个迭代,P2 是结构性改造。
P0:把第 2 页还给抓取端
① 给分页锚点补真实 href(P0,改动量:1 个组件)。目标形态 href="/1?page=2"。注意必须同时让服务端真的按参数取第 2 页数据——目前参数无效,只补 href 等于把第 1 页再发一遍。
② 给版块页加顺序化路径(P0,路由层)。/1/page/2 这类可静态化的路径比参数更稳,也便于在 sitemap 里按页扩展。
③ 软 404 改回真 404(P0,网关或 SSR 层)。命中条件三条:帖子 ID 不存在、版块别名不存在、任意未匹配路径。当前随机串返回 200 且 DOM 等于首页,是最容易被批量利用的一类缺陷。
④ 把 /search 从 sitemap 里删掉(P0,配置层)。它被 robots 明文禁止,留着只会降低整份 sitemap 的可信度。
P1:把重复收敛掉,把实体声明出来
⑤ 五个模板补 canonical(P1,模板层)。首页、社区首页、版块页、帖子页、回帖分页页各一条自指 canonical;回帖第 2 页应指向帖子第 1 页,或声明为分页序列的一员。
⑥ URL 变体统一 301(P1,路由层)。/All-Gambia、/all-gambia/、/643897939 三种写法都应 301 到规范地址,而不是各自返回 200。
⑦ 帖子页加 DiscussionForumPosting(P1,模板层)。至少含 headline、datePublished、author、interactionStatistic、isPartOf。这是最该有、也最容易拿富结果的一块。
⑧ sitemap 换成帖子级(P1,数据链路)。按更新时间切片,先提交近 30 天有新回复的帖子,每条带 lastmod,去掉 changefreq=always。238 条里 1 条帖子的地图没有意义。
P2:把模板里的浪费补回来
⑨ 描述与标题分模板生成(P2,模板层)。首页、社区首页、版块页各写各的 60 到 120 字;版块页 title 补品类与赛季词;三种分隔符统一成一种。
⑩ 图片 alt 按内容生成(P2,上传链路)。比赛图用「球队 + 球员 + 场景」,数据图用「指标 + 时间范围」。首页 378 张全空,这是最大的一块未使用资产。
⑪ 移动端与桌面端建立对应关系(P2,模板层 + 跳转)。m 站 canonical 指回桌面版,桌面模板补 viewport,跳转策略统一。两套 canonical 各自自指,等于让两个版本竞争同一批查询。
⑫ 用户主页链接收敛(P2,模板层)。帖子页 54 条用户链接占掉三分之一配额,可考虑折叠或加 nofollow,把预算留给帖子之间的互链。
做完 ① 到 ④,最直接的变化不是排名,而是「第 2 页之后的帖子第一次存在」。做完 ⑦ 和 ⑧,才谈得上让引擎理解「这是一个有多少回复、什么时候发的讨论」。虎扑的存量足够大,缺的是让存量可见的那几行 HTML。
登录后可点赞、收藏与反馈。