视频中讲使用网站提供的JSON格式的API数据时用的是openweathermap,一个是国内的朋友用着不是那么方便,再一个返回的数据多是英文,很不直观,
所以网友叶叶菜就用百度的API做了个通过城市名查询天气的程序,中文输入中文显示哦
# 天气预报
import json
import requests
AK = '12345'
# 用自己百度的API key,替换掉12345,但是天气查询已经不提供新注册的用户了
# 按网站要求格式拼链接字串
def url_name(city_name):
api = 'http://api.map.baidu.com/telematics/v3/weather?location='
# api例子 'http://api.map.baidu.com/telematics/v3/weather?location=城市名字&output=APP Key'
full_url = api + city_name + '&output=json' + '&ak=' + AK
return full_url
# 主函数
while True:
print('\n{:=^40}'.format('欢迎进入天气查询系统'))
# {:=^40}是规定整个字串占40个字符的位置,'欢迎进入天气查询系统居中'居中(^),其他位置用'='填补上(=)
city = input('请输入您要查询的城市名称 / (按 Q 退出):').upper()
if city == 'Q':
print('您已退出天气查询系统!')
break
else:
url = url_name(city)
# 向服务器请求,返回服务器回应的Response对象
response = requests.get(url)
# 使用loads函数,将json字符串转换为字典类型
rs_dict = json.loads(response.text)
error_code = rs_dict['error']
# error为0,表示数据正常,否则没有查询到天气信息
if error_code == 0:
results = rs_dict['results']
# 从天气信息中取出results数据
city_name = results[0]['currentCity']
pm25 = results[0]['pm25']
print('当前城市>>> {} pm25值>>> {}'.
format(city_name, pm25))
# 取出天气信息
weather_data = results[0]["weather_data"]
# 循环取出每一天天气的小字典
for weather_dict in weather_data:
# 取出日期、天气、风级、温度
date = weather_dict['date'] # 日期
weather = weather_dict['weather'] # 天气
wind = weather_dict['wind'] # 风级
temperature = weather_dict['temperature'] # 温度
print('{0} | {1} | {2} | {3}'.
format(date, weather, wind, temperature))
# 数字对应后面的参数,类似于顺序索引
else:
print('没有查询到 {} 的天气信息!'.format(city))
运行结果:
但是百度天气查询已经不对新申请的开发者开放了,
我试用国内网站JSON在线提供的免费查询和预测天气服务,觉得很不错,至于能不能持续提供免费稳定天气查询服务的网站需要时间来验证。在搜索引擎上敲“天气查询API JSON”或“sojson在线”,找到SoJson在线的网站,这个网站无需APP Key就可以按照指定格式提取天气API数据。登陆SoJson在线网站后,点击网站最上面的“技术博客”菜单,找到“免费天气API,天气JSON API,不限次数获取五天的天气预报”这篇文章。阅读使用网站提供的如何免费使用天气API数据的说明,网页拉到最下面下载城市数据文件。网站提供输入城市代码查询预测天气的免费服务,所以要从下载的城市数据文件中取出跟输入的城市名对应的城市代码,而后按照要求拼接好向网站请求数据的链接:
按照天气API说明和网站返回的数据在叶叶菜的代码基础上写了个查询天气和PM值程序
# 天气查询预报和PM值
import json
import requests
from datetime import datetime
city_list_location = '/Users/PythonABC/Documents/python/city.json'
# json在线上获取的城市数据文件存放的位置+文件名字串,这里用了代表当前文件夹的'。'
# 到城市数据文件city.json中查找用户输入的城市名,获得城市代码
def get_city_ID(city_name): # 形参接收城市名
with open(city_list_location, encoding='utf-8') as city_file:
city_str = city_file.read()
city_list = json.loads(city_str)
for city in city_list:
if city['city_name'] == city_name:
return city['city_code'] # 返回城市代码
# 按网站要求拼接好请求数据的链接
def url_name(city_name):
findCityID = get_city_ID(city_name)
if findCityID is not None:
api = 'http://t.weather.sojson.com/api/weather/city/'
full_url = api + get_city_ID(city_name)
return full_url
else:
return None # 没找到城市对应的城市代码
while True:
print('\n{:=^40}'.format('欢迎进入天气查询系统'))
city = input('请输入您要查询的城市名称 / (按 Q 退出):').upper()
if city == 'Q':
print('您已退出天气查询系统!')
break
url = url_name(city)
# 调用函数构建向网站提请数据申请的链接字串
if url is None:
print('没有查询到对应的城市代码,请输入城市的中文名称,如厦门')
continue
response = requests.get(url)
# 向网站请求,返回网站回应的response对象
rs_dict = json.loads(response.text)
# 使用loads()将json字符串转换成字典类型
error_code = rs_dict['status']
# 根据网站的API接口说明,error为200表示数据正常,否则没有查询到天气信息
if error_code == 200:
# 对数据的处理完全由返回JSON的内部结构和键值决定
results = rs_dict.get('data')
city_name = rs_dict.get('city') # 城市
today = {
'date': rs_dict.get('date'), # 日期
'humidity': results.get('shidu'), # 湿度
'pm25': results.get('pm25'), # PM25
'pm10': results.get('pm10'), # PM10
'quality': results.get('quality'), # 空气质量
'comment': results.get('ganmao') # 健康提议
}
datestr = datetime.strptime(today['date'], '%Y%m%d').strftime('%Y-%m-%d')
# 网站回应的数据取出的today['date']是个字符串'20180725',引入datetime.strptime(today['date'], '%Y%m%d')
# 是为了把这个字符串变成日期对象,'%Y%m%d'是帮忙解释字符串:2018表示年;07月;25日
# 再通过日期对象的方法函数strftime()变成字符串,格式由参数'%Y-%m-%d'指定,即2018-07-25
print('当前城市>>> {} {}:'.format(city_name, datestr))
print('湿度:{humidity}; PM25:{pm25}; PM10:{pm10}; 空气质量:{quality}; 健康提议:{comment}'.format(**today))
# 字典变量按照占位符{}内的键值把值填进去
# 循环取出天气数据并输出
for weather_dict in results['forecast']:
# 取出日期、天气、风级、温度
date = weather_dict['date'] # 日期
weather = weather_dict['type'] # 天气
wind = weather_dict['fx'] + weather_dict['fl'] # 风向+风级
tempH = weather_dict['high'] # 温度
tempL = weather_dict['low'] # 温度
notice = weather_dict['notice'] # 注意事项
print('{} | {} | {} | {} | {} | {}'.format(date, weather, wind, tempH, tempL, notice))
else:
print('没有查询到 {} 的天气信息!'.format(city))
运行结果:
感觉查询速度要慢一些。
我在找免费天气API时发现了个实时查询PM值检测空气质量的网站: http://pm25.in/api_doc,
读到了下面这句话:
“为了让更多人更快更好的知道PM2.5,我们做了一个艰难的决定,决定无偿开放PM2.5数据接口,以方便更多的开发者使用!”,有点小感动。
本来想借着感动劲写个监测空气质量的代码,可惜感动劲没干过懒劲
有兴趣的同学可以自己试试,当练练手。最后得瑟下叶叶菜同学帮我给网站做的小图标: