Python 3.x urllib错误:请求太多
下面的python程序要求用户输入两个reddit用户名,并比较它们的分数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
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服务器通常会实现这一点,以避免一个编程糟糕的客户端(或恶意编程的客户端)陷入资源困境。啊,非常感谢您另外指出了这些缺陷。我会尽可能地重新编译代码,并尝试您的建议