使用 CSS 选择器构建轻量级 RSS 订阅源服务
基于 URL 解析和 CSS 选择器,打造轻量级 RSS 服务,实现针对性内容提取、过滤与订阅管理,适用于 Web 抓取管道。
在当今信息爆炸的时代,许多网站并未提供标准的 RSS 订阅源,这给用户追踪特定内容带来了不便。构建一个轻量级 RSS 订阅源服务,可以通过 URL 解析和 CSS 选择器实现针对性内容提取,帮助用户从任意网页生成自定义 feed。这种方法特别适用于 Web 抓取管道,能高效过滤无关信息,并支持订阅管理。本文将探讨如何从零搭建此类服务,聚焦工程化参数与落地清单,避免依赖复杂框架。
首先,理解核心需求:服务需输入目标 URL、Feed 标题及 CSS 选择器,即可生成 RSS XML 输出。灵感来源于 Feedmaker 等工具,它允许用户指定选择器来定位 feed 项、标题、描述和链接。Feedmaker 就是一个简单示例,通过浏览器界面快速测试配置。我们的服务将扩展为 API 形式,支持自动化抓取和订阅更新。
技术栈选择与 URL 解析
搭建服务时,选择轻量级后端框架如 FastAPI(Python)或 Express(Node.js),以最小依赖实现。Python 方案更友好,因为结合 requests 和 BeautifulSoup,能轻松处理 HTML 解析。
-
URL 解析与请求处理:使用 requests 库发送 GET 请求到目标 URL。参数设置:设置 User-Agent 为浏览器模拟(如 "Mozilla/5.0"),超时 10-15 秒,避免被反爬虫封禁。启用 session 复用以支持 cookie 持久化,如果网站需登录。
-
HTML 内容提取:解析响应 HTML,使用 BeautifulSoup 的 select 方法应用 CSS 选择器。核心选择器包括:
- 项容器:如 ".article-list",提取多条 feed 项。
- 标题:如 "h2 a",获取链接文本。
- 描述:如 ".summary",截取前 200 字。
- 链接:如 "a[href]",绝对化 URL。
工程参数:限制提取项数为 20-50 条,避免内存溢出;使用 lxml 解析器加速(pip install lxml)。
潜在风险:网站结构变动导致选择器失效。缓解策略:定期(每周)监控提取成功率,若低于 80%,触发警报;备选多套选择器轮换。
内容过滤与增强
提取后,进行过滤以提升 feed 质量。过滤规则基于关键词、正则或机器学习简单分类,但保持轻量:使用 Python 的 re 模块匹配标题/描述,避免广告(如含 "sponsored")。
增强步骤:
- 元数据包含:可选添加 pubDate(从 标签提取,或用当前时间),作者(.author 选择器)。
- URL 参数剥离:移除跟踪参数如 ?utm_source,使用 urllib.parse.urlparse 清理,生成干净链接。
- 描述处理:去除 HTML 标签(BeautifulSoup.decompose),添加摘要生成(如用 NLTK 提取关键词,但可选以轻量)。
落地清单:
- 过滤阈值:关键词黑名单 ≥3 项则丢弃。
- 描述长度:100-300 字,超长截断。
- 重复检测:用 MD5 哈希标题+链接,缓存 Redis 7 天,避免重复 feed。
RSS 生成与订阅管理
使用 feedgen(Python 库)构建 RSS 2.0 XML。结构:channel(title, link, description),item(title, link, description, pubDate)。
代码片段示例(伪代码):
from feedgen.feed import FeedGenerator
fg = FeedGenerator()
fg.title(feed_title)
fg.link(href=target_url)
for item in extracted_items:
fe = fg.add_entry()
fe.title(item['title'])
fe.link(href=item['link'])
fe.description(item['desc'])
fe.pubdate(item['date'])
rss_str = fg.rss_str(pretty=True)
订阅处理:在管道中集成 polling 机制,每 1-6 小时检查更新(用 APScheduler)。对于用户订阅,支持 webhook 推送新 feed,或简单邮件通知。API 端点:POST /generate 接收配置,GET /feed/{id} 返回 XML。
参数优化:
- 更新频率:默认 2 小时,最大 24 小时,防滥用。
- 缓存策略:提取结果存 S3 或本地文件,TTL 1 小时。
- 错误处理:HTTP 429 时退避 2^n 秒;解析失败返回空 feed 并日志。
部署与监控
部署到 Fly.io 或 Vercel 等 serverless 平台,成本低。Docker 化服务:暴露 8080 端口,健康检查 /health。
监控要点:
- 日志:用 structlog 记录提取成功率、响应时间。
- 指标:Prometheus 采集请求 QPS、错误率;警报若提取率 <90%。
- 回滚:版本控制选择器配置,A/B 测试新选择器。
安全考虑:验证输入 URL 避免 SSRF(白名单域名);限流 API 10 req/min/IP。
实际案例与扩展
假设针对新闻网站,如提取 "最读故事":URL 为 homepage,选择器 ".top-stories li" 为项,"h3" 为标题。生成 feed 后,用户可导入 Feedly 等阅读器。
扩展:集成多源聚合,CSS 选择器转为 XPath 备选;添加 AI 摘要(用 Hugging Face 模型,但增重)。风险:合规性,始终检查 robots.txt,延迟请求 >1 秒/页。
通过以上参数,此服务可在 100 行代码内实现,适用于个人或小团队 Web 管道。测试时,从简单站点起步,逐步优化选择器精度。最终,它不仅解决订阅痛点,还提升抓取效率,推动信息自动化流动。
(字数约 950)" posts/2025/09/20/building-a-lightweight-rss-feed-service-using-css-selectors.md