-
Notifications
You must be signed in to change notification settings - Fork 20.3k
Open
Labels
enhancementNew feature or requestNew feature or request
Description
🏷️ 建议类别
数据源相关(新增平台、改进抓取等)
💭 详细描述你的想法
🎯 TrendRadar RSS 改造思路总结
📌 核心目标
将 TrendRadar 从依赖大众平台(抖音、知乎、B站)改造为支持自定义 RSS 源的专业资讯聚合工具,实现医药行业垂直信息监控。
🎯 什么时候会用到这个功能
发现默认数据源对于定制化需求实在太有限,很多专业的资讯在大众平台是没有的。突发奇想,为什么不能添加RSS源?说干就干,作为一个只会基本Python的非程序员,这个想法基本是天方夜谭,但好在现在是AI时代,把需求交给Claude就可以了。一步步来,3个小时不到就搞定跑通。最后让claude 写了一个思路总结,希望能帮到有同样需求的小伙伴。
🛠️ 实现想法(可选)
🏗️ 改造架构
原始架构
NewNow API(固定35+大众平台)
↓
解析 JSON
↓
过滤 → 推送
改造后架构
┌─────────────┬─────────────┐
│ NewNow API │ RSS 源列表 │ ← 双数据源,可独立开关
└──────┬──────┴──────┬──────┘
│ │
└──────┬──────┘
↓
统一数据格式
↓
过滤 → 排序 → 推送
🔧 技术实施路径
1️⃣ 准备阶段
- 从运行中的容器提取
main.py(5083行) - 创建独立构建目录
custom_build/ - 理解数据流:
_crawl_data→crawl_websites→fetch_data
2️⃣ 核心模块开发
创建 rss_fetcher.py (224行):
RSSFetcher 类
├─ fetch_rss() # 获取单个 RSS 源
├─ fetch_multiple_rss() # 批量获取多个源
└─ _parse_feed_to_standard() # 转换为 TrendRadar 格式关键:将 RSS 条目转换为与 NewNow 一致的数据结构:
{
'title': str,
'url': str,
'platform': str,
'platform_id': str,
'rank': int,
...
}3️⃣ 配置系统扩展
在 config.yaml 添加 data_sources 配置:
data_sources:
newsnow:
enabled: false # 开关控制
rss:
enabled: true
timeout: 15
sources: # 源列表
- id: "..."
name: "..."
url: "..."
enabled: true4️⃣ 主程序改造
修改 3个关键位置:
① 添加导入 (第18行)
from rss_fetcher import RSSFetcher② DataFetcher 类添加方法 (第604行)
def fetch_rss_data(self, rss_sources):
# 调用 RSSFetcher
# 返回与 crawl_websites 相同格式
return results, id_to_name, failed_ids③ 核心数据获取逻辑重构 (第4974行 _crawl_data)
# 读取配置
newsnow_enabled = CONFIG["data_sources"]["newsnow"]["enabled"]
rss_enabled = CONFIG["data_sources"]["rss"]["enabled"]
# 条件执行
if newsnow_enabled:
# 原有逻辑
results1 = self.data_fetcher.crawl_websites(...)
if rss_enabled:
# 新增逻辑
results2 = self.data_fetcher.fetch_rss_data(...)
# 合并结果
all_results.update(results1)
all_results.update(results2)④ 修复配置加载 (第153行)
# load_config() 函数添加
"data_sources": config_data.get("data_sources", {...})5️⃣ Docker 镜像构建
创建 Dockerfile:
FROM wantcat/trendradar:latest
COPY main.py rss_fetcher.py /app/
RUN pip install feedparser --break-system-packages构建命令:
docker build -t trendradar-rss:v1.1 .6️⃣ 容器部署
docker run -d \
--name trend-radar-rss \
-v ./config:/app/config:ro \
-v ./output:/app/output \
-e HTTP_PROXY=****** \ # 代理配置
trendradar-rss:v1.1💡 设计亮点
-
最小侵入原则
- 只修改必要的3个位置
- 保留所有原有功能(过滤、排序、推送)
- 新增代码完全独立(rss_fetcher.py)
-
配置驱动
- 数据源开关在配置文件控制
- 添加 RSS 源无需修改代码
- 支持热切换(重启容器即可)
-
数据格式统一
- RSS 和 NewNow 数据转换为同一结构
- 下游处理逻辑无需修改
- 完美融合到现有流程
-
容错设计
- 单个源失败不影响整体
- 详细日志便于排查
- 优雅降级(无数据时提示)
📊 最终成果
✅ RSS 源: ✅ 启用
✅ 我的医药RSS: 获取到 100 条新闻
📈 数据统计:
平台数量: 1
新闻总数: 100
失败数量: 0
一劳永逸:构建了专属的 Docker 镜像,随时可部署,随时可扩展新的 RSS 源。
🎓 核心经验
- 理解先于修改:先摸清原有数据流,再动手
- 模块化设计:新功能独立模块(rss_fetcher.py)
- 统一接口:新旧数据源输出格式一致
- 配置外置:业务逻辑与配置分离
- Docker 化:一次构建,处处运行
改造完成时间:约2小时
修改代码量:~300行新增 + 3处关键修改
技术栈:Python + Docker + RSS/feedparser
📷 功能示意图(推荐)
No response
📎 其他补充说明

sumachuyuan and pan0513
Metadata
Metadata
Assignees
Labels
enhancementNew feature or requestNew feature or request