You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何同时流式获取并筛选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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:58:02