Skip to content

[建议]添加RSS为数据源 #437

@wangduo404-eng

Description

@wangduo404-eng

🏷️ 建议类别

数据源相关(新增平台、改进抓取等)

💭 详细描述你的想法

🎯 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_datacrawl_websitesfetch_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: true

4️⃣ 主程序改造

修改 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

💡 设计亮点

  1. 最小侵入原则

    • 只修改必要的3个位置
    • 保留所有原有功能(过滤、排序、推送)
    • 新增代码完全独立(rss_fetcher.py)
  2. 配置驱动

    • 数据源开关在配置文件控制
    • 添加 RSS 源无需修改代码
    • 支持热切换(重启容器即可)
  3. 数据格式统一

    • RSS 和 NewNow 数据转换为同一结构
    • 下游处理逻辑无需修改
    • 完美融合到现有流程
  4. 容错设计

    • 单个源失败不影响整体
    • 详细日志便于排查
    • 优雅降级(无数据时提示)

📊 最终成果

✅ RSS 源: ✅ 启用
✅ 我的医药RSS: 获取到 100 条新闻
📈 数据统计:
  平台数量: 1
  新闻总数: 100
  失败数量: 0

一劳永逸:构建了专属的 Docker 镜像,随时可部署,随时可扩展新的 RSS 源。


🎓 核心经验

  • 理解先于修改:先摸清原有数据流,再动手
  • 模块化设计:新功能独立模块(rss_fetcher.py)
  • 统一接口:新旧数据源输出格式一致
  • 配置外置:业务逻辑与配置分离
  • Docker 化:一次构建,处处运行

改造完成时间:约2小时
修改代码量:~300行新增 + 3处关键修改
技术栈:Python + Docker + RSS/feedparser

📷 功能示意图(推荐)

No response

📎 其他补充说明

Image

Metadata

Metadata

Assignees

Labels

enhancementNew feature or request

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions