Python 3.x urllib错误:请求太多

Python 3.x urllib错误:请求太多,python-3.x,urllib,Python 3.x,Urllib,下面的python程序要求用户输入两个reddit用户名,并比较它们的分数 import json from urllib import request def obtainKarma(users_data): users_info = [] for user_data in users_data: data = json.load(user_data) posts = data["data"]["children"] nu

下面的python程序要求用户输入两个reddit用户名,并比较它们的分数

import json 
from urllib import request

def obtainKarma(users_data):

    users_info = []
    for user_data in users_data:
        data = json.load(user_data)
        posts = data["data"]["children"]

        num_posts = len(posts)

        scores = []
        comments = []

        for post_id in range(num_posts):
            score = posts[post_id]["data"]["score"]
            comment = posts[post_id]["num_comments"]

            scores.append(score)
            comments.append(comment)

        users_info.append((scores,comments))


    user_id = 0
    for user_info in users_info:
        user_id+=1

        print("User"+str(user_id))
        for user_attr in user_info:
            print(user_attr)




def getUserInfo():

    count = 2

    users_data = []

    while count:
        count = count + 1

        username = input("Please enter username:\n")
        url = "https://reddit.com/user/"+username+".json"

        try:
            user_data = request.urlopen(url)
        except:
                print("No such user.\nRetry Please.\n")
                count = count + 1
                raise

        users_data.append(user_data)

    obtainKarma(users_data)

if __name__ == '__main__':
    getUserInfo()
但是,当我运行程序并输入用户名时,会出现一个错误:

raise HTTPError(req.full_url, code, msg, hdrs, fp)
urllib.error.HTTPError: HTTP Error 429: Too Many Requests
我试图寻找类似的问题,但他们都不满足于解决这个具体问题。看看这个错误,可以说URL包含的数据量超过了特定的限制?但这听起来仍然很荒谬,因为这并不是一个很大的数据


谢谢。

当您在请求中提供
用户代理时,问题似乎已得到解决

import json
from urllib import request

def obtainKarma(users_data):

    users_info = []
    for user_data in users_data:
        data = json.loads(user_data) # I've changed 'json.load' to 'json.loads' because you want to parse a string, not a file
        posts = data["data"]["children"]

        num_posts = len(posts)

        scores = []
        comments = []

        for post_id in range(num_posts):
            score = posts[post_id]["data"]["score"]
            comment = posts[post_id]["data"]["num_comments"] # I think you forgot '["data"]' here, so I added it

            scores.append(score)
            comments.append(comment)

        users_info.append((scores,comments))


    user_id = 0
    for user_info in users_info:
        user_id+=1

        print("User"+str(user_id))
        for user_attr in user_info:
            print(user_attr)




def getUserInfo():

    count = 2

    users_data = []

    while count:
        count = count + 1

        username = input("Please enter username:\n")
        url = "https://reddit.com/user/"+username+".json"

        user_data = None

        try:
            req = request.Request(url)
            req.add_header('User-Agent', 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)')
            resp = request.urlopen(req)
            user_data = resp.read().decode("utf-8")
        except Exception as e:
                print(e)
                print("No such user.\nRetry Please.\n")
                count = count + 1
                raise # why raise? --> Program will end if user is not found

        if user_data:
              print(user_data)
              users_data.append(user_data)

    obtainKarma(users_data)


if __name__ == '__main__':
    getUserInfo()
您的代码还有其他问题:

您不应该编写
json.load(user_data)
,因为您正在解析
字符串。所以我把它改为使用
json.loads(user\u data)

json.loads的Python声明:

使用此转换表将s(包含JSON文档的str实例)反序列化为Python对象

在代码
comment=posts[post\u id][“num\u comments”]
中,我想你忘了索引
'data'
,所以我把它改为
comment=posts[post\u id][“data”][“num\u comments”]

为什么要在
except
-块中引发异常?通过查看以下代码,这将结束程序,但您似乎认为不会结束:


print(“没有这样的用户。\n请重试。\n”)

您尝试请求的URL已被限制。当您达到速率限制时,服务器将发送“429:太多请求”。您必须考虑如何发送更少的请求,或者如何在代码中包含一个冷却期。阅读reddit的费率限制,我相信他们已经记录在案。@Tomalak哦,那么每个网站的请求都有一个限制?我不知道。如果是这样,谢谢!对Web服务器通常会实现这一点,以避免一个编程糟糕的客户端(或恶意编程的客户端)陷入资源困境。啊,非常感谢您另外指出了这些缺陷。我会尽可能地重新编译代码,并尝试您的建议