5.7 KiB
5.7 KiB
热点数据模块
多平台热点数据采集和管理
一、模块结构
domain/hotspot/
├── __init__.py # 模块入口
├── models.py # 数据模型 (HotTopic, HotTopicSource)
├── manager.py # 热点管理器 (缓存、聚合)
└── crawlers/ # 爬虫模块
├── base.py # 爬虫基类
├── weibo.py # 微博热搜 (需要优化)
├── baidu.py # 百度热搜 ✅ (含旅游榜)
├── bing.py # Bing 搜索建议 ✅
├── calendar.py # 节日日历 ✅
├── xiaohongshu.py # 小红书热门 ✅
└── mediacrawler/ # MediaCrawler 集成
├── __init__.py
└── xhs_crawler.py # 小红书实时爬虫
libs/MediaCrawler/ # MediaCrawler 项目 (子模块)
api/routers/hotspot.py # API 路由
二、API 接口
2.1 获取所有热点
GET /api/v2/hotspot/all?force=false
2.2 按平台获取
# 微博热搜 (待优化)
GET /api/v2/hotspot/weibo?limit=50
# 百度热搜
GET /api/v2/hotspot/baidu?limit=50
# 小红书热门 (文旅相关)
GET /api/v2/hotspot/xiaohongshu?limit=20
# 节日日历
GET /api/v2/hotspot/calendar?days=30
2.3 聚合查询
# 旅游相关热点 (所有来源)
GET /api/v2/hotspot/travel?limit=10
# 热门话题 (去重合并)
GET /api/v2/hotspot/trending?limit=20
2.4 自定义热点
# 获取
GET /api/v2/hotspot/custom
# 添加
POST /api/v2/hotspot/custom
{
"title": "冬季温泉推荐",
"tags": ["温泉", "冬季", "度假"],
"category": "travel"
}
# 删除
DELETE /api/v2/hotspot/custom/{title}
三、数据模型
HotTopic
@dataclass
class HotTopic:
title: str # 话题标题
source: HotTopicSource # 来源 (weibo/baidu/xhs/calendar/custom)
rank: Optional[int] # 排名
heat: Optional[int] # 热度值
category: HotTopicCategory # 分类 (travel/food/festival/trending)
url: Optional[str] # 原始链接
description: Optional[str] # 描述
tags: List[str] # 标签
fetched_at: datetime # 获取时间
expires_at: Optional[datetime] # 过期时间
HotTopicCategory
travel- 旅游相关food- 美食festival- 节日节气event- 热门事件trending- 热门话题season- 季节性other- 其他
四、缓存策略
| 来源 | 缓存时间 | 说明 |
|---|---|---|
| 微博 | 5分钟 | 实时性高 |
| 百度 | 10分钟 | 实时性高 |
| 小红书 | 30分钟 | 预设话题 |
| 日历 | 1小时 | 静态数据 |
| 自定义 | 24小时 | 手动管理 |
五、百度多榜单
百度爬虫支持多个榜单:
# 默认获取: 实时热点 + 旅游榜
crawler = BaiduCrawler() # tabs=['realtime', 'travel']
# 自定义榜单
crawler = BaiduCrawler(tabs=['realtime', 'travel', 'movie'])
支持的榜单:
realtime- 实时热点 (50条)travel- 旅游榜 (30条) ⭐movie- 电影榜teleplay- 电视剧榜novel- 小说榜car- 汽车榜game- 游戏榜
六、小红书模块说明
基于 MediaCrawler 项目获取实时数据,需要扫码登录。
6.1 使用爬虫
from domain.hotspot.crawlers import XiaohongshuCrawler
crawler = XiaohongshuCrawler()
# 扫码登录 (首次需要,Cookie 会缓存)
await crawler.login()
# 获取热门话题
topics = await crawler.fetch()
# 搜索笔记
notes = await crawler.search_notes("旅游攻略", page_size=20)
# 获取笔记详情
detail = await crawler.get_note_detail("note_id")
6.2 直接使用桥接器
from domain.hotspot.crawlers.mediacrawler import get_xhs_bridge
bridge = get_xhs_bridge()
# 登录
await bridge.login()
# 搜索笔记
notes = await bridge.search_notes("旅游攻略", page_size=20)
# 获取笔记详情
detail = await bridge.get_note_detail("note_id")
6.3 MediaCrawler 项目
位置: libs/MediaCrawler/
来源: https://github.com/NanmiCoder/MediaCrawler
支持平台: 小红书、抖音、微博、B站、快手、知乎、贴吧
6.4 搜索关键词
默认搜索以下文旅相关关键词:
SEARCH_KEYWORDS = [
"旅游攻略", "周末去哪玩", "亲子游推荐", "自驾游路线",
"网红打卡地", "小众景点", "酒店推荐", "民宿推荐",
"冬季旅行", "滑雪攻略", "温泉度假",
]
可自定义关键词:
crawler = XiaohongshuCrawler(keywords=["三亚旅游", "哈尔滨冰雪"])
六、使用示例
Python 调用
from domain.hotspot import get_hotspot_manager
async def get_travel_hotspots():
manager = get_hotspot_manager()
# 获取旅游相关热点
topics = await manager.get_travel_topics(limit=10)
for topic in topics:
print(f"[{topic.source.value}] {topic.title}")
return topics
内容生成集成
# 在内容生成时使用热点
from domain.hotspot import get_hotspot_manager
async def generate_with_hotspots():
manager = get_hotspot_manager()
# 获取热点
topics = await manager.get_travel_topics(limit=5)
hot_topics = [t.title for t in topics]
# 传递给内容生成引擎
params = {
"subject": {...},
"hot_topics": {
"events": hot_topics[:2],
"festivals": ["元旦", "圣诞"],
"trending": hot_topics[2:],
}
}
七、待优化
- 微博爬虫: 需要 Cookie 或使用 Playwright
- 抖音热搜: 待添加
- MediaCrawler 集成: 获取小红书实时数据
- 定时更新: 后台定时刷新缓存
- 持久化: 热点数据存储到数据库