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

基于PRAW的Reddit评论爬取与CSV导出技术问询

针对你的PRAW Reddit评论爬取需求的改进方案

嘿,作为刚接触PRAW的新手,你的这三个需求完全可以一步步解决,我来给你拆解每个问题的实现方法,附带完整的代码示例:

1. 获取更多评论(解决仅输出少量评论的问题)

默认情况下,PRAW只会加载页面顶部的少量评论,要获取更多甚至所有评论,得用replace_more()方法来加载隐藏的评论和回复分支。这个方法会把那些“加载更多评论”的占位符替换成实际的评论内容。

  • 如果你想加载所有可用评论,可以设置limit=None(注意:部分热门帖子评论量极大,可能会耗时很久,建议先从小帖子测试)
  • 也可以设置具体数值,比如limit=10来加载前10个“更多评论”分支

示例代码片段:

submission = reddit.submission(id='7v8ob2')
# 加载所有隐藏的评论分支
submission.comments.replace_more(limit=None)

2. 遍历评论回复树

Reddit的评论是树形结构,每个评论可能有多层回复。你可以用submission.comments.list()一次性获取所有顶级评论和它们的所有层级回复,也可以写一个递归函数来遍历整个回复树,清晰展示层级关系。

比如这个递归函数能帮你打印带缩进的层级评论:

def traverse_comments(comment, depth=0):
    # 用缩进表示回复深度,直观展示评论树
    indent = "    " * depth
    print(f"{indent}评论ID: {comment.id}")
    print(f"{indent}作者: {comment.author.name if comment.author else '[已删除]'}")
    print(f"{indent}内容: {comment.body}")
    print(f"{indent}---")
    # 递归遍历当前评论的所有子回复
    for reply in comment.replies:
        traverse_comments(reply, depth + 1)

# 遍历所有顶级评论
for top_level_comment in submission.comments:
    traverse_comments(top_level_comment)

3. 导出数据为CSV格式

要把评论数据导出成CSV,咱们可以用Python内置的csv模块。先把每个评论的关键信息(比如评论ID、作者、内容、发布时间、父评论ID、回复层级)收集成字典列表,再写入CSV文件即可。

完整整合代码

import praw
import datetime as dt
import csv

# 初始化Reddit客户端(记得替换成你的真实参数)
reddit = praw.Reddit(
    client_id="你的client_id",
    client_secret="你的client_secret",
    user_agent="你的user_agent(格式建议:项目名/版本 by u/你的用户名)"
)

def collect_comment_data(comment, parent_id=None, depth=0):
    # 收集单条评论的核心数据,处理可能的空值(比如作者已删除)
    comment_data = {
        "comment_id": comment.id,
        "parent_id": parent_id,
        "author": comment.author.name if comment.author else "[已删除]",
        "body": comment.body.replace("\n", " "),  # 替换换行符避免CSV格式错乱
        "created_at": dt.datetime.fromtimestamp(comment.created_utc).strftime("%Y-%m-%d %H:%M:%S"),
        "depth": depth
    }
    all_comments.append(comment_data)
    # 递归处理当前评论的所有回复
    for reply in comment.replies:
        collect_comment_data(reply, parent_id=comment.id, depth=depth + 1)

# 目标帖子
submission = reddit.submission(id='7v8ob2')
# 加载所有评论分支
submission.comments.replace_more(limit=None)

# 存储所有评论数据的列表
all_comments = []

# 遍历所有顶级评论,收集完整数据
for top_comment in submission.comments:
    collect_comment_data(top_comment)

# 写入CSV文件
with open("reddit_comments.csv", "w", newline="", encoding="utf-8") as csv_file:
    # 定义CSV表头
    fieldnames = ["comment_id", "parent_id", "author", "body", "created_at", "depth"]
    writer = csv.DictWriter(csv_file, fieldnames=fieldnames)
    
    writer.writeheader()
    for comment in all_comments:
        writer.writerow(comment)

print(f"数据已成功导出到reddit_comments.csv,共{len(all_comments)}条评论")

新手小贴士

  • 记得替换代码中reddit = praw.Reddit()里的参数,这些信息需要你在Reddit开发者平台申请获取
  • 如果遇到API速率限制,可以放慢请求速度,或者先设置replace_more(limit=20)来测试
  • 替换评论内容里的换行符是为了避免CSV单元格出现换行,导致格式错乱

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:57:02