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

使用PRAW获取Reddit r/worldnews直播帖顶级评论遇超时求助

解决PRAW获取Reddit大流量直播帖所有顶级评论超时/数量不足的问题

问题原因分析

你提到的直播帖属于大流量评论线程,评论量可能高达数万条,原代码存在以下核心问题:

  1. replace_more(limit=None)会递归加载所有"更多评论"节点,触发大量API请求,极易因网络延迟或Reddit速率限制导致超时。
  2. submission.comments.list()会一次性将所有评论加载到内存,不仅效率低,还可能引发内存溢出。
  3. 设置固定limit值(如100/300/500)仅能加载对应数量的"更多评论"节点,剩余顶级评论会被隐藏,导致采集数量不足。

解决方案

通过分批加载评论节点、优化遍历方式、加入异常重试机制,可高效采集所有顶级评论:

修改后的代码

import praw
import pandas as pd
from requests.exceptions import ReadTimeout, ConnectionError

# 初始化PRAW(替换为你的API认证信息)
reddit = praw.Reddit(
    client_id="YOUR_CLIENT_ID",
    client_secret="YOUR_CLIENT_SECRET",
    user_agent="YOUR_USER_AGENT",
    timeout=30,  # 设置30秒请求超时
    ratelimit_seconds=600  # 调整速率限制窗口,适配大流量采集
)

target_url = "https://www.reddit.com/r/worldnews/comments/1735w17/rworldnews_live_thread_for_2023_israelhamas/"
submission = reddit.submission(url=target_url)
comments_list = []

def collect_top_level_comments(submission):
    # 循环加载"更多评论"节点,每次处理100个,直到无剩余
    while True:
        try:
            remaining_nodes = submission.comments.replace_more(limit=100, threshold=0)
            if not remaining_nodes:
                break
            print(f"待加载的更多评论节点剩余: {len(remaining_nodes)}")
        except (ReadTimeout, ConnectionError):
            print("请求超时,自动重试...")
            continue
    
    # 遍历顶级评论生成器,仅处理根评论
    for comment in submission.comments:
        if isinstance(comment, praw.models.Comment) and comment.is_root:
            comments_list.append({
                'author': comment.author.name if comment.author else '[deleted]',
                'body': comment.body,
                'score': comment.score,
                'edited': comment.edited,
                'created_utc': comment.created_utc,
                'permalink': f"https://www.reddit.com{comment.permalink}"
            })
            # 每收集100条打印进度
            if len(comments_list) % 100 == 0:
                print(f"已收集{len(comments_list)}条顶级评论")

# 执行采集
collect_top_level_comments(submission)

# 转换为DataFrame并输出结果
comments_df = pd.DataFrame(comments_list)
print(f"最终采集到{len(comments_df)}条顶级评论")
# 可选:保存到本地文件
# comments_df.to_csv("reddit_top_comments.csv", index=False)

关键优化点说明

  • 分批加载评论节点:replace_more(limit=100)每次仅加载100个"更多评论"节点,避免一次性请求过多导致超时,循环执行直到无剩余节点。
  • 异常重试机制:捕获网络超时和连接错误,自动重试请求,避免采集中途中断。
  • 内存优化:直接遍历submission.comments生成器,而非转为列表,减少内存占用,适配大流量线程。
  • 进度跟踪:加入进度打印,方便实时了解采集状态。

注意事项

  1. 确保已在Reddit开发者平台创建应用,获取正确的client_id、client_secret和user_agent。
  2. 遵守Reddit API速率限制规则,避免频繁请求导致账号被封禁。
  3. 大流量线程采集耗时较长,请耐心等待,或加入断点续存逻辑(如定期保存到文件)。

内容的提问来源于stack exchange,提问作者Eric Zarycki

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 23:17:32