无法从API检索数据

时间:2018-02-18 04:10:10

标签: python python-3.x api

我试图从以下API中检索价格数据,但在执行代码时我不断收到此错误消息。

def upbitask_xrp_krw_get():
    result = requests.get("https://crix-api-endpoint.upbit.com/v1/crix/candles/minutes/1?code=CRIX.UPBIT.KRW-XRP&count=1").json()
    return result["highPrice"]

我得到的错误信息是

Traceback (most recent call last):
  File "test.py", line 194, in <module>
main()
  File "test.py", line 130, in main
upbitask_xrp_krw = Decimal(upbitask_xrp_krw_get())
  File "test.py", line 10, in upbitask_xrp_krw_get
"https://crix-api-endpoint.upbit.com/v1/crix/candles/minutes/1?code=CRIX.UPBIT.KRW-XRP&count=1").json()
  File "/usr/lib/python3/dist-packages/requests/models.py", line 793, in json
return json.loads(self.text, **kwargs)
  File "/usr/lib/python3.4/json/__init__.py", line 318, in loads
return _default_decoder.decode(s)
  File "/usr/lib/python3.4/json/decoder.py", line 343, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "/usr/lib/python3.4/json/decoder.py", line 361, in raw_decode
raise ValueError(errmsg("Expecting value", s, err.value)) from None
ValueError: Expecting value: line 1 column 1 (char 0)

我已成功访问其他只有{}括号的API的数据,而这个有[]括号,我认为这是问题吗?

4 个答案:

答案 0 :(得分:0)

我不确定你为什么会收到这个错误,但你可以通过在请求文本上调用json.loads()来绕过它:

result = requests.get("https://crix-api-endpoint.upbit.com/v1/crix/candles/minutes/1?code=CRIX.UPBIT.KRW-XRP&count=1")
result_text = result.text
json_data = json.loads(result_text)
return json_data[0]["highPrice"]

但是,您需要import json。此外,您需要从列表中取出字典(因此[0])。

编辑:这实际上很奇怪:有时它会打印出结果,有时会产生错误。这可能与请求在很短的时间内不同有关。

答案 1 :(得分:0)

要使用requests模块,您需要先在脚本中导入它。对于您希望使用的任何Python模块都是如此。

API端点返回的对象似乎是一个JSON列表,而不仅仅是一个JSON对象。试试这个:

import requests

def upbitask_xrp_krw_get():
    result = requests.get("https://crix-api-endpoint.upbit.com/v1/crix/candles/minutes/1?code=CRIX.UPBIT.KRW-XRP&count=1").json()
    return result[0]["highPrice"]

[0]表示返回列表的第一项。

结果如下:

enter image description here

<强>更新

似乎有一个速率限制阻止经常查询API。达到限制后,您将获得403响应代码。以下是如何管理它的示例:

import requests

def upbitask_xrp_krw_get():
  result = requests.get("https://crix-api-endpoint.upbit.com/v1/crix/candles/minutes/1?code=CRIX.UPBIT.KRW-XRP&count=1")
  if result.status_code == 200:  # Http code 200 means success
    json = result.json()
    high_price = json[0]["highPrice"]
  else:
    high_price = None

return high_price

答案 2 :(得分:0)

我相信这可能会更好:

Child

您的结果是json数据列表。只需要在返回值中选择所需的索引。

编辑:哦,整洁,后续请求后有不同的结果。必须有某种速率限制,第一次点击API我得到列表,下次我点击它我只得到403响应

答案 3 :(得分:0)

我只是python的初学者,我做了一些研究,这对我有用

import json
    import requests
    url ='https://crix-api-endpoint.upbit.com/v1/crix/candles/minutes/1?code=CRIX.UPBIT.KRW-XRP&count=1'
    response = requests.get(url)
    data = response.json()
    print(data[0]['code'])

这对我有用

enter image description here

谢谢,