-
Step 1 · 选源 + 解析 RSS
先定 10–20 个源,写脚本统一成一份 JSON
RSS 阅读站的价值不在「什么都能读」,而在你替读者筛过一遍。
选源原则:
- 个人博客 / 独立开发者优先(质量高、更新稳、少营销)
- 每个源看最近 10 篇,广告超过一半的直接淘汰
- 起始 10–20 个源就够,多了你自己都不看
统一数据格式(后面全靠它):
{ "updated": "2026-09-27T08:00:00Z", "items": [ { "title": "...", "url": "...", "source": "源名", "published": "2026-09-27", "summary": "..." } ] }解析:Node 用
fast-xml-parser或rss-parser;Python 用feedparser。RSS 有 RSS2.0 / Atom / RDF 三种方言,别手写正则解析——用库。缺失字段兜底:没有
summary就截取正文前 120 字;没有published就用抓取时间。别让一条脏数据把整个列表搞崩。自查清单
- 至少 10 个源,且都解析成功
- 所有条目统一成同一份 JSON 结构
- 缺字段的源不会导致解析报错
-
Step 2 · 定时拉取 + 落盘 + 去重
crontab 每小时拉一次,按 url 去重,只留最近 N 条
拉取脚本做的事就三件:拉 → 合并 → 落盘。
# crontab:每小时的第 7 分钟拉一次 7 * * * * /usr/bin/node /root/rss/fetch.js >> /root/rss/fetch.log 2>&1合并规则(决定列表好不好看):
- 按
url去重:同一篇文章被多个源收录只留一条(保留最早发布的源) - 按
published倒序:新在前 - 只留最近 200–500 条:无限增长会让 JSON 变大、页面变慢
- 增量写:先读旧 JSON,合并后再写,别每次全量重算
失败处理:单个源拉失败记日志并跳过,绝不能中断整批;连续失败 3 次的源在日志里标出来,人工检查是不是源挂了。
落盘位置:
/www/wwwroot/你的域名/data/feed.json,Nginx 配好 JSON MIME(见scripts/nginx-site.conf),前端直接 fetch。别忘了:跑一次
jsonlint校验,前端白屏 90% 是 JSON 坏了。自查清单
- crontab 里有拉取任务且日志有输出
- 重复文章只出现一次
- feed.json 大小稳定在预期内
- 按
-
Step 3 · 前端渲染:列表 + 筛选 + 已读
源筛选、关键词过滤、已读状态存本地
阅读器页面就三块:源筛选栏 / 列表 / 已读状态。
列表渲染要点:
- 每条显示:标题、源名、日期、一句话摘要;点标题新窗口打开原文
- 按源筛选(顶部一排 chip)+ 关键词过滤(输入框,本地匹配 title/summary)
- 已读置灰:点击后把
url存进localStorage,刷新后仍置灰
// 已读态:存 url 集合,别存整份数据 const read = new Set(JSON.parse(localStorage.getItem('read') || '[]')); // 点击时 read.add(url) 并写回纯静态的取舍:已读状态是本地的,换设备不同步——这是特性不是 bug,写在页面说明里,别为了同步去加后端。
性能:500 条以内直接全量渲染不用分页;超过就按日期分段「加载更多」。
兜底:fetch 失败显示「数据暂不可用」+ 上次更新时间,别白屏。
自查清单
- 能按源与关键词筛选
- 已读状态刷新后保留
- fetch 失败时有兜底文案
-
Step 4 · 上线 + 收录观测 + 长期维护
页面要能被搜到;源要定期淘汏
上线:传静态文件(或挂子目录
reader.你的域名)、申请 HTTPS、写 sitemap 提交。收录观测(信息流站特别重要):
信息流页面内容每天变,爬虫抓到的和你现在显示的可能不一样。做法:- 页面静态部分写清这是什么站、收录哪些源、更新频率(爬虫读得到)
sitemap.xml里带上阅读器页,lastmod随数据更新- 把 URL 写进
data/index-observation.json,跑bash scripts/index-observation.sh定期核对状态 - 源列表页(
/sources.html)单独做一页静态清单——这页才是你真正的 SEO 资产,因为它内容稳定且关键词明确
维护(每月 20 分钟):
- 淘汰连续 30 天没更新或质量下滑的源,补 2–3 个新源
- 看
pv与点击:哪个源的文章点得最多,就往那个方向加源 - 埋
feed_click(点击条目跳原文)作为主转化事件,登记进data/conversion.json
别做的:为了收录去生成一堆空壳聚合页,那是稀释权重不是增加收录。
自查清单
- 源清单页是独立静态页且已提交收录
- feed_click 事件能查到
- 每月有源淘汰与补充记录