如何使用grequest从多个网址打印相同的字典对象?

时间:2017-08-08 17:03:41

标签: python json api grequests

我有一个所有使用相同json结构的URL列表。我试图通过grequest立即从所有URL中提取特定的字典对象。虽然我正在使用请求,但我能够使用一个URL:

import requests
import json

main_api = 'https://bittrex.com/api/v1.1/public/getorderbook?market=BTC-1ST&type=both&depth=50'

json_data = requests.get(main_api).json()    

Quantity = json_data['result']['buy'][0]['Quantity']
Rate = json_data['result']['buy'][0]['Rate']
Quantity_2 = json_data['result']['sell'][0]['Quantity']
Rate_2 = json_data['result']['sell'][0]['Rate']

print ("Buy")
print(Rate)
print(Quantity)
print ("")
print ("Sell")
print(Rate_2)
print(Quantity_2)

我希望能够为每个网址打印上面打印的内容。但我不知道从哪里开始。这就是我到目前为止所做的:

import grequests
import json


urls = [
    'https://bittrex.com/api/v1.1/public/getorderbook?market=BTC-1ST&type=both&depth=50',
    'https://bittrex.com/api/v1.1/public/getorderbook?market=BTC-2GIVE&type=both&depth=50',
    'https://bittrex.com/api/v1.1/public/getorderbook?market=BTC-ABY&type=both&depth=50',
]


requests = (grequests.get(u) for u in urls)
responses = grequests.map(requests)

我认为它会像print(response.json(['result']['buy'][0]['Quantity'] for response in responses)),但根本不起作用,python会返回以下内容:print(responses.json(['result']['buy'][0]['Quantity'] for response in responses)) AttributeError: 'list' object has no attribute 'json'。我是python的新手,也是一般的编码,我很感激任何帮助。

1 个答案:

答案 0 :(得分:1)

您的responses变量是Response个对象的列表。如果您使用

简单打印列表
print(responses)

它给你

[<Response [200]>, <Response [200]>, <Response [200]>]

括号[]告诉您这是一个列表,它包含三个Response个对象。

当您键入responses.json(...)时,您告诉python在列表对象上调用json()方法。但是,该列表不提供这样的方法,只有列表中 in 的对象才有。

您需要做的是访问列表中的元素并在此元素上调用json()方法。这是通过指定要访问的列表元素的位置来完成的,如下所示:

print(responses[0].json()['result']['buy'][0]['Quantity'])

这将访问responses列表中的第一个元素。

当然,如果要输出许多项目,单独访问每个列表元素是不切实际的。这就是为什么有循环的原因。使用循环你可以简单地说:对我列表中的每个元素执行此操作。这看起来像这样:

for response in responses:
    print("Buy")
    print(response.json()['result']['buy'][0]['Quantity'])
    print(response.json()['result']['buy'][0]['Rate'])
    print("Sell")
    print(response.json()['result']['sell'][0]['Quantity'])
    print(response.json()['result']['sell'][0]['Rate'])
    print("----")

for-each-loops为列表中的每个元素执行缩进的代码行。 response变量中提供了当前元素。