Python - 尝试多次访问API时出错

时间:2018-04-29 17:29:38

标签: python attributeerror

我正在学校编程,很快就需要编写我的最后一部分。下面的程序(用python的编程语言编写)作为一个程序我只是为了练习访问API而编写。 我正在尝试基于游戏访问API。该程序的想法是每隔30秒检查一次这个API以检查数据的变化,通过在运行时立即存储到数据集('baseRank'和'basePP'),然后将这些数据与新数据进行比较30秒后 这是我的计划:

import time

apiKey = '###'
rankDifferences = []
ppDifferences = []
const = True

username = '- Legacy'
url = "https://osu.ppy.sh/api/get_user?u={1}&k={0}".format(apiKey,username)        
import urllib.request, json 
with urllib.request.urlopen(url) as url:
    stats = json.loads(url.read().decode())
stats = stats[0]

basePP = stats['pp_raw']
print(basePP)
baseRank = stats['pp_rank']
print(baseRank)

while const == True:
    time.sleep(30)
    import urllib.request, json 
    with urllib.request.urlopen(url) as url:
        check = json.loads(url.read().decode())
    check = check[0]

    rankDifference = baseRank + check['pp_rank']
    ppDifference = basePP + check['pp_raw']
    baseRank = check['pp_raw']
    basePP = check['pp_raw']

    if rankDifference != 0:
        print(rankDifference)

    if ppDifference != 0:
        print(ppDifference)`

请注意,在我写'apiKey ='###''的地方,我实际上使用的是一个真正的,有效的API密钥,但我隐藏了它,因为该网站要求你不要与你分享你的api密钥其他。 以下是运行后shell的状态:

  

5206.55

     

12045

     

追踪(最近一次呼叫最后一次):

     

文件“C:/ Users / ethan / Documents / osu API Accessor.py”,第23行,in      使用urllib.request.urlopen(url)作为url:    档案

     

“C:\ Users \ ethan \ AppData \ Local \ Programs \ Python \ Python36 \ lib \ urllib \ request.py”,>第223行,在urlopen中      return opener.open(url,data,timeout)

     

档案

     

“C:\ Users \ ethan \ AppData \ Local \ Programs \ Python \ Python36 \ lib \ urllib \ request.py”,>第518行,打开      protocol = req.type

     

AttributeError:'HTTPResponse'对象没有属性'type'

如您所见,它确实打印了'basePP'和'baseRank',证明我可以访问此API。问题似乎是当我第二次尝试访问它时。说实话,我不完全确定这个错误意味着什么..所以如果你不介意花时间解释和/或帮助解决这个错误,我们将不胜感激。

旁注:这是我第一次使用这个论坛,所以如果我做错了什么,我很抱歉!

1 个答案:

答案 0 :(得分:1)

问题似乎出现在:

with urllib.request.urlopen(url) as url:
    stats = json.loads(url.read().decode())

您对url变量的使用正在改变它,因此当您稍后尝试使用它时它无法正常工作。

尝试类似:

with urllib.request.urlopen(url) as page:
    stats = json.loads(page.read().decode())

它应该没问题。