You need to enable JavaScript to run this app. PRAW Reddit爬虫抓取时报'MoreComments'无created_utc属性求助
优惠活动
大模型
产品
解决方案
定价
更多

PRAW Reddit爬虫抓取时报'MoreComments'无created_utc属性求助

问题核心成因

你在评论遍历过程中碰到的'MoreComments' object has no attribute 'created_utc'报错,本质是PRAW返回的评论迭代器并非全是真实的评论实体:

  • 为了压缩单次接口请求的数据包体积,减少初始加载耗时,PRAW在评论分页加载的场景下会返回MoreComments类实例,作用是标记当前位置存在未加载的评论块,仅存储后续拉取评论需要的ID标识,本身不具备真实评论的时间、内容等属性
  • 小批量采集时恰好没有命中分页边界,返回的迭代器里全是Comment类真实对象,因此不会触发报错;采集量增大后必然会碰到分页节点上的MoreComments对象,直接访问其不存在的created_utc属性就会抛出AttributeError终止程序
可直接落地的修复方案
  • 第一步:基础类型过滤(最小改动量,适配你现在只采顶层评论的需求)
    在现有评论遍历的逻辑里,先做对象类型判断,碰到MoreComments实例直接跳过,不执行后续的属性读取操作,参考代码:
    from praw.models import Comment, MoreComments
    
    # 原有遍历评论的循环里加判断
    for c in submission.comments:
        # 跳过非真实评论的分页占位对象
        if isinstance(c, MoreComments):
            continue
        # 以下为原有业务逻辑,无需改动
        c_time = datetime.datetime.fromtimestamp(c.created_utc)
    
  • 第二步:如需采集完整的分页评论(覆盖原MoreComments块对应的评论内容)
    不要手动逐块拉取评论,直接调用PRAW内置的replace_more()方法批量将所有分页占位对象替换为真实的Comment实例,替换完成后再执行遍历逻辑,参考代码:
    # 参数说明:limit设为None代表拉取所有未加载的评论块,设为整数代表最多替换多少个分页块
    submission.comments.replace_more(limit=20, threshold=0)
    # 替换完成后生成的列表里全是真实Comment对象,不存在MoreComments实例
    for c in submission.comments.list():
        c_time = datetime.datetime.fromtimestamp(c.created_utc)
    
    注意:如果只需要顶层评论,建议把limit设为较小的数值(比如10-20),碰到评论量过万的热门帖子时,全量替换会大幅拉长采集时长,甚至触发Reddit接口限流。
  • 第三步:兜底容错优化
    针对属性读取的操作加异常捕获,即使漏过了个别非Comment对象,也不会导致整个程序中断,参考代码:
    try:
        c_time = datetime.datetime.fromtimestamp(c.created_utc)
    except AttributeError:
        continue
    
采集过程中的注意事项
  • 不需要递归遍历嵌套评论时,直接遍历submission.comments迭代器即可,不要主动拉取深层评论,减少不必要的接口请求
  • 大批量采集场景下,建议每处理10-20个帖子加1-3秒的随机延时,避免触发Reddit的访问频率限制
  • 导出CSV前可以加一层数据校验,确保爬取的评论字段非空,避免导出文件出现格式错乱

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.11 03:45:11