国家气象局网站提供获取天气预报的API,直接返回json格式的天气数据。所以只需要从json里取出对应的字段就可以了。
下面是指定城市(县、区)天气的网址,直接打开网址,就会返回对应城市的天气数据。比如:http://www.weather.com.cn/data/cityinfo/101021200.html上海徐汇区对应的天气网址。
[user@host test] $ curl http://www.weather.com.cn/data/cityinfo/101021200.html
{"weatherinfo":{"city":"徐汇","cityid":"101021200","temp1":"6℃","temp2":"16℃","weather":"多云","img1":"d1.gif","img2":"n1.gif","ptime":"18:00"}}
可以看出基本的天气信息都已经包含了,最低温度6度、最高温度16度、多云等。但是没有风向、风力。所以,我们再看另一个网址:http://www.weather.com.cn/data/sk/101021200.html。
[user@host test] $ curl http://www.weather.com.cn/data/sk/101021200.html
{"weatherinfo":{"city":"徐家汇","cityid":"101021200","temp":"23.5","WD":"东北风","WS":"小于3级","SD":"80%","AP":"1006.4hPa","njd":"2903","WSE":"<3","time":"17:00","sm":"1.1","isRadar":"0","Radar":""}}
这里可以获取到风向、风力、湿度等。
用两个函数来分别处理上面的两个网址返回的结果。get_weather_city(url)
来处理基本天气信息,再用get_weather_wind(url)
来处理风向、风力。
import requests
import json
import logging as log
def get_weather_city(url):
# open url and get return data
r = requests.get(url)
if r.status_code != 200:
log.error("Can't get weather data!")
# convert string to json
info = json.loads(r.content.decode())
# get useful data
data = info['weatherinfo']
city = data['city']
temp1 = data['temp1']
temp2 = data['temp2']
weather = data['weather']
return "{} {} {}~{}".format(city, weather, temp1, temp2)
def get_weather_wind(url):
r = requests.get(url)
if r.status_code != 200:
log.error("Can't get weather data!")
info = json.loads(r.content.decode())
# get wind data
data = info['weatherinfo']
WD = data['WD']
WS = data['WS']
return "{}({})".format(WD, WS)
我们写一个测试程序,同时获取上海徐汇(公司)和松江(居住小区)的天气。
if __name__ == '__main__':
msg = """**天气提醒**:
{} {}
{} {}
来源: 国家气象局
""".format(
get_weather_city('http://www.weather.com.cn/data/cityinfo/101021200.html'),
get_weather_wind('http://www.weather.com.cn/data/sk/101021200.html'),
get_weather_city('http://www.weather.com.cn/data/cityinfo/101020900.html'),
get_weather_wind('http://www.weather.com.cn/data/sk/101020900.html')
)
print(msg)
结果显示如下:
**天气提醒**:
徐汇 多云 6℃~16℃ 东北风(小于3级)
松江 大雨转小到中雨 19℃~23℃ 东风(小于3级)
来源: 国家气象局
bearychat的介绍和代码请参考:用python实现一个通知机器人
import bearychat
import weather
if __name__ == '__main__':
msg = """**天气提醒**:
{} {}
{} {}
来源: 国家气象局
""".format(
weather.get_weather_city('http://www.weather.com.cn/data/cityinfo/101021200.html'),
weather.get_weather_wind('http://www.weather.com.cn/data/sk/101021200.html'),
weather.get_weather_city('http://www.weather.com.cn/data/cityinfo/101020900.html'),
weather.get_weather_wind('http://www.weather.com.cn/data/sk/101020900.html')
)
bearychat.send_notice(msg)
效果如下: