source2RSS 计划成为通用的「信息源转 RSS」的 Python 框架,目前支持两大类信息源:
- 参考官方自带的抓取器,继承抽象基类编写抓取器,作为插件供主程序调用,提供网站信息流(主要用于为网站生成 RSS)
- API 接收到的合法格式的 JSON 数据(主要用于将 RSS 作为提醒的渠道以及分布式所需)
- (计划)Newsletter 转 RSS
source2RSS 将定期运行抓取器获得信息流,并更新对应的 RSS 源;或在 API 收到数据后,保存其数据,并生成 RSS 源。
创建这个项目,是为了方便手动制作 RSS 源,虽然 RSSHub 等项目已经提供了很多 RSS 源,但终归不能覆盖每个人的需求,并且我并不会 JS、TS 语言,对 Python 则很熟悉。
用 Python 抓取和提取结构简单的网站数据并不困难,一般半小时就够,但是还需要制成 RSS、保留历史文章、定期运行等功能才能实际使用。
这个框架,就是为此目的开发的,只需要关注信息源的抓取和格式化,其余的交给框架,最终返回 RSS 文件。
项目地址: AhFeil/source2RSS: 一个信息源转 RSS 的 Python 框架,专注简化数据抓取后到 RSS 实际可用这一过程 (github.com)
(仅)对于 Python 新人,尤其是对爬虫感兴趣的,相信这个项目很适合用作参考借鉴
现有的抓取器
可以前往此网页查看已有的 RSS 源: Index of /source2rss/ (vfly2.com)
有几个独立博客和静态网站的抓取器,另外还有用处较广的 B站动态 和 番茄小说。
- B站动态使用 playwright 获取 cookie 从而利用 API 获得数据,使用方法为:在配置文件中启用,并添加一些初始化信息后,扫二维码登录(但是我的总是 3 天就失效)。
- 番茄小说需要有一个 root 权限的手机,下载番茄小说APP,然后还要安装 Magisk 和 LSPosed,最后在 LSPosed 加载一个模块,就能在番茄小说开启一个 API。本项目中的抓取器正是基于这个 API 获取的数据。(目前因为出差,我的手机带在身上没法暂时提供了)
如果你有需要转 RSS 的网站,可以发 Issue(务必),AhFei 会量力编写其抓取器(爬虫技术很一般,结构简单的静态网页,如博客一条一条的,会优先编写,最快平均一周一个)
程序思路
使用 FastAPI 监听传入的信息源,在新线程中运行定期抓取。
抓取器的工作流程
- run_as_scheduled.py 定期运行 crawler.py
- crawler.py 调用抓取器,获得返回的信息流(只返回新文章,无更新则直接退出)
- 新文章保存到 MongoDB,每个信息源都有一个 collection 来保存其历史文章
- generate_rss.py 从 collection 取出最新的 10 条,更新 RSS 文件
- Nginx 公开 RSS 目录,从而能访问 RSS 文件
不看细节,看思路:【抓取器提供信息流】-【MongoDB 保存信息流(最终效果是存储着信息源的所有文章)】-【根据表中数据生成最新的 RSS 文件】-【Nginx 公开访问】
API 的工作流程
- 类似,只是信息流变成了收到的数据,定期执行变为了被动触发。