# 资讯聚合平台方案:多分类热搜聚合与去重
> 接口:网络搜索热词排行(apiCode=313) · 免费服务 · 返回格式 JSON · 适用人群:资讯平台工程师、后端开发 · 阅读时间:约 8 分钟
## 核心要点
- 多分类聚合 = 并发拉取多个 `tab` 的 `list` → 跨分类按 `name` 去重 → 统一按 `num`/`level` 排序展示。
- 313-1 先取全部主分类,313-2 逐个拉取,避免硬编码分类。
- 免费接口注意总频次,多 `tab` 并发要配缓存与限流(见[缓存策略篇](https://www.showapi.com/guides/hotword-cache-313))。
## Why:资讯平台为什么需要聚合
单看一个分类的热搜价值有限。资讯平台需要"全站热词总榜"——把游戏、小说、明星等多个分类的热搜合并去重,给用户一个统一的"今天在热什么"入口。这个接口天然支持多分类,正好做聚合底座。
## What:聚合所需能力
| 步骤 | 接入点 | 说明 |
|------|------|------|
| 取全部分类 | 313-1 | 拿到所有 `tab` |
| 拉各分类热搜 | 313-2 | 并发请求每个 `tab` |
| 去重排序 | 本地 | 按 `name` 去重,按 `num`/`level` 排序 |
## How:并发拉取 + 去重
```python
import requests, concurrent.futures
APP_KEY = "YOUR_APPKEY"
def fetch_tab(tab):
resp = requests.post(
"https://route.showapi.com/313-2",
params={"appKey": APP_KEY}, data={"tab": tab},
headers={"content-type": "application/x-www-form-urlencoded"}, timeout=10,
).json()
body = resp.get("showapi_res_body", {})
if str(body.get("ret_code")) != "0":
return []
return [{"tab": tab, **i} for i in body.get("list", [])]
def aggregate(tabs, workers=5):
results = []
with concurrent.futures.ThreadPoolExecutor(max_workers=workers) as ex:
for lst in ex.map(fetch_tab, tabs):
results.extend(lst)
# 跨分类按 name 去重,保留首次出现
seen, deduped = set(), []
for item in results:
key = item.get("name")
if key in seen:
continue
seen.add(key)
deduped.append(item)
# 统一按热度分降序
deduped.sort(key=lambda x: int(x.get("level") or 0), reverse=True)
return deduped
if __name__ == "__main__":
tabs = ["game", "novel", "star"] # 实际用 313-1 动态获取
for i in aggregate(tabs)[:20]:
print(i.get("name"), i.get("tab"), "热度", i.get("level"))
```
## 返回示例与解析
每条记录保留原 `tab` 来源,便于前端标注"来自哪个分类";去重后按 `level` 给总榜排序(注意 `level` 仅在同一分类内有横向可比性,跨分类排序仅作参考)。
## 进阶 / 边界
- **跨分类排序的局限**:`level` 是各分类内部热度分,跨分类直接比数值仅供参考,严谨做法可按分类内百分位归一化后再排。
- **频次控制**:并发拉多个 `tab` 仍受总频次约束,建议配合缓存(见[缓存策略篇](https://www.showapi.com/guides/hotword-cache-313)),分类树可长缓存。
- `tab` 合法性先用 313-1 核对(见[分类查询篇](https://www.showapi.com/guides/hotword-category-query-313))。
## FAQ
**Q1:不同分类出现同一个热搜词怎么办?**
A1:按 `name` 去重,保留首次出现(或合并来源分类列表),避免重复展示。
**Q2:并发数设多少合适?**
A2:免费接口建议保守(5 以内),并配合缓存与重试;文档未给 QPS,以平台实际为准。
**Q3:跨分类能严格比热度吗?**
A3:`level` 跨分类不可直接比较,建议仅作参考或做分类内归一化。
**Q4:能加地区筛选吗?**
A4:可以,对支持的 `tab` 传 `country`,见[地区与子分类筛选篇](https://www.showapi.com/guides/hotword-country-category-313)。
**Q5:返回偶发为空影响聚合吗?**
A5:单分类空结果跳过即可,聚合结果仍包含其余分类;建议记录失败分类便于排查。
## 相关能力 / 下一步阅读
- [网络搜索热词分类查询(313-1):如何先拿到可查的 tab 与子分类](https://www.showapi.com/guides/hotword-category-query-313)
- [地区与子分类筛选:country/category 参数正确使用姿势](https://www.showapi.com/guides/hotword-country-category-313)
- [搭建实时热搜看板:网络搜索热词排行 + 定时拉取的完整设计](https://www.showapi.com/guides/hotword-dashboard-313)
- **本系列共 12 篇**:查看[网络搜索热词排行开发指南总目录](https://www.showapi.com/guides/hotword-guides-313)