这篇文章我们将使用 requests 调用天气查询接口,实现一个天气查询的小模块,下面先贴上最终的效果图


现有接口查询格式:

其中,city_code 为城市代号

接口返回数据格式:

>>> import requests

>>> import pprint # 用于格式化打印字典类型数据

>>> url = 'http://t.weather.sojson.com/api/weather/city/101280101'

>>> response = requests.get(url)

>>> pprint.pprint(response.json())

{'cityInfo': {'city': '广州市',

'cityId': '101280101',

'parent': '广东',

'updateTime': '18:24'},

'data': {'forecast': [{'aqi': 20.0,

'date': '10',

'fl': '<3级',

'fx': '无持续风向',

'high': '高温 17.0℃',

'low': '低温 12.0℃',

'notice': '雨虽小,注意保暖别感冒',

'sunrise': '06:43',

'sunset': '18:34',

'type': '小雨',

'week': '星期日',

'ymd': '2019-03-10'},

{'aqi': 36.0,

'date': '11',

'fl': '<3级',

'fx': '无持续风向',

'high': '高温 21.0℃',

'low': '低温 12.0℃',

'notice': '阴晴之间,谨防紫外线侵扰',

'sunrise': '06:42',

'sunset': '18:34',

'type': '多云',

'week': '星期一',

'ymd': '2019-03-11'},

{'aqi': 58.0,

'date': '12',

'fl': '<3级',

'fx': '无持续风向',

'high': '高温 23.0℃',

'low': '低温 13.0℃',

'notice': '愿你拥有比阳光明媚的心情',

'sunrise': '06:41',

'sunset': '18:35',

'type': '晴',

'week': '星期二',

'ymd': '2019-03-12'},

{'aqi': 73.0,

'date': '13',

'fl': '<3级',

'fx': '无持续风向',

'high': '高温 22.0℃',

'low': '低温 14.0℃',

'notice': '阴晴之间,谨防紫外线侵扰',

'sunrise': '06:40',

'sunset': '18:35',

'type': '多云',

'week': '星期三',

'ymd': '2019-03-13'},

{'aqi': 65.0,

'date': '14',

'fl': '<3级',

'fx': '无持续风向',

'high': '高温 20.0℃',

'low': '低温 14.0℃',

'notice': '记得随身携带雨伞哦',

'sunrise': '06:39',

'sunset': '18:36',

'type': '中雨',

'week': '星期四',

'ymd': '2019-03-14'},

{'aqi': 42.0,

'date': '15',

'fl': '<3级',

'fx': '无持续风向',

'high': '高温 21.0℃',

'low': '低温 14.0℃',

'notice': '阴晴之间,谨防紫外线侵扰',

'sunrise': '06:38',

'sunset': '18:36',

'type': '多云',

'week': '星期五',

'ymd': '2019-03-15'},

{'date': '16',

'fl': '<3级',

'fx': '无持续风向',

'high': '高温 22.0℃',

'low': '低温 15.0℃',

'notice': '阴晴之间,谨防紫外线侵扰',

'sunrise': '06:37',

'sunset': '18:36',

'type': '多云',

'week': '星期六',

'ymd': '2019-03-16'},

{'date': '17',

'fl': '<3级',

'fx': '无持续风向',

'high': '高温 23.0℃',

'low': '低温 16.0℃',

'notice': '阴晴之间,谨防紫外线侵扰',

'sunrise': '06:36',

'sunset': '18:37',

'type': '多云',

'week': '星期日',

'ymd': '2019-03-17'},

{'date': '18',

'fl': '<3级',

'fx': '东北风',

'high': '高温 22.0℃',

'low': '低温 17.0℃',

'notice': '雨虽小,注意保暖别感冒',

'sunrise': '06:35',

'sunset': '18:37',

'type': '小雨',

'week': '星期一',

'ymd': '2019-03-18'},

{'date': '19',

'fl': '<3级',

'fx': '东南风',

'high': '高温 25.0℃',

'low': '低温 19.0℃',

'notice': '雨虽小,注意保暖别感冒',

'sunrise': '06:34',

'sunset': '18:38',

'type': '小雨',

'week': '星期二',

'ymd': '2019-03-19'},

{'date': '20',

'fl': '<3级',

'fx': '东北风',

'high': '高温 25.0℃',

'low': '低温 17.0℃',

'notice': '雨虽小,注意保暖别感冒',

'sunrise': '06:33',

'sunset': '18:38',

'type': '小雨',

'week': '星期三',

'ymd': '2019-03-20'},

{'date': '21',

'fl': '<3级',

'fx': '北风',

'high': '高温 18.0℃',

'low': '低温 15.0℃',

'notice': '雨虽小,注意保暖别感冒',

'sunrise': '06:32',

'sunset': '18:38',

'type': '小雨',

'week': '星期四',

'ymd': '2019-03-21'},

{'date': '22',

'fl': '<3级',

'fx': '东北风',

'high': '高温 20.0℃',

'low': '低温 16.0℃',

'notice': '雨虽小,注意保暖别感冒',

'sunrise': '06:31',

'sunset': '18:39',

'type': '小雨',

'week': '星期五',

'ymd': '2019-03-22'},

{'date': '23',

'fl': '<3级',

'fx': '东风',

'high': '高温 23.0℃',

'low': '低温 18.0℃',

'notice': '雨虽小,注意保暖别感冒',

'sunrise': '06:30',

'sunset': '18:39',

'type': '小雨',

'week': '星期六',

'ymd': '2019-03-23'},

{'date': '24',

'fl': '<3级',

'fx': '东南风',

'high': '高温 26.0℃',

'low': '低温 21.0℃',

'notice': '雨虽小,注意保暖别感冒',

'sunrise': '06:29',

'sunset': '18:39',

'type': '小雨',

'week': '星期日',

'ymd': '2019-03-24'}],

'ganmao': '各类人群可自由活动',

'pm10': 22.0,

'pm25': 15.0,

'quality': '优',

'shidu': '81%',

'wendu': '15',

'yesterday': {'aqi': 20.0,

'date': '09',

'fl': '3-4级',

'fx': '北风',

'high': '高温 17.0℃',

'low': '低温 13.0℃',

'notice': '出门最好穿雨衣,勿挡视线',

'sunrise': '06:44',

'sunset': '18:33',

'type': '大雨',

'week': '星期六',

'ymd': '2019-03-09'}},

'date': '20190310',

'message': 'Success !',

'status': 200,

'time': '2019-03-10 19:00:00'}

