【问题标题】:urllib error: Too many requestsurllib 错误:请求过多
【发布时间】:2018-05-21 08:42:13
【问题描述】:

下面的 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 包含超过特定限制的数据量?但这听起来仍然很荒谬,因为它并没有那么多数据。

谢谢。

【问题讨论】:

  • 您尝试请求的 URL 是速率限制的。当您达到速率限制时,服务器将发送“429: Too Many Requests”。您将不得不考虑如何发送更少的请求或如何在代码中包含冷却时间。阅读有关 reddit 的速率限制,我相信他们已经记录了。
  • @Tomalak 哦,那么每个网站的请求数都有限制吗?我不知道。如果是这样,谢谢!
  • 是的。 Web 服务器通常会实现这一点,以避免一个编程不良的客户端(或恶意编程的客户端)陷入资源困境。

标签: python-3.x urllib


【解决方案1】:

当您在请求中提供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-block 中提出异常?这将结束程序,但您似乎不希望它结束​​,查看以下代码:

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

【讨论】:

  • 啊,非常感谢您也指出了这些缺陷。我会尽可能重新编译代码并尝试您的建议
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-07
  • 2021-07-31
  • 2019-10-04
相关资源
最近更新 更多