使用PRAW爬取Reddit数据触发401错误如何完成身份认证
PRAW爬取Reddit返回401错误的解决方法
你遇到的ResponseException: received 401 HTTP response是典型的鉴权失败错误,核心原因是初始化PRAW实例时必填的应用凭证参数全部为空,没有通过Reddit的接口身份校验,和代码逻辑无关。
完整认证操作流程
不需要啃晦涩的OAuth2文档,按下面步骤操作就能拿到合法凭证:
- 登录你的Reddit账号,进入账号设置页面,找到「Apps」标签页,拉到页面最下方点击「create another app...」按钮
- 在弹出的创建表单里填对应信息:
- 应用名称自定义,方便自己识别即可
- 应用类型必须选
script(脚本类,专门给个人自用的爬取、自动化脚本用) - redirect uri字段直接填
http://localhost:8080即可,其余非必填字段可以留空 - 点击底部创建按钮,等待应用生成
- 复制生成的应用凭证,填到代码对应参数位:
- 应用名称下方的一串短随机字符是
client_id - 标注为
secret的字符串是client_secret user_agent按固定格式填写即可,参考格式:<运行系统>:<自定义应用名>:<版本号> (by /u/<你的Reddit用户名>),例如windows:ml_post_crawler:v1.0 (by /u/your_reddit_name),不要留空也不要写test、praw这类过于通用的字符串,容易被接口拦截- 注意:如果只是爬取公开子版块的公开内容,完全不需要填写
username和password参数,留空或者乱填反而会触发额外校验报错,直接删掉这两个参数即可
- 应用名称下方的一串短随机字符是
修正后可直接运行的代码(含存DataFrame/CSV逻辑)
import praw import pandas as pd # 替换成你自己拿到的真实凭证 reddit = praw.Reddit( client_id='你的client_id', client_secret='你的client_secret', user_agent='你自己按规则写的user_agent' ) post_list = [] # 拉取MachineLearning子版块的10条热帖 for post in reddit.subreddit('MachineLearning').hot(limit=10): post_list.append({ "帖子标题": post.title, "点赞数": post.score, "帖子链接": post.url, "发布时间": post.created_utc, "正文内容": post.selftext }) # 转DataFrame并存为CSV文件 df = pd.DataFrame(post_list) df.to_csv("reddit_ml_hot_posts.csv", index=False, encoding='utf-8-sig') print(f"爬取完成,共获取{len(df)}条数据,已保存到CSV文件")
常见踩坑排查
- 应用类型选错:如果创建时选了web app、installed app类型,用对应凭证走脚本模式鉴权会一直报401,必须选script类型
- 凭证同步延迟:刚创建完应用如果还是报401,等2-3分钟再重试,Reddit的凭证同步存在短时间延迟
- 账号问题:如果确实需要用账号权限(比如爬取自己关注的私有内容),填用户名密码前先确认账号没开启二次验证,开启二次验证的账号无法直接用密码登录鉴权
- IP拦截:如果短时间请求量过大,可能被临时限制IP,这种情况降低请求频率即可
内容的提问来源于stack exchange,提问作者Shehzadi Aziz
相关产品推荐
相关产品推荐

