本文目录导读:

- 核心思路:统一的数据模型
- 方案一:利用现成的 RSS 源(最简单、最稳定)
- 方案二:针对开放API的非RSS平台(如Twitter、Telegram)
- 方案三:爬虫方式(针对无RSS/API的封闭平台,高风险)
- 方案四:使用无代码/低代码平台(最适合非程序员)
- 最终建议:如何选择?
数据获取、解析结构化以及去重聚合,由于各平台(如微博、知乎、微信公众号、新闻网站、RSS源等)的反爬机制、API开放程度和页面结构各不相同,没有一套通用的脚本能直接“一键聚合”。
可以基于不同的技术路线来构建这样的脚本,以下是几种主流且可行的实现方案,从简单到复杂排列,并包含风险提示。
核心思路:统一的数据模型
在写脚本前,先定义好每条资讯的通用结构,便于后续处理和输出:
{: "资讯标题",
"url": "原始链接",
"source": "来源平台(如: 36氪, 微博, 微信公众号)",
"publish_time": "发布时间(统一为时间戳或标准格式)",
"summary": "摘要或正文前200字",
"content": "完整正文(可选,根据存储空间)",
"tags": ["标签1", "标签2"]
}
利用现成的 RSS 源(最简单、最稳定)
很多平台(如知乎、掘金、少数派、V2EX、Hacker News)都提供公开的RSS/Atom Feed,这是最推荐的聚合方式,因为:
- 无需破解反爬:平台主动提供给机器读取的格式(XML/JSON)。
- 稳定:只要源不关闭,脚本基本不需要维护。
- 规范、时间、链接、摘要都是现成的。
技术选型:Python 的 feedparser 库。
核心代码示例:
import feedparser
import time
import json
# 1. 定义需要聚合的 RSS 源列表
RSS_FEEDS = [
{
"name": "知乎日报",
"url": "https://daily.zhihu.com/story/rss"
},
{
"name": "36氪快讯",
"url": "https://36kr.com/feed"
},
{
"name": "V2EX最热",
"url": "https://www.v2ex.com/index.xml"
}
]
# 2. 统一解析函数
def parse_rss(feed_entry):
return {
"title": feed_entry.get("title", ""),
"url": feed_entry.get("link", ""),
"source": feed_entry.get("source", {}).get("title", "Unknown"),
"publish_time": feed_entry.get("published_parsed", time.gmtime()),
"summary": feed_entry.get("summary", "")[:200],
"content": feed_entry.get("content", [{}])[0].get("value", "") if feed_entry.get("content") else ""
}
# 3. 聚合所有源
def aggregate_all():
aggregated = []
for feed_info in RSS_FEEDS:
try:
feed = feedparser.parse(feed_info["url"])
for entry in feed.entries:
item = parse_rss(entry)
item["source"] = feed_info["name"]
aggregated.append(item)
except Exception as e:
print(f"获取 {feed_info['name']} 失败: {e}")
time.sleep(0.5) # 礼貌性延迟
# 按发布时间降序排列
aggregated.sort(key=lambda x: x["publish_time"], reverse=True)
return aggregated
# 4. 输出为JSON
if __name__ == "__main__":
result = aggregate_all()
with open("aggregated_news.json", "w", encoding="utf-8") as f:
json.dump(result, f, ensure_ascii=False, indent=2)
针对开放API的非RSS平台(如Twitter、Telegram)
有些平台不提供RSS,但有更强大的API(如Twitter V2 API、Telegram Bot API、Discord Webhook),虽然需要申请API Key,但依然是合法且稳定的途径。
通过 Telegram Bot 监听公开频道/群的资讯
- 申请 Bot Token。
- 获取需要监听的 Channel ID。
- 使用
python-telegram-bot库或直接调用getUpdatesAPI 拉取消息。
监听特定 Twitter 账号的推文
-
申请 Twitter Developer Account,获得 Bearer Token。
-
使用
tweepy库:import tweepy client = tweepy.Client(bearer_token='YOUR_TOKEN') # 获取用户最近推文 tweets = client.get_users_tweets(id='用户ID', max_results=100) for tweet in tweets.data: print(tweet.text)
爬虫方式(针对无RSS/API的封闭平台,高风险)
对于不提供RSS、且没有开放API的平台(如微信公众号、知乎问题页、某些新闻网站),需要使用爬虫(Scraping)。
风险提示:
- 法律风险:未经授权爬取受版权保护的内容可能构成侵权。
- 账号风险:频繁请求可能导致IP被封或被平台起诉。
- 维护成本高:页面结构(CSS选择器/XPath)随时可能变化,脚本需频繁更新。
技术路线:
- 请求库:
requests(静态页面)或playwright/selenium(动态渲染的JS页面)。 - 解析库:
BeautifulSoup(解析HTML)或lxml(性能更好)。 - 反爬应对(需谨慎):
- 模拟 User-Agent 和 Referer。
- 使用代理IP池。
- 限制请求频率(如 2-5秒/次)。
伪代码示例(抓取某个支持静态页面的网站):
import requests
from bs4 import BeautifulSoup
import time
HEADERS = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"
}
def scrape_news_website(url):
response = requests.get(url, headers=HEADERS, timeout=10)
soup = BeautifulSoup(response.text, 'html.parser')
items = []
# 假设每条新闻在 <div class="news-item"> 中
for item in soup.select("div.news-item > a"):
title = item.text.strip()
link = item.get("href")
# 时间、摘要需根据实际结构提取
items.append({"title": title, "url": link, "source": "某网站"})
return items
使用无代码/低代码平台(最适合非程序员)
如果不想写代码维护脚本,可以使用现成的自动化工具:
- RSSHub(开源):一个万能RSS生成器,很多平台没有原生RSS,但RSSHub社区提供了数千种路由(如微博热搜、知乎专栏、B站动态等),你可以自建一个RSSHub实例,然后通过方案一读取。
- n8n / IFTTT / Zapier:通过可视化连线,将“新文章”触发到“数据库”或“通知”。
- Huginn:一个自部署的Agent系统,可以创建类似爬虫和聚合的“代理”。
最终建议:如何选择?
| 你的需求 | 推荐方案 | 优点 |
|---|---|---|
| 聚合知名平台资讯(如知乎、掘金、36氪) | RSS | 稳定、零反爬、无需维护 |
| 监控Twitter/Telegram/Reddit | 开放API | 高效、合法、数据精准 |
| 需要抓取微信公众号、封闭平台 | 爬虫 | 不推荐,除非你有明确授权或内部使用 |
| 想快速搭建、不写代码 | RSSHub + 低代码 | 灵活、社区强大、图形化配置 |
推荐组合:RSSHub(自建)+ Python 脚本聚合,既能覆盖绝大多数平台(利用RSSHub的通用路由),又能通过脚本进行去重、排序、存入数据库,是目前最平衡、最可持续的方案。
最后提醒:无论采用哪种方式,请务必遵守各平台的 robots.txt 和服务条款,尊重数据版权,聚合脚本应当用于个人学习、信息获取或内部系统,不要用于商业分发或侵犯他人权益。