
这个工具解决什么问题
做内容、做研究或者单纯爱看资讯的人,往往关注了几十个博客、专栏、行业站点。真正麻烦的不是「看」,而是「知道有没有更新」——你得挨个打开浏览器、挨个翻首页、挨个判断这篇文章是不是已经看过。站点的更新频率还各不相同,有的日更有的月更,一个月后你已经忘了哪些看过了。想用现成的 RSS 阅读器,又常常遇到几个问题:要注册账号、要同步到云端、几十个源要一个个手动添加,加完还不知道哪个源已经失效了。
- 原来的做法:把几十个站点存进浏览器书签,每天挨个点开翻一遍;或者用在线阅读器,注册、登录、一个个粘贴地址、还要忍受失效源拖慢整体加载。
- 用这个工具:把所有订阅地址(或一个 .txt / .opml 清单)交给工具,点一下「开始抓取」,几十个源同时抓,所有最新文章按发布时间倒序排在一张表里,还能一键导出 CSV。
- 省下来的:原来每天要花十几分钟挨个翻站点,现在 20 秒抓完,一屏看清所有更新;哪个源抓不动也会单独标出来,顺手就能清理掉失效订阅。
技术实现
用 Python 标准库实现,零第三方依赖:网络请求走 urllib.request,XML 解析走 xml.etree.ElementTree,界面走 tkinter(Python 自带),最后用 PyInstaller 打包成单个 exe。选纯标准库的原因很直接——工具要交付给普通用户双击即用,任何第三方依赖都可能因为缺少 DLL 或版本冲突在别人机器上跑不起来;标准库不会。
- 同时兼容 RSS 2.0 / Atom / RSS 1.0:解析时先按 Atom 命名空间找 entry,没有再退回 RSS 的 item,最后用 RDF 命名空间兜底。三种格式的日期也分别用 RFC 822(pubDate)与 RFC 3339(Atom updated)两种方式解析,解析失败只影响该条的排序,不会丢掉整条记录。
- 子线程抓取 + 队列回传,界面不卡:每个订阅源起一个 threading.Thread,抓完把结果 put 进 queue.Queue;主线程用 after(120) 轮询队列并刷新表格。tkinter 的控件只能在主线程操作,直接在工作线程里改控件会随机崩溃,队列是标准做法。
- 请求头禁用 gzip:显式带 Accept-Encoding: identity。urllib 不像浏览器那样自动解压 gzip,如果服务端返回压缩流,拿到的就是一串二进制,解析必然失败——这是纯标准库抓网页最容易踩的坑。
- 编码自动识别:先读响应头的 charset,没有再从 XML 声明里正则提取 encoding,最后按 utf-8 → gb18030 → latin-1 依次尝试解码。国内不少老站点是 GBK 编码,写死 utf-8 会全是乱码。
- 启动错峰,避免把目标站点打爆:每个线程启动间隔 50ms,并给每个源设 20 秒超时。这既是礼貌也是稳定性的保障:一瞬间并发几十个请求容易被目标站点限流甚至封 IP。
- 结果按时间倒序 + 失败可见:抓取结果按发布时间倒序重排,没有时间的排最后;抓取失败的源会单独在表里标出失败原因,用户一眼就能发现哪个订阅地址已经失效。导出 CSV 用 utf-8-sig,Excel 打开不乱码。
技术栈:Python 3.8+、urllib + ElementTree、tkinter 图形界面、PyInstaller 单文件
已知局限:每个订阅源最多取前 30 条,避免某个高频更新的源刷屏;不保存历史,每次抓取都是当前快照(想要历史变化请用我们的其它工具或定制开发)。
操作教程
- 添加订阅源
打开程序,在「订阅地址」输入框里粘贴一个 RSS 或 Atom 地址(通常形如 https://站点域名/feed),按回车或点「添加」。重复添加同一个地址会被自动忽略。
预期结果:下方「订阅源清单」里出现该地址,前面显示可读的短名。 - 批量导入清单
如果已经有一份订阅地址列表,点「从文件导入」,选一个 .txt(每行一个地址)或 .opml(阅读器导出的订阅文件),工具会自动读出里面所有地址并去重。
预期结果:状态栏提示「从文件导入 N 个订阅源(去重后新增 M 个)」,清单里出现多行。 - 开始抓取
点「开始抓取」。每个订阅源会在后台线程里同时抓取,进度条按完成的源数推进。抓取过程中「开始抓取」置灰、「停止」可用。
预期结果:进度条逐步走满,结果表里不断出现新行,状态栏显示正在抓取。 - 查看结果
抓完后结果表按发布时间从新到旧排列,四列分别是来源、标题、发布时间、链接。双击任意一行会用系统默认浏览器打开该文章的原文。
预期结果:表格按时间倒序,双击能打开对应网页。 - 处理失败的源
如果某个源抓不动(域名失效、被墙、返回 403 等),表里会单独出现一行,标题位置写着「(抓取失败:原因)」。
预期结果:失败原因以人话显示,例如「HTTP 403」「网络错误:timed out」。 - 导出结果
点「导出 CSV」,选择保存位置。文件用 Excel 或记事本都能直接打开,中文不乱码。
预期结果:生成 CSV 文件,含来源、标题、发布时间、链接四列。 - 清理订阅源
在订阅源清单里点选(可按住 Ctrl 多选)后点「移除选中」,或点「清空」全部重置。
预期结果:清单与内部列表同步更新。
全过程不需要注册账号,也不需要安装任何运行环境(exe 已打包好 Python 运行时)。
常见问题
技术实现与后续维护
本工具由我们自行开发并持续维护,每次迭代都经过本地自测。代码刻意分成「抓取解析纯函数」与「tkinter 界面」两部分:纯函数不依赖界面,可以脱离窗口单独测试;界面只负责把数据摆出来。改动抓取规则时不会牵连界面,反之亦然。
技术构成:
src/rss_reader.py—— 唯一源码文件:抓取/解析纯函数 + tkinter 界面 + 导出逻辑DOCS/开发文档.md—— 工程结构、技术实现要点、打包方式与扩展点
运行环境:
本工程为 Python 项目,只需标准库:
python src\rss_reader.py
打包成单文件 exe(注意必须带 --noconsole,否则会弹黑色控制台窗口):
pip install pyinstaller
pyinstaller --onefile --noconsole --name "RSS批量订阅抓取器" src\rss_reader.py
可扩展方向:
- 在 parse_feed 之后加一层时间/关键词过滤,只保留关心的条目
- 把结果写入 sqlite,形成可回溯的历史更新记录
- 增加定时任务:每隔 N 分钟自动抓一次,发现新条目就系统通知
- 接入翻译或摘要接口,把外文标题转成中文摘要
本工具免费提供使用,但不对外分发源码。如果你需要在本工具基础上做功能调整、对接内部系统或长期维护,可以联系我们做二次开发,源码与工程文档可在定制合作中一并交付。
需要其它功能?可以定制
这个工具只做一件事:关注了几十个博客和站点,一个个点开看更新太低效。如果你的场景还需要别的处理,可以联系我们做二次开发,按你的实际数据格式和流程定制。
常见的定制需求:
- 只保留最近 N 小时的更新,并按关键词过滤
- 把抓取结果自动追加到本地 Excel 或数据库,形成历史归档
- 对指定源做定时抓取,发现新文章就发邮件或企业微信提醒
- 增加全文抓取(连正文一起存下来)并导出为 Markdown
- 联系方式:邮箱/微信见站内「联系我们」页面,或在本文下方留言
- 定制说明:请附上你的数据样例(脱敏即可)和期望结果,方便快速评估工作量
- 交付形式:定制项目可交付可执行程序,按需一并交付源码与工程文档,支持长期维护
使用说明与免责声明
- 本工具仅用于采集公开可见或你自身拥有权限的数据。
- 请遵守目标网站的服务条款、robots 协议及《网络安全法》等相关法律法规。
- 请合理控制请求频率,不要对目标站点造成访问压力。
- 不得用于采集个人隐私、付费墙内容或任何受法律保护的非公开数据。
- 因使用不当造成的后果由使用者自行承担;本工具不做数据二次分发。

