ExASIC
分享让工作更轻松

用python自动获取天气预报

国家气象局网站提供获取天气预报的API,直接返回json格式的天气数据。所以只需要从json里取出对应的字段就可以了。

先来看看API介绍和使用方法

下面是指定城市(县、区)天气的网址,直接打开网址,就会返回对应城市的天气数据。比如: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":""}}

这里可以获取到风向、风力、湿度等。

用python来提取天气

用两个函数来分别处理上面的两个网址返回的结果。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)

效果如下:

bearychat weather

阅读数:
更多文章:文章目录
解惑专区
(支持markdown插入源代码)
欢迎使用ExASIC订阅服务
仅用于ExASIC最新文章通知,方便及时阅读。
友情链接: IC技术圈问答ReCclayCrazyFPGA