如何通过PRAW在请求阶段限制Reddit评论数量以优化程序?
如何在请求阶段限制Reddit评论获取数量以优化性能
你当前的代码问题在于submission.comments.replace_more(limit=None)会强制加载所有嵌套的"更多评论",这才是拖慢速度的核心——哪怕最后只返回10条,程序已经把整个评论树都拉下来了。
要在请求阶段直接限制评论数量,有两种可行的实现方式:
方法一:优化PRAW内置方法,避免加载全部评论
不要用replace_more(limit=None),而是控制加载更多评论的数量,同时直接迭代排序后的评论,取前N条就停止:
def get_comments(reddit: reddit, submission_id: str, limit:int = 10) -> list: submission = reddit.submission(id=submission_id) submission.comment_sort = "top" # 先设置排序规则 comments = [] # 只加载必要的"更多评论",同时迭代获取评论 for comment in submission.comments: if isinstance(comment, praw.models.MoreComments): # 只加载当前层级的更多评论,不递归加载全部 comment_list = comment.comments() comments.extend(comment_list[:limit - len(comments)]) if len(comments) >= limit: break else: comments.append(comment) if len(comments) >= limit: break return comments[:limit]
这个思路的核心是:
- 先设置排序为top,让API返回的第一条就是最高赞评论
- 迭代评论时遇到
MoreComments,只加载当前层级的更多评论,而非全部嵌套的评论 - 每获取一条就检查是否达到limit,一旦满足就停止,避免发起多余请求
方法二:直接调用Reddit API端点,指定请求参数
如果PRAW的封装满足不了需求,可以直接调用Reddit的/comments/{submission_id} API,通过limit参数直接限制返回的评论数量:
import praw def get_comments_direct_api(reddit: praw.Reddit, submission_id: str, limit:int = 10) -> list: # 调用API,指定排序和数量限制 response = reddit.get(f"/comments/{submission_id}", params={ "sort": "top", "limit": limit }) # 解析返回的JSON数据,提取评论 comments_data = response[1]["data"]["children"] # 转换为PRAW的Comment对象(可选,如果你需要用PRAW的内置方法) comments = [praw.models.Comment(reddit, data=item["data"]) for item in comments_data] return comments
这种方式直接让API只返回你需要的limit条评论,完全避免了多余的数据传输,性能提升最明显。需要注意:
- 默认返回的是顶级评论,如果需要嵌套评论,得额外处理,但如果只需要top级别的评论,这个方法最高效
- 可以根据需求添加其他参数,比如
depth控制评论嵌套深度
内容的提问来源于stack exchange,提问作者Entl_
相关产品推荐
相关产品推荐

