如何同时流式获取并筛选Reddit热门帖子?
实现流式获取Reddit "hot"列表的优质帖子
首先得明确:Reddit的hot列表是动态更新的快照,它不是实时推送的流——这也是为什么你直接用subreddit.hot()没办法做到流式获取的原因。而stream.submissions()是监听新提交的帖子,但这些新帖大多还没进入hot池。要结合两者的需求,我们有两种可行的思路:
方法1:监听新提交,实时检查是否进入hot列表
这种思路是先监听所有新提交的非置顶帖,然后定期刷新hot列表的ID集合,检查当前新帖是否已经进入hot池。这样能实时捕捉那些快速冲上hot的优质帖子。
代码示例
import praw import time # 初始化PRAW(替换成你的API信息) reddit = praw.Reddit( client_id="YOUR_CLIENT_ID", client_secret="YOUR_CLIENT_SECRET", user_agent="YOUR_USER_AGENT" ) subreddit = reddit.subreddit("news") # 维护hot帖子ID的集合,定期刷新 hot_post_ids = set() def refresh_hot_ids(): global hot_post_ids # 获取当前hot前50的帖子ID(可根据需求调整limit) hot_post_ids = {sub.id for sub in subreddit.hot(limit=50)} print(f"刷新hot列表,当前共{len(hot_post_ids)}个帖子") # 先初始化一次hot列表 refresh_hot_ids() # 每10分钟刷新一次hot列表(可调整间隔) refresh_interval = 600 last_refresh_time = time.time() # 监听新提交的帖子 for submission in subreddit.stream.submissions(): if submission.stickied: continue # 检查是否到了刷新hot列表的时间 if time.time() - last_refresh_time > refresh_interval: refresh_hot_ids() last_refresh_time = time.time() # 如果当前帖子在hot列表中,就输出 if submission.id in hot_post_ids: print(f"[Hot] {submission.title} {submission.url}\n")
优缺点
- ✅ 能实时捕捉快速进入hot的新帖
- ❌ 可能漏掉一些慢热型帖子(刚提交时没进hot,之后才进去,但此时stream已经过了这个帖子)
方法2:定期轮询hot列表,获取新增优质帖子
这种思路更直接:定期拉取hot列表,对比已经处理过的帖子ID,只处理新增的帖子。本质是用轮询模拟流式效果,更适合确保不会错过hot里的优质内容。
代码示例
import praw import time reddit = praw.Reddit( client_id="YOUR_CLIENT_ID", client_secret="YOUR_CLIENT_SECRET", user_agent="YOUR_USER_AGENT" ) subreddit = reddit.subreddit("news") # 记录已经处理过的帖子ID processed_ids = set() # 轮询间隔(比如每5分钟一次,可调整) poll_interval = 300 while True: # 获取当前hot列表的帖子 hot_submissions = list(subreddit.hot(limit=20)) # 取前20个hot帖 for submission in reversed(hot_submissions): # 倒序,先处理最新进入hot的 if submission.stickied or submission.id in processed_ids: continue # 标记为已处理并输出 processed_ids.add(submission.id) print(f"[New Hot] {submission.title} {submission.url}\n") # 等待下一次轮询 time.sleep(poll_interval)
优缺点
- ✅ 不会漏掉hot列表里的优质帖子,不管是快速还是慢热型
- ❌ 不是真正的实时,延迟取决于轮询间隔(间隔越短越接近实时,但API调用频率会更高,注意Reddit的API速率限制)
注意事项
- 一定要遵守Reddit的API速率限制,不要把轮询间隔设得太短(建议至少1分钟以上)
- 如果需要更大的hot列表范围,可以调整
limit参数,但过大的limit会增加API调用的耗时 - 两种方法都可以根据你的需求调整参数(比如hot列表的数量、刷新/轮询间隔)
内容的提问来源于stack exchange,提问作者Huzo
相关产品推荐
相关产品推荐

