在这里插入图片描述

前言

在内容聚合、资讯推荐、热点追踪、运营后台、数据看板和门户首页中,热榜数据是一类非常实用的内容入口。

用户打开页面时,通常会关注“现在大家都在看什么”“当前最热的话题是什么”“哪些影视、小说或资讯正在上升”。如果系统本身没有热点内容来源,页面会显得比较静态,内容更新也需要人工维护。

百度热搜榜 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
        ↓
整理字段结构
        ↓
写入缓存
        ↓
返回前端展示

这样做的好处是:

  1. 前端不需要关心第三方字段。
  2. 后端可以统一处理缓存。
  3. 后端可以控制接口超时。
  4. 后端可以做参数白名单。
  5. 后续可以扩展多个热榜来源。
  6. 接口密钥不会暴露在前端。

五、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 热点标签

前端只需要按照这个结构渲染列表,不需要关心原始字段是 deschot_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('&', '&amp;')
    .replaceAll('<', '&lt;')
    .replaceAll('>', '&gt;')
    .replaceAll('"', '&quot;')
    .replaceAll("'", '&#039;');
}

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,建议只在服务端保存,前端不要直接暴露密钥。

安全建议如下:

  1. API Key 放在后端环境变量中。
  2. 不要把密钥写进前端代码。
  3. 不要提交到 Git 仓库。
  4. 不要在日志中打印完整密钥。
  5. 对前端接口增加 IP 或用户级限流。
  6. 对异常 tab 参数做白名单校验。
  7. 首页高并发场景必须配合缓存。
  8. 定时任务失败时要记录日志,避免静默失败。

错误写法:

// 不推荐:不要在前端暴露密钥
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

更多推荐