Node.js 调用百度热搜榜接口实战:实时热搜、影视榜单与热点推荐

前言
在内容聚合、资讯推荐、热点追踪、运营后台、数据看板和门户首页中,热榜数据是一类非常实用的内容入口。
用户打开页面时,通常会关注“现在大家都在看什么”“当前最热的话题是什么”“哪些影视、小说或资讯正在上升”。如果系统本身没有热点内容来源,页面会显得比较静态,内容更新也需要人工维护。
百度热搜榜 API 可以为业务系统提供实时热榜数据,适合用于首页热点模块、榜单页、资讯流推荐、运营选题、热点追踪和内容分析。本文以百度热搜榜接口为例,整理一套完整的接入方案,包括接口说明、请求方式、后端封装、字段处理、前端展示、缓存策略、异常处理和项目落地建议。
接口文档页面:
https://apizero.cn/marketplace/hot-baidu
接口地址:
https://v1.apizero.cn/api/hot-baidu
一、百度热搜榜 API 适合哪些场景
百度热搜榜接口适合接入到需要“动态热点内容”的系统中。
常见使用场景如下:
| 使用场景 | 典型需求 |
|---|---|
| 内容聚合网站 | 首页展示实时热点,提高页面活跃度 |
| 资讯推荐系统 | 根据热榜内容补充推荐入口 |
| 运营后台 | 快速查看当前热门话题,辅助选题 |
| 小程序工具 | 展示实时热搜、影视热榜、小说热榜 |
| 数据看板 | 统计热点变化趋势和榜单更新情况 |
| 社群机器人 | 定时推送当前热搜榜单 |
| 自媒体工具 | 获取热点标题,用于内容选题参考 |
| 搜索工具页 | 提供实时榜单查询能力 |
热榜接口的核心价值在于:让系统获得一份持续变化的内容源,减少人工维护热点内容的成本。
二、接口能力说明
百度热搜榜 API 可以获取热搜榜单数据,适合用于榜单列表、热点卡片、推荐模块和内容运营后台。
从实际接入角度看,热榜接口通常需要关注这些能力:
| 能力 | 说明 |
|---|---|
| 实时热搜 | 获取当前百度热搜榜数据 |
| 榜单切换 | 通过参数切换不同榜单类型 |
| 排名字段 | 展示热点当前排名 |
| 标题字段 | 展示热搜标题 |
| 热度字段 | 展示热度指数或热度值 |
| 摘要字段 | 补充热点简介 |
| 链接字段 | 跳转到详情页或搜索结果 |
| 图片字段 | 用于热点卡片展示 |
| 标签字段 | 标识热、新、爆等状态 |
对于前端页面来说,最常用的是排名、标题、热度、摘要、链接和图片。后端接入时,建议把这些字段整理成稳定结构,避免前端直接依赖第三方原始字段。
三、接口请求方式
接口地址:
https://v1.apizero.cn/api/hot-baidu
1. curl 请求示例
curl -X GET "https://v1.apizero.cn/api/hot-baidu?tab=realtime"
如果项目中需要鉴权,可以在请求头中加入 API Key:
curl -X GET "https://v1.apizero.cn/api/hot-baidu?tab=realtime" \
-H "Authorization: Bearer your_api_key"
2. 参数说明
常见参数如下:
| 参数 | 是否必填 | 示例 | 说明 |
|---|---|---|---|
| tab | 否 | realtime | 榜单类型,不传时可默认实时热搜 |
常见榜单类型可以按业务需要设计为:
| tab 值 | 说明 |
|---|---|
| realtime | 实时热搜 |
| novel | 小说榜单 |
| movie | 电影榜单 |
| tv | 电视剧榜单 |
在正式项目中,建议后端对白名单参数做校验,避免前端传入异常值。
四、推荐调用流程
百度热搜榜数据通常用于页面展示,建议采用后端转发和封装的方式,不建议前端直接请求第三方接口。
推荐流程如下:
前端选择榜单类型
↓
请求业务后端接口
↓
后端校验 tab 参数
↓
调用百度热搜榜 API
↓
整理字段结构
↓
写入缓存
↓
返回前端展示
这样做的好处是:
- 前端不需要关心第三方字段。
- 后端可以统一处理缓存。
- 后端可以控制接口超时。
- 后端可以做参数白名单。
- 后续可以扩展多个热榜来源。
- 接口密钥不会暴露在前端。
五、Node.js 后端调用示例
下面使用 Node.js 演示如何调用百度热搜榜 API。
1. 安装依赖
npm install axios
2. 基础调用代码
const axios = require('axios');
async function fetchBaiduHot(tab = 'realtime') {
const response = await axios.get('https://v1.apizero.cn/api/hot-baidu', {
params: {
tab
},
timeout: 5000
});
return response.data;
}
fetchBaiduHot('realtime')
.then(data => {
console.log('百度热搜榜数据:', data);
})
.catch(error => {
console.error('百度热搜榜接口请求失败:', error.message);
});
这段代码适合快速验证接口调用。正式项目中建议继续封装服务层,避免业务代码直接散落请求逻辑。
六、封装 BaiduHotService 服务
为了让代码更稳定,建议封装一个单独的服务类,负责参数校验、接口请求、字段整理和异常处理。
const axios = require('axios');
class BaiduHotService {
constructor() {
this.baseURL = 'https://v1.apizero.cn/api/hot-baidu';
this.apiKey = process.env.APIZERO_API_KEY || '';
this.allowedTabs = ['realtime', 'novel', 'movie', 'tv'];
}
async getHotList(tab = 'realtime') {
const safeTab = this.getSafeTab(tab);
try {
const response = await axios.get(this.baseURL, {
params: {
tab: safeTab
},
headers: this.buildHeaders(),
timeout: 5000
});
return this.normalize(response.data, safeTab);
} catch (error) {
throw this.handleError(error);
}
}
getSafeTab(tab) {
if (this.allowedTabs.includes(tab)) {
return tab;
}
return 'realtime';
}
buildHeaders() {
const headers = {};
if (this.apiKey) {
headers.Authorization = `Bearer ${this.apiKey}`;
}
return headers;
}
normalize(result, tab) {
if (!result || result.code !== 0) {
throw new Error(result?.msg || '百度热搜榜接口返回异常');
}
const list = result.data?.list || result.data || [];
if (!Array.isArray(list)) {
throw new Error('百度热搜榜列表格式异常');
}
return {
tab,
list: list.map(item => ({
rank: item.rank || 0,
title: item.title || '',
summary: item.desc || item.summary || '',
hot: item.hot_index || item.hot || 0,
link: item.link || item.url || '',
image: item.image || item.cover || '',
tag: item.tag || ''
}))
};
}
handleError(error) {
if (error.code === 'ECONNABORTED') {
return new Error('百度热搜榜接口请求超时');
}
if (error.response) {
return new Error(`百度热搜榜接口异常:${error.response.status}`);
}
return new Error('百度热搜榜接口请求失败');
}
}
module.exports = BaiduHotService;
这层封装的重点不是写复杂逻辑,而是保证业务层拿到稳定的数据结构。
七、Express 路由接口示例
后端可以对前端提供一个自己的业务接口:
/api/hot/baidu?tab=realtime
示例代码:
const express = require('express');
const BaiduHotService = require('./BaiduHotService');
const router = express.Router();
const baiduHotService = new BaiduHotService();
router.get('/api/hot/baidu', async (req, res) => {
const { tab = 'realtime' } = req.query;
try {
const data = await baiduHotService.getHotList(tab);
res.json({
success: true,
data
});
} catch (error) {
res.status(500).json({
success: false,
message: formatHotError(error)
});
}
});
function formatHotError(error) {
const message = error.message || '';
if (message.includes('超时')) {
return '热榜加载超时,请稍后再试';
}
return '热榜加载失败,请稍后再试';
}
module.exports = router;
前端只请求自己的业务后端,不需要直接依赖第三方接口。
八、推荐返回结构设计
为了降低前端维护成本,建议后端统一返回下面这种结构:
{
"success": true,
"data": {
"tab": "realtime",
"list": [
{
"rank": 1,
"title": "热点标题",
"summary": "热点摘要内容",
"hot": 1234567,
"link": "https://example.com/detail",
"image": "https://example.com/image.jpg",
"tag": "热"
}
]
}
}
字段说明如下:
| 字段 | 说明 |
|---|---|
| rank | 榜单排名 |
| title | 热点标题 |
| summary | 热点摘要 |
| hot | 热度值 |
| link | 详情链接 |
| image | 配图 |
| tag | 热点标签 |
前端只需要按照这个结构渲染列表,不需要关心原始字段是 desc、hot_index 还是其他命名。
九、前端展示示例
1. HTML 结构
<div class="hot-board">
<div class="hot-header">
<h2>百度热搜榜</h2>
<select id="tabSelect" onchange="loadHotList()">
<option value="realtime">实时热搜</option>
<option value="novel">小说榜</option>
<option value="movie">电影榜</option>
<option value="tv">电视剧榜</option>
</select>
</div>
<ul id="hotList" class="hot-list"></ul>
</div>
2. CSS 样式
.hot-board {
width: 680px;
padding: 20px;
border-radius: 14px;
background: #ffffff;
box-shadow: 0 8px 28px rgba(0, 0, 0, 0.08);
font-family: Arial, sans-serif;
}
.hot-header {
display: flex;
align-items: center;
justify-content: space-between;
}
.hot-header h2 {
margin: 0;
font-size: 22px;
color: #222;
}
.hot-list {
margin: 16px 0 0;
padding: 0;
list-style: none;
}
.hot-item {
display: flex;
gap: 12px;
padding: 14px 0;
border-bottom: 1px solid #f1f1f1;
}
.hot-rank {
width: 32px;
font-size: 20px;
font-weight: 700;
color: #f5222d;
}
.hot-content {
flex: 1;
}
.hot-title {
font-size: 16px;
font-weight: 600;
color: #333;
}
.hot-summary {
margin-top: 6px;
font-size: 13px;
color: #777;
line-height: 1.6;
}
.hot-meta {
margin-top: 8px;
font-size: 12px;
color: #999;
}
3. JavaScript 请求与渲染
async function loadHotList() {
const tab = document.getElementById('tabSelect').value;
const listEl = document.getElementById('hotList');
listEl.innerHTML = '<li>正在加载热榜...</li>';
try {
const response = await fetch(`/api/hot/baidu?tab=${encodeURIComponent(tab)}`);
const result = await response.json();
if (!result.success) {
throw new Error(result.message || '热榜加载失败');
}
renderHotList(result.data.list);
} catch (error) {
listEl.innerHTML = `<li>${error.message || '热榜加载失败,请稍后再试'}</li>`;
}
}
function renderHotList(list) {
const listEl = document.getElementById('hotList');
if (!list || list.length === 0) {
listEl.innerHTML = '<li>暂无热榜数据</li>';
return;
}
listEl.innerHTML = list.map(item => `
<li class="hot-item">
<div class="hot-rank">${item.rank}</div>
<div class="hot-content">
<div class="hot-title">${escapeHtml(item.title)}</div>
<div class="hot-summary">${escapeHtml(item.summary || '')}</div>
<div class="hot-meta">
热度:${item.hot || 0} ${item.tag ? `|${escapeHtml(item.tag)}` : ''}
</div>
</div>
</li>
`).join('');
}
function escapeHtml(str) {
return String(str)
.replaceAll('&', '&')
.replaceAll('<', '<')
.replaceAll('>', '>')
.replaceAll('"', '"')
.replaceAll("'", ''');
}
loadHotList();
这里注意对标题和摘要做转义,避免把外部内容直接作为 HTML 渲染。
十、Vue 组件示例
如果项目使用 Vue,可以封装为热榜组件。
<template>
<div class="baidu-hot">
<div class="header">
<h2>百度热搜榜</h2>
<select v-model="tab" @change="loadHotList">
<option value="realtime">实时热搜</option>
<option value="novel">小说榜</option>
<option value="movie">电影榜</option>
<option value="tv">电视剧榜</option>
</select>
</div>
<div v-if="loading">正在加载热榜...</div>
<div v-else-if="error">{{ error }}</div>
<ul v-else>
<li v-for="item in list" :key="item.rank + item.title">
<span class="rank">{{ item.rank }}</span>
<div class="content">
<h3>{{ item.title }}</h3>
<p>{{ item.summary }}</p>
<small>热度:{{ item.hot }}</small>
</div>
</li>
</ul>
</div>
</template>
<script setup>
import { ref, onMounted } from 'vue';
const tab = ref('realtime');
const list = ref([]);
const loading = ref(false);
const error = ref('');
async function loadHotList() {
loading.value = true;
error.value = '';
try {
const response = await fetch(`/api/hot/baidu?tab=${encodeURIComponent(tab.value)}`);
const result = await response.json();
if (!result.success) {
throw new Error(result.message || '热榜加载失败');
}
list.value = result.data.list || [];
} catch (err) {
error.value = err.message || '热榜加载失败,请稍后再试';
} finally {
loading.value = false;
}
}
onMounted(() => {
loadHotList();
});
</script>
这个组件适合放在资讯首页、内容聚合页、运营后台或热点分析页面。
十一、缓存策略设计
热榜数据具有时效性,但不建议每次页面访问都直接请求接口。合理缓存可以减少接口调用次数,也能提升页面响应速度。
推荐缓存策略:
| 榜单类型 | 建议缓存时间 | 说明 |
|---|---|---|
| realtime | 1-3 分钟 | 实时热搜变化较快 |
| novel | 5-10 分钟 | 小说榜变化相对较慢 |
| movie | 5-10 分钟 | 影视榜不需要秒级刷新 |
| tv | 5-10 分钟 | 电视剧榜可以适当缓存 |
Redis 缓存示例:
async function getBaiduHotWithCache(tab = 'realtime') {
const safeTab = ['realtime', 'novel', 'movie', 'tv'].includes(tab)
? tab
: 'realtime';
const cacheKey = `hot:baidu:${safeTab}`;
const cached = await redis.get(cacheKey);
if (cached) {
return JSON.parse(cached);
}
const data = await baiduHotService.getHotList(safeTab);
const ttl = safeTab === 'realtime' ? 120 : 600;
await redis.set(cacheKey, JSON.stringify(data), 'EX', ttl);
return data;
}
如果页面访问量较高,可以使用定时任务提前刷新缓存,让用户请求始终优先命中 Redis。
十二、定时任务刷新热榜
对于首页热榜、运营看板和社群机器人,不一定要等用户访问时再请求接口。可以用定时任务定期刷新热榜数据。
示例流程:
定时任务启动
↓
遍历榜单类型
↓
请求百度热搜榜接口
↓
写入 Redis
↓
必要时写入数据库
↓
前端读取缓存数据
示例代码:
async function refreshBaiduHotCache() {
const tabs = ['realtime', 'novel', 'movie', 'tv'];
for (const tab of tabs) {
try {
const data = await baiduHotService.getHotList(tab);
const cacheKey = `hot:baidu:${tab}`;
const ttl = tab === 'realtime' ? 180 : 600;
await redis.set(cacheKey, JSON.stringify(data), 'EX', ttl);
console.log(`百度热榜缓存刷新成功:${tab}`);
} catch (error) {
console.error(`百度热榜缓存刷新失败:${tab}`, error.message);
}
}
}
可以配合 cron 每 2-5 分钟执行一次,保证首页热榜加载稳定。
十三、数据库表设计参考
如果只是页面展示,可以不入库。如果需要做热点历史、趋势分析、内容选题记录或热度变化统计,可以保存榜单数据。
1. 热榜快照表
CREATE TABLE baidu_hot_snapshot (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
tab VARCHAR(32) NOT NULL,
rank_no INT NOT NULL,
title VARCHAR(255) NOT NULL,
summary VARCHAR(1024),
hot_value BIGINT DEFAULT 0,
link VARCHAR(512),
image VARCHAR(512),
tag VARCHAR(32),
snapshot_time DATETIME NOT NULL,
created_at DATETIME NOT NULL,
INDEX idx_tab (tab),
INDEX idx_title (title),
INDEX idx_snapshot_time (snapshot_time)
);
2. 热点追踪表
CREATE TABLE baidu_hot_topic (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
title VARCHAR(255) NOT NULL,
first_seen_at DATETIME NOT NULL,
last_seen_at DATETIME NOT NULL,
max_rank INT,
max_hot_value BIGINT DEFAULT 0,
appear_count INT DEFAULT 1,
created_at DATETIME NOT NULL,
updated_at DATETIME NOT NULL,
UNIQUE KEY uk_title (title),
INDEX idx_last_seen_at (last_seen_at),
INDEX idx_max_hot_value (max_hot_value)
);
第一张表适合保存每次榜单快照,第二张表适合分析某个热点出现了多久、最高排名是多少、热度峰值是多少。
十四、热点数据去重与合并
热搜标题可能会在多次刷新中重复出现。如果要做热点追踪,建议按标题进行合并。
示例逻辑:
async function upsertHotTopic(item) {
const existing = await topicRepository.findByTitle(item.title);
if (!existing) {
await topicRepository.create({
title: item.title,
firstSeenAt: new Date(),
lastSeenAt: new Date(),
maxRank: item.rank,
maxHotValue: item.hot,
appearCount: 1
});
return;
}
await topicRepository.update(existing.id, {
lastSeenAt: new Date(),
maxRank: Math.min(existing.maxRank || item.rank, item.rank),
maxHotValue: Math.max(existing.maxHotValue || 0, item.hot || 0),
appearCount: existing.appearCount + 1
});
}
这样可以把榜单数据从“展示列表”进一步变成“热点趋势数据”。
十五、接口异常处理
热榜接口在实际项目中可能出现这些异常:
- 接口请求超时
- tab 参数错误
- 接口返回空列表
- 返回字段缺失
- API Key 无效
- 请求频率过高
- 网络异常
- 第三方服务暂时不可用
建议统一返回友好提示,不要把原始错误直接展示给用户。
function formatBaiduHotError(error) {
const message = error.message || '';
if (message.includes('超时')) {
return '热榜加载超时,请稍后再试';
}
if (message.includes('频率')) {
return '请求过于频繁,请稍后再试';
}
return '热榜加载失败,请稍后再试';
}
前端展示时也要做好空数据兜底:
function renderEmptyHotList() {
return '<div class="empty">暂无热榜数据,请稍后刷新</div>';
}
对于首页模块来说,即使热榜接口暂时失败,也不应该影响整个页面加载。
十六、接口安全建议
如果项目中需要使用 API Key,建议只在服务端保存,前端不要直接暴露密钥。
安全建议如下:
- API Key 放在后端环境变量中。
- 不要把密钥写进前端代码。
- 不要提交到 Git 仓库。
- 不要在日志中打印完整密钥。
- 对前端接口增加 IP 或用户级限流。
- 对异常 tab 参数做白名单校验。
- 首页高并发场景必须配合缓存。
- 定时任务失败时要记录日志,避免静默失败。
错误写法:
// 不推荐:不要在前端暴露密钥
const apiKey = 'your_api_key';
推荐写法:
APIZERO_API_KEY=your_api_key
Node.js 中读取环境变量:
const apiKey = process.env.APIZERO_API_KEY;
十七、实际项目落地建议
1. 首页热点模块
首页只需要展示前 10 条或前 20 条热搜,不建议一次性展示过多内容。
推荐字段:
排名
标题
热度
标签
如果页面空间有限,可以隐藏摘要和图片。
2. 热点详情页
热点详情页可以展示更多信息:
热点标题
榜单排名
热度值
摘要
跳转链接
历史排名变化
相关内容推荐
如果系统有自己的内容库,可以根据热点标题匹配站内文章或专题页。
3. 运营选题后台
运营后台可以把热榜接口用于选题辅助:
当前热搜
热度值
出现次数
首次出现时间
最后出现时间
最高排名
这样运营人员可以快速判断哪些话题值得跟进。
4. 社群机器人
社群机器人可以定时推送热榜:
今日百度热搜 Top 10
1. 热点标题 A
2. 热点标题 B
3. 热点标题 C
为了避免打扰用户,可以限制每天推送 1-2 次。
十八、常见问题
1. 百度热搜榜 API 返回什么内容?
接口返回百度热搜榜相关数据,常见字段包括排名、标题、摘要、热度、链接、图片和标签等,适合用于热榜列表和热点卡片展示。
2. tab 参数有什么作用?
tab 用于切换榜单类型,例如实时热搜、小说榜、电影榜、电视剧榜等。后端建议对 tab 做白名单校验。
3. 前端可以直接调用接口吗?
不建议。正式项目中应通过后端封装,方便处理缓存、限流、异常、日志和密钥安全。
4. 热榜数据需要缓存多久?
实时热搜建议缓存 1-3 分钟;小说、电影、电视剧等榜单可以缓存 5-10 分钟。具体时间可根据页面实时性要求调整。
5. 热榜数据需要入库吗?
普通页面展示可以不入库。如果要做热点历史、趋势分析、选题追踪或内容推荐,建议保存榜单快照和热点追踪数据。
6. 接口失败时页面应该怎么处理?
接口失败时应展示友好提示或缓存数据,不应该影响整个页面加载。首页模块可以显示“暂无热榜数据,请稍后刷新”。
十九、总结
百度热搜榜 API 适合用于内容聚合、资讯推荐、热点追踪、运营后台、小程序工具和数据看板。通过接口获取热榜数据后,系统可以快速实现实时热点列表、榜单切换、热度展示、运营选题和热点趋势分析。
推荐的整体接入方式如下:
前端选择榜单类型
↓
请求业务后端接口
↓
后端校验 tab 参数
↓
调用百度热搜榜 API
↓
统一格式化榜单字段
↓
Redis 缓存热榜数据
↓
前端展示热点列表
↓
必要时写入数据库做趋势分析
这种设计能保证接口稳定性,也方便后续扩展缓存、定时刷新、热点追踪、数据看板和内容推荐能力。
参考链接:
https://apizero.cn/marketplace/hot-baidu
https://v1.apizero.cn/api/hot-baidu
更多推荐
所有评论(0)