首页 / 建站向导 / RSS 阅读 / 信息流站

RSS 阅读 / 信息流站

聚合多个 RSS 源做自己的阅读器:定时拉取落盘 JSON,纯静态渲染,零后端。

📡 场景 ⏱ 1.5小时 4 个步骤 难度 已完成 0 / 4 步
■ 全文速览 · 静态内容

RSS 阅读 / 信息流站:4 步完整做法

下面这份是静态全文(含脚本与自查清单),由 scripts/seo-prerender.js 从 data/steps.json 生成,供搜索引擎与关闭 JS 的访客阅读。上面那套是带进度保存的交互向导,内容和它完全一致。

  1. 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 结构
    • 缺字段的源不会导致解析报错
  2. 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 大小稳定在预期内
  3. Step 3 · 前端渲染:列表 + 筛选 + 已读

    源筛选、关键词过滤、已读状态存本地

    阅读器页面就三块:源筛选栏 / 列表 / 已读状态。

    列表渲染要点:

    • 每条显示:标题、源名、日期、一句话摘要;点标题新窗口打开原文
    • 按源筛选(顶部一排 chip)+ 关键词过滤(输入框,本地匹配 title/summary)
    • 已读置灰:点击后把 url 存进 localStorage,刷新后仍置灰
    // 已读态:存 url 集合,别存整份数据
    const read = new Set(JSON.parse(localStorage.getItem('read') || '[]'));
    // 点击时 read.add(url) 并写回

    纯静态的取舍:已读状态是本地的,换设备不同步——这是特性不是 bug,写在页面说明里,别为了同步去加后端。

    性能:500 条以内直接全量渲染不用分页;超过就按日期分段「加载更多」。

    兜底:fetch 失败显示「数据暂不可用」+ 上次更新时间,别白屏。

    自查清单
    • 能按源与关键词筛选
    • 已读状态刷新后保留
    • fetch 失败时有兜底文案
  4. 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 事件能查到
    • 每月有源淘汰与补充记录

关于RSS 阅读 / 信息流站,你大概还想问

RSS 阅读 / 信息流站一共几步?大概要多久?

共 4 步,约 1.5小时:1) 选源 + 解析 RSS;2) 定时拉取 + 落盘 + 去重;3) 前端渲染:列表 + 筛选 + 已读;4) 上线 + 收录观测 + 长期维护。每步都带操作说明、可复制的一键脚本和自查清单。

RSS 阅读 / 信息流站第一步要做什么?

选源 + 解析 RSS——先定 10–20 个源,写脚本统一成一份 JSON。这一步做完,后面的步骤才有依据。

RSS 阅读 / 信息流站做完后怎么判断做对了没有?

上线 + 收录观测 + 长期维护——页面要能被搜到;源要定期淘汏。这一步的自查清单就是验收标准,全部勾上才算真正上线。