如何在Golang中开发简易RSS聚合器_整合多个订阅源内容

23次阅读

go 写简易 RSS 聚合器核心是解析 RSS/atom、去重、合并与展示;推荐 github.com/mmcdole/gofeed 解析,统一 Entry 结构并用 SHA-256(Link) 去重,限并发拉取、超时控制、倒序取 Top N,输出文本或 jsON。

如何在Golang中开发简易RSS聚合器_整合多个订阅源内容

用 Go 写一个简易 RSS 聚合器并不需要复杂框架,核心是解析 RSS/Atom xml、去重、合并与简单展示。关键在于选对库、设计轻量数据结构、避免阻塞获取,并合理处理常见异常(如无效 URL、超时、格式错误)。

选用可靠的 RSS 解析库

Go 生态中 github.com/mmcdole/gofeed 是最成熟的选择,支持 RSS 0.91/2.0、Atom 0.3/1.0,自动识别格式,API 简洁:

  • 直接调用 fp.ParseURL("https://example.com/feed.xml") 获取 *gofeed.Feed
  • 每条条目是 *gofeed.Item,含 TitleLinkPublishedContent 等字段
  • 内置 HTTP 客户端可自定义超时和 User-Agent,避免被部分站点拒绝

统一数据模型与去重逻辑

RSS 源格式不一,需抽象为统一结构,重点靠唯一标识去重:

  • 定义结构体type Entry Struct { ID String; Title string; Link string; Published time.Time; Source string }
  • ID 推荐用 Link 的 SHA-256(防重复抓取同一链接),Fallback 可用 Item.GUIDLink + Title 拼接哈希
  • map[string]struct{} 记录已见 ID,每次解析前检查,避免内存中重复条目

并发拉取多个源并控制节奏

别用 goroutine 盲目并发,需加限流和错误容忍:

立即学习go语言免费学习笔记(深入)”;

  • semaphore(如 golang.org/x/sync/semaphore)限制并发数(建议 3–5)
  • 每个源设置独立上下文超时(例如 10 秒),失败时记录日志但不中断整体流程
  • 聚合结果按 Published 倒序排列,取 Top N(如最近 50 条)即可,无需全量存储

输出为简洁文本或 json,便于后续扩展

初期无需 Web 界面,命令行输出或写入 JSON 文件足够验证逻辑:

  • 打印时用 fmt.printf("%s | %s | %sn", e.Published.format("2006-01-02"), e.Title, e.Link)
  • 导出 JSON:用 json.MarshalIndent(entries, "", " ") 写入文件,方便前端或 CLI 工具消费
  • 后续加定时任务(time.Ticker)或 cron 触发,就变成真正的聚合服务

不复杂但容易忽略细节:时间解析要设本地时区 fallback、HTTP 头必须带 User-Agent、XML 字符编码要处理(gofeed 默认支持 UTF-8/ISO-8859-1)。跑通一个源再扩到五个,比一开始就功能更稳。

text=ZqhQzanResources