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
相关产品推荐
相关产品推荐

