Python Reddit用户分数对比程序遇429请求过多错误求助
解决Reddit API 429 Too Many Requests错误
嘿,这个429错误本质是Reddit的速率限制机制在起作用——未认证的匿名请求会被严格限流,而且你的代码还存在几个小问题加重了这个情况,我来一步步帮你解决:
为什么会触发429?
- Reddit要求所有API请求必须携带合法的
User-Agent头,没有的话会被判定为恶意机器人,直接触发限流。 - 你的代码里
count变量逻辑错误:初始设为2,每次循环还count +=1,导致while count永远为真,会无限请求直到被限流。 - 未处理重试逻辑,遇到限流直接抛出错误,没有等待恢复的机会。
解决方案1:修复现有代码(添加请求头+修正逻辑+重试)
修改你的代码,添加User-Agent,修正循环逻辑,并实现简单的重试机制:
import json import time from urllib import request, error def obtainKarma(users_data): users_info = [] for user_data in users_data: data = json.load(user_data) posts = data["data"]["children"] scores = [post["data"]["score"] for post in posts] comments = [post["data"]["num_comments"] for post in posts] users_info.append((scores, comments)) for idx, (scores, comments) in enumerate(users_info, 1): print(f"User {idx}") print(f"Scores: {scores}") print(f"Number of comments: {comments}\n") def getUserInfo(): target_users = 2 # 要获取的用户数量 users_data = [] while len(users_data) < target_users: username = input("Please enter username:\n") url = f"https://reddit.com/user/{username}.json" # 添加合法的User-Agent,替换成你的用户名/项目名 headers = { "User-Agent": "KarmaComparisonTool/1.0 (by your_username)" } req = request.Request(url, headers=headers) try: user_data = request.urlopen(req) users_data.append(user_data) except error.HTTPError as e: if e.code == 429: # 获取重试等待时间,默认等10秒 retry_after = int(e.headers.get("Retry-After", 10)) print(f"Too many requests! Waiting {retry_after} seconds...") time.sleep(retry_after) elif e.code == 404: print("No such user. Please retry.\n") else: print(f"Error: {e}") raise obtainKarma(users_data) if __name__ == '__main__': getUserInfo()
解决方案2:使用PRAW库(推荐,更简洁稳定)
PRAW是Reddit官方维护的Python库,自动处理速率限制、认证和请求重试,省去很多麻烦:
步骤1:安装PRAW
pip install praw
步骤2:编写代码
import praw def get_user_karma(user): scores = [] comments_count = [] # 获取用户最近的帖子(默认100条,可调整) for submission in user.submissions.new(limit=None): scores.append(submission.score) comments_count.append(submission.num_comments) return scores, comments_count def compare_users(): # 初始化PRAW,这里用匿名模式(也可以创建自己的API密钥提升限流额度) reddit = praw.Reddit( user_agent="KarmaComparisonTool/1.0 (by your_username)", client_id="YOUR_CLIENT_ID", # 可选,有密钥的话限流更松 client_secret="YOUR_CLIENT_SECRET" ) users = [] while len(users) < 2: username = input("Please enter username:\n") try: user = reddit.redditor(username) # 验证用户存在 user.id users.append(user) except Exception: print("No such user. Please retry.\n") for idx, user in enumerate(users, 1): scores, comments = get_user_karma(user) print(f"User {idx} ({user.name})") print(f"Scores: {scores}") print(f"Number of comments: {comments}\n") if __name__ == '__main__': compare_users()
提示:如果需要更高的请求额度,可以去Reddit开发者平台创建一个应用,获取
client_id和client_secret,这样限流会宽松很多。
内容的提问来源于stack exchange,提问作者Huzo
相关产品推荐
相关产品推荐

