urllib错误:请求太多

时间:2018-05-21 08:42:14

标签: 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"]

        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包含超出特定限制的数据量是否有意义?但这仍然听起来很荒谬,因为它不是那么多数据。

感谢。

1 个答案:

答案 0 :(得分:3)

当您向User-Agent提供请求时,问题似乎已得到解决。

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),因为您正在解析string。所以我将其更改为使用json.loads(user_data)

json.loads的Python documentation状态:

  

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

在代码comment = posts[post_id]["num_comments"]中,我认为您忘记在'data'上编号,因此我将其更改为comment = posts[post_id]["data"]["num_comments"]

你为什么要在except - 块中提出异常?这将结束程序,但看起来你不希望看到以下代码:

print("No such user.\nRetry Please.\n")