使用PRAW获取Reddit r/worldnews直播帖顶级评论遇超时求助
解决PRAW获取Reddit大流量直播帖所有顶级评论超时/数量不足的问题
问题原因分析
你提到的直播帖属于大流量评论线程,评论量可能高达数万条,原代码存在以下核心问题:
replace_more(limit=None)会递归加载所有"更多评论"节点,触发大量API请求,极易因网络延迟或Reddit速率限制导致超时。submission.comments.list()会一次性将所有评论加载到内存,不仅效率低,还可能引发内存溢出。- 设置固定
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生成器,而非转为列表,减少内存占用,适配大流量线程。 - 进度跟踪:加入进度打印,方便实时了解采集状态。
注意事项
- 确保已在Reddit开发者平台创建应用,获取正确的
client_id、client_secret和user_agent。 - 遵守Reddit API速率限制规则,避免频繁请求导致账号被封禁。
- 大流量线程采集耗时较长,请耐心等待,或加入断点续存逻辑(如定期保存到文件)。
内容的提问来源于stack exchange,提问作者Eric Zarycki
相关产品推荐
相关产品推荐

