使用PRAW遍历并删除所有Reddit评论时仅处理100条的问题解决咨询
PRAW仅处理100条Reddit评论后停止,如何删除全部评论?
问题描述
我尝试用PRAW获取自己所有的Reddit评论并删除,编写了以下代码:
import praw r = praw.Reddit(...) print("\nFetching all comments ...") i = len(list(r.user.me().comments.new(limit=None))) print("Found " + str(i) + " comments. Processing ...") comments = r.user.me().comments.new(limit=None) for c in comments: c.edit(body="deleted").delete() print(" - Comment " + c.id + " deleted, " + str(i - 1) + " to go") i = i - 1 print("\nAll done!")
运行后输出(精简版):
Found 268 comments. Processing ... - Comment ie8hwqq deleted, 267 to go ... - Comment i9txf1j deleted, 168 to go All done!
奇怪的是,程序只处理了100条评论就停止了。我第一次把可迭代对象转成列表时,确实显示有268条评论,但直接遍历这个可迭代对象时,只处理了从最新的第268条到第169条的100条就退出循环了。请问该怎么解决这个问题?
解决方案
这是个很典型的PRAW使用误区,我来帮你理清楚问题根源和解决办法:
问题出在哪?
你两次调用了r.user.me().comments.new(limit=None):第一次转成列表时,PRAW会自动处理Reddit API的分页逻辑,把所有268条评论都拉取下来;但第二次直接遍历这个生成器时,情况就不一样了——Reddit API的分页默认每次只返回100条数据,而且当你在遍历过程中删除评论,会打乱后续分页请求的游标(cursor),导致迭代器无法继续获取下一页的内容,自然就停在100条了。
修复后的代码
正确的做法是先一次性把所有评论加载到本地列表里,再遍历列表执行删除操作,这样就不会受API分页或内容变化的影响。修改后的代码如下:
import praw r = praw.Reddit(...) print("\nFetching all comments ...") # 一次性拉取所有评论并存储到本地列表 all_comments = list(r.user.me().comments.new(limit=None)) total = len(all_comments) print(f"Found {total} comments. Processing ...") remaining = total for comment in all_comments: try: # 保持原逻辑:先编辑标记再删除 comment.edit(body="deleted") comment.delete() remaining -= 1 print(f" - Comment {comment.id} deleted, {remaining} to go") except Exception as e: # 处理异常:比如评论已被手动删除、权限不足等情况 remaining -= 1 print(f" - Failed to delete comment {comment.id}: {str(e)}") print("\nAll done!")
为什么这样能解决问题?
- 预加载所有评论:
list(...)会触发PRAW自动处理所有API分页请求,把所有评论都存在本地列表里,后续遍历的是本地数据,不会因为删除操作影响后续的获取。 - 异常处理兜底:加个
try-except能避免因为个别评论的问题导致整个程序中途崩溃,确保能处理尽可能多的评论。 - 避免重复API调用:原来的代码两次调用
comments.new(...),第二次的生成器没有办法像第一次转列表那样自动拉取所有分页,加上删除操作的干扰,自然就停在100条了。
如果你的评论数量特别多(比如几千条),可以考虑分批次处理,但几百条的情况直接加载到列表完全没问题。
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