完整代码:

需要比之前的多一个步骤,就是将城市名字映射为城市代号进行查询

import json

import requests

def readFile():

with open('_city.json','r',encoding='UTF-8') as f:

data = json.load(f)

return data

def getCode(data,city_name):

result = [item['city_code'] for item in data if item['city_name'] == str(city_name)]

if result:

city_code = result[0]

else:

city_code = None

return city_code

def getWeather(city_code):

url = 'http://t.weather.sojson.com/api/weather/city/' + str(city_code)

response = requests.get(url)

content = response.json()

if content['message']=='Success !' :

result = content['data']

else:

result = None

return result

def showResult(result,day):

for i in range(day):

print('----------' + result['forecast'][i]['ymd'] + ' ' + result['forecast'][i]['week'] + '----------')

print('天气类型:' + result['forecast'][i]['type'])

print('最高温度:' + result['forecast'][i]['high'])

print('最低温度:' + result['forecast'][i]['low'])

print('风力:' + result['forecast'][i]['fl'])

print('风向:' + result['forecast'][i]['fx'])

print('日出时间:' + result['forecast'][i]['sunrise'])

print('日落时间:' + result['forecast'][i]['sunset'])

print('温馨提示:' + result['forecast'][i]['notice'])

if __name__ == '__main__':

data = readFile()

while True :

print('---------------查询参数---------------')

city_name = input('城市名称:')

city_code = getCode(data,city_name)

if not city_code:

print('输入错误,请重新输入')

continue

result = getWeather(city_code)

if not result:

print('查询错误,请重新输入')

continue

day = input('查询天数:')

if not day.isdigit():

print('查询天数必须是数字,请重新输入')

continue

if not 0 <= int(day) <= 15:

print('查询天数必须小于十五天,请重新输入')

continue

showResult(result,int(day))