社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

用python获取天气数据,并作定时播报

数据挖掘入门与实战 • 8 年前 • 1335 次点击  



数据挖掘入门与实战  公众号: datadw


思路
1.调用和风天气的API,获取天气数据
2.用百度语音API,将天气数据合成语音
3.用树莓派每天早上定时播报天气(定时任务crontab + Python脚本 + mpg123播放器)


Python知识点
1.使用urllib2库;
2.Python处理json数据;
3.linux的定时任务crontab。


实现
第一步、用和风天气API获取天气数据

城市接口: https://api.heweather.com/x3/weather?cityid=城市ID&key=你的认证key

2016-11-08 和风天气的API11月初改版了,所以上述接口地址需要更换成新的,看了下就加了个“free-”,后面代码加上就好了。




接口地址变了
首先得注册登录和风天气http://www.heweather.com/documents/api 获得key,在城市代码里面找到想要查的城市ID,以北京为例:CN101010100



先不着急写码,我们用API调试工具试试这个接口,看看返回的是什么数据。
我用的是chrome下postman,打开postman,输入接口链接:
https://api.heweather.com/x3/weather?cityid=CN101010100&key=这里填你的key

API调试工具
返回的是JSON格式的,现在用Python调用一下这个接口试试:

# -*- coding: utf-8 -*-
import urllib2
#调用和风天气的API
url = 'https://api.heweather.com/x3/weather?cityid=CN101010100&key=你的key'
#用urllib2创建一个请求并得到返回结果
req = urllib2.Request(url)
resp = urllib2.urlopen(req).read()
print resp

python返回的数据

这堆乱七八糟的是什么鬼,没法看,我们就用postman看看结构就好了。
    JSON表示的对象就是标准的JavaScript语言的对象,JSON和Python内置的数据类型有着对应关系如下:

Python内置数据类型和JSON的对应关系




Python内置的json模块提供了非常完善的Python对象到JSON格式的转换。我们用loads()方法把JSON反序列化为Python对象

#将JSON转化为Python的数据结构
json_data = json.loads(resp)
print json_data




结果发现数据变成了u'XXXXX'的格式,这是因为反序列化得到的所有字符串对象默认都是unicode编码的。

结果
我们此时已经将天气数据拿到,并且反序列化为Python对象了,只有提取我们需要的数据即可。看下天气API提供哪些数据
postman上的JSON结构

我就每天早上听一下今天的气温、风力、pm2.5、穿衣建议就好了。
现在以获得pm2.5的值为例,一层层获取到pm2.5的值

pm2.5的值


上面说了JSON里面{}对应的是Python的dict,[]对应的是Python里的list,上图中可以比较清楚地知道这个JSON得到的Python数据其实是dict和list的多层嵌套。这里我们可以类比查《新华字典》,想要查到“天气”这个词,可以找到字母T的页码(按A~Z的有序列表),再找到“tian”所在的位置,一步步往里找就成找到想要的词了。

