Вам просто нужно правильно установить полезную нагрузку.
Это поможет.
import requests
from pprint import pprint
url = "https://data.rcc-acis.org/StnMeta"
payload = {
"output": "json",
"params": {"elems":[{"name":"maxt","add":"t"},{"name":"mint","add":"t"},{"name":"pcpn","add":"t"},{"name":"snow","add":"t"},{"name":"snwd","add":"t"}],"sDate":"2018-06-01","eDate":"2018-06-29","meta":["name","state","ll","sids"],"bbox":[-74.44262803978918,40.4207924883181,-73.48808216021084,41.144936911681896]}
}
r = requests.post(url, json=payload)
data = r.json()
Объект с именем data теперь будет состоять из списка диктов для каждого места, в котором есть данные о погоде. Каждый диктованный содержит, помимо прочего, sid, который вам нужен для подачи к конечной точке, которая возвращает фактические данные о погоде.
Каждый дикт будет выглядеть так:
{'ll': [-74.42259, 40.47282],
'name': 'NEW BRUNSWICK 3 SE',
'sids': ['286055 2', 'USC00286055 6', 'NBRN4 7'],
'state': 'NJ'}
Предполагая, что вы хотите пройти через все эти циклы и вернуть данные о погоде для каждого, вам сначала нужно получить sid и сохранить их в списке
Некоторые из них не содержат данных о погоде. Они будут выглядеть так:
"US1NJES0018 6"
... в то время как те, у кого есть данные о погоде, не имеют букв в них. Это можно использовать с помощью регулярного выражения, чтобы отфильтровать все sid с буквами в них.
Итак, добавьте это к коду:
import re # the regex library
sids_list = []
is_garbage = re.compile('[a-zA-z]+') # will match everything with a letter in
meta = data['meta']
for m in meta:
name = m['name']
sid = m['sids'][0]
if not is_garbage.search(sid):
sids_list.append([name,sid])
Теперь, когда у вас есть список sid, все, что вам нужно сделать, это использовать правильную полезную нагрузку до конечной конечной точки, установить даты, для которых вы хотите получить данные, - и запустить цикл.
start_date = "2018-06-01"
end_date = "2018-07-01"
for name, sid in sids_list:
print("------------- DATA FOR {} (sid: {}) -------------".format(name,sid))
print()
payload2 = {
"params": {
"elems":
[
{"name":"maxt","add":"t"},
{"name":"mint","add":"t"},
{"name":"pcpn","add":"t"},
{"name":"snow","add":"t"},
{"name":"snwd","add":"t"}
],
"sid": sid,
"sDate":start_date,
"eDate":end_date},
"output": "json"
}
weather_url = "https://data.rcc-acis.org/StnData"
r = requests.post(weather_url, json=payload2)
weather_data = r.json()['data']
print("{:15}{:15}{:15}{:15}{:15}{:15}".format("Date", "MaxTemperature", "MinTemperature", "Precipitation", "Snowfall", "SnowDepth"))
for Date, MaxTemperature, MinTemperature, Precipitation, Snowfall, SnowDepth in weather_data:
print("{:15}{:15}{:15}{:15}{:15}{:15}".format(Date, MaxTemperature[0], MinTemperature[0], Precipitation[0], Snowfall[0], SnowDepth[0]))
print()
Здесь я просто печатаю данные на экране в хорошо отформатированном виде. Надеюсь, это решит вашу проблему. Приветствия.