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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:22:20