最外层是个dict类型:
dict: {'HeWeather...": [ list]}
往里一层是多个dict,直接通过多层dict['key']['key2']...就能取得PM2.5的值了:
list 只有一个值,取list[0] (它的值是一个dict),取得天气只需要

print json_data['HeWeather data service 3.0'][0]['aqi']['city']['pm25']

下面是完整的获取天气数据的代码,这里其实只是为了实现功能,其实可以完善的地方很多:

# -*- coding: utf-8 -*-
import sys,urllib2, json

reload(sys) # Python2.5 初始化后会删除 sys.setdefaultencoding 这个方法,我们需要重新载入
sys.setdefaultencoding('utf-8') #这个是解决合成中文文本的时候,Unicode和utf-8编码问题的,可以尝试注释掉会不会报错

#调用和风天气的API
url = 'https://api.heweather.com/x3/weather?cityid=CN101010100&key=替换成你的KEY'
req = urllib2.Request(url)
resp = urllib2.urlopen(req).read()

#将JSON转化为Python的数据结构
json_data = json.loads(resp)
data = json_data['HeWeather data service 3.0'][0]

#获取PM2.5的值
pm25 = data['aqi']['city']['pm25']
#获取空气质量
air_quality = data['aqi']['city']['qlty']

#获取城市
city = data['basic']['city']

#获取现在的天气、温度、体感温度、风向、风力等级
now_weather = data['now']['cond']['txt']
now_tmp = data['now']['tmp']
now_fl = data['now']['fl']
now_wind_dir = data['now']['wind']['dir']
now_wind_sc = data['now']['wind']['sc']

#今天的天气
today = data['daily_forecast'][0]
weather_day = today['cond']['txt_d']
weather_night = today['cond']['txt_n']
tmp_high = today['tmp']['max']
tmp_low = today['tmp']['min']
wind_dir = today['wind']['dir']
wind_sc = today['wind']['sc']

#天气建议

#舒适度
comf = data['suggestion']['comf']['brf']
comf_txt = data['suggestion']['comf']['txt']

#流感指数
flu = data['suggestion']['flu']['brf']
flu_txt = data['suggestion']['flu']['txt']

#穿衣指数
drsg = data['suggestion']['drsg']['brf']
drsg_txt = data['suggestion']['drsg']['txt']

weather_forcast_txt = "%s今天白天天气%s,夜间天气%s,最高气温%s摄氏度,最低气温%s摄氏度,风力%s,风向%s,天气舒适度:%s,%s,流感" \
                      "指数:%s,%s 穿衣指数:%s,%s 现在外面的天气:%s,当前温度:%s,当前风力:%s"%(city,weather_day,weather_night,tmp_high,tmp_low,wind_sc,wind_dir,comf,comf_txt,flu,flu_txt,drsg,drsg_txt,now_weather,now_tmp,now_wind_sc)

print weather_forcast_txt




第二步、将文字合成语音

我直接用的百度的语音http://yuyin.baidu.com/合成API,调用方法很简单(浏览器就可以玩)
1、同样是注册登录获得key,百度语音

http://yuyin.baidu.com/docs/tts/83

2、注册个应用,随便啥应用都行,获得APPID
这几步都可以参考官方接入指南
3、获得token(一个月有效期,过期再获取即可)
浏览器输入:

https://openapi.baidu.com/oauth/2.0/token?grant_type=client_credentials&client_id=你的AppID&client_secret=你的AppKey

返回的JSON里面的“access_token”就是调用百度语音合成API要用的token

4、合成语音 ,必填、选填参数可看官方文档

http://tsn.baidu.com/text2audio?tex=需要合成语音的文本&lan=zh&per=0&cuid=设备mac地址或手机的IMEI码&ctp=1&tok=你的token

5、我们只需要把天气文本放在第4步的链接tex=' '里面就好了
第三步、用树莓派播放天气预报

树莓派上安装linux音频播放程序 mpg123,执行

sudo apt-get install mpg123

这玩意使用起来异常简单,试试用命令行 “mpg123 语音url” 来播放在线的音频

mpg123 http://tsn.baidu.com/text2audio?tex=需要合成语音的文本&lan=zh&per=0&cuid=设备mac地址或手机的IMEI码&ctp=1&tok=你的token

现在只要把第一步获得的天气文本用mpg123播放就好了,在第一步的代码基础上加上这些:

url = "http://tsn.baidu.com/text2audio?tex=" + weather_forcast_txt + "&lan=zh&per=0&cuid=设备mac地址或手机的IMEI码&ctp=1&tok=你的token"

os.system('mpg123 "%s"'%(url)) #需要import  os

最后,定时执行天气播报脚步就好了

用linux的crontab,可查看crontab定时任务

http://linuxtools-rst.readthedocs.io/zh_CN/latest/tool/crontab.html在终端执行

sudo crontab -e

新增一条
0 8 * * * python /home/pi/...(你的天气播报脚本的路径)
即每天8点整执行语音播报。

via http://www.jianshu.com/p/e15d2b575609


数据挖掘入门与实战

搜索添加微信公众号:datadw


教你机器学习,教你数据挖掘


长按图片,识别二维码,点关注



  公众号: weic2c   
据分析入门与实战

长按图片,识别二维码,点关注


今天看啥 - 高品质阅读平台
本文地址:http://www.jintiankansha.me/weixin/8R72iZeQo4
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/1906
 
1335 次点击