python自动获取天气_用python获取天气数据,并作定时播报
原標(biāo)題:用python獲取天氣數(shù)據(jù),并作定時(shí)播報(bào)
數(shù)據(jù)挖掘入門與實(shí)戰(zhàn) 公眾號(hào): datadw
思路
1.調(diào)用和風(fēng)天氣的API,獲取天氣數(shù)據(jù)
2.用百度語音API,將天氣數(shù)據(jù)合成語音
3.用樹莓派每天早上定時(shí)播報(bào)天氣(定時(shí)任務(wù)crontab + Python腳本 + mpg123播放器)
Python知識(shí)點(diǎn)
1.使用urllib2庫;
2.Python處理json數(shù)據(jù);
3.linux的定時(shí)任務(wù)crontab。
實(shí)現(xiàn)
第一步、用和風(fēng)天氣API獲取天氣數(shù)據(jù)
城市接口: https://api.heweather.com/x3/weather?cityid=城市ID&key=你的認(rèn)證key
2016-11-08 和風(fēng)天氣的API11月初改版了,所以上述接口地址需要更換成新的,看了下就加了個(gè)“free-”,后面代碼加上就好了。
接口地址變了
首先得注冊登錄和風(fēng)天氣http://www.heweather.com/documents/api 獲得key,在城市代碼里面找到想要查的城市ID,以北京為例:CN101010100
先不著急寫碼,我們用API調(diào)試工具試試這個(gè)接口,看看返回的是什么數(shù)據(jù)。
我用的是chrome下postman,打開postman,輸入接口鏈接:
https://api.heweather.com/x3/weather?cityid=CN101010100&key=這里填你的key
API調(diào)試工具
返回的是JSON格式的,現(xiàn)在用Python調(diào)用一下這個(gè)接口試試:
# -*- coding: utf-8 -*-
import urllib2
#調(diào)用和風(fēng)天氣的API
url = 'https://api.heweather.com/x3/weather?cityid=CN101010100&key=你的key'
#用urllib2創(chuàng)建一個(gè)請求并得到返回結(jié)果
req = urllib2.Request(url)
resp = urllib2.urlopen(req).read()
print resp
python返回的數(shù)據(jù)
這堆亂七八糟的是什么鬼,沒法看,我們就用postman看看結(jié)構(gòu)就好了。
JSON表示的對象就是標(biāo)準(zhǔn)的Java語言的對象,JSON和Python內(nèi)置的數(shù)據(jù)類型有著對應(yīng)關(guān)系如下:
Python內(nèi)置數(shù)據(jù)類型和JSON的對應(yīng)關(guān)系
Python內(nèi)置的json模塊提供了非常完善的Python對象到JSON格式的轉(zhuǎn)換。我們用loads()方法把JSON反序列化為Python對象
#將JSON轉(zhuǎn)化為Python的數(shù)據(jù)結(jié)構(gòu)
json_data = json.loads(resp)
print json_data
結(jié)果發(fā)現(xiàn)數(shù)據(jù)變成了u'XXXXX'的格式,這是因?yàn)榉葱蛄谢玫降乃凶址畬ο竽J(rèn)都是unicode編碼的。
結(jié)果
我們此時(shí)已經(jīng)將天氣數(shù)據(jù)拿到,并且反序列化為Python對象了,只有提取我們需要的數(shù)據(jù)即可。看下天氣API提供哪些數(shù)據(jù)
postman上的JSON結(jié)構(gòu)
我就每天早上聽一下今天的氣溫、風(fēng)力、pm2.5、穿衣建議就好了。
現(xiàn)在以獲得pm2.5的值為例,一層層獲取到pm2.5的值
pm2.5的值
上面說了JSON里面{}對應(yīng)的是Python的dict,[]對應(yīng)的是Python里的list,上圖中可以比較清楚地知道這個(gè)JSON得到的Python數(shù)據(jù)其實(shí)是dict和list的多層嵌套。這里我們可以類比查《新華字典》,想要查到“天氣”這個(gè)詞,可以找到字母T的頁碼(按A~Z的有序列表),再找到“tian”所在的位置,一步步往里找就成找到想要的詞了。
最外層是個(gè)dict類型:
dict: {'HeWeather...": [ list]}
往里一層是多個(gè)dict,直接通過多層dict['key']['key2']...就能取得PM2.5的值了:
list 只有一個(gè)值,取list[0] (它的值是一個(gè)dict),取得天氣只需要
print json_data['HeWeather data service 3.0'][0]['aqi']['city']['pm25']
下面是完整的獲取天氣數(shù)據(jù)的代碼,這里其實(shí)只是為了實(shí)現(xiàn)功能,其實(shí)可以完善的地方很多:
# -*- coding: utf-8 -*-
import sys,urllib2, json
reload(sys) # Python2.5 初始化后會(huì)刪除 sys.setdefaultencoding 這個(gè)方法,我們需要重新載入
sys.setdefaultencoding('utf-8') #這個(gè)是解決合成中文文本的時(shí)候,Unicode和utf-8編碼問題的,可以嘗試注釋掉會(huì)不會(huì)報(bào)錯(cuò)
#調(diào)用和風(fēng)天氣的API
url = 'https://api.heweather.com/x3/weather?cityid=CN101010100&key=替換成你的KEY'
req = urllib2.Request(url)
resp = urllib2.urlopen(req).read()
#將JSON轉(zhuǎn)化為Python的數(shù)據(jù)結(jié)構(gòu)
json_data = json.loads(resp)
data = json_data['HeWeather data service 3.0'][0]
#獲取PM2.5的值
pm25 = data['aqi']['city']['pm25']
#獲取空氣質(zhì)量
air_quality = data['aqi']['city']['qlty']
#獲取城市
city = data['basic']['city']
#獲取現(xiàn)在的天氣、溫度、體感溫度、風(fēng)向、風(fēng)力等級(jí)
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']
#流感指數(shù)
flu = data['suggestion']['flu']['brf']
flu_txt = data['suggestion']['flu']['txt']
#穿衣指數(shù)
drsg = data['suggestion']['drsg']['brf']
drsg_txt = data['suggestion']['drsg']['txt']
weather_forcast_txt = "%s今天白天天氣%s,夜間天氣%s,最高氣溫%s攝氏度,最低氣溫%s攝氏度,風(fēng)力%s,風(fēng)向%s,天氣舒適度:%s,%s,流感"
"指數(shù):%s,%s 穿衣指數(shù):%s,%s 現(xiàn)在外面的天氣:%s,當(dāng)前溫度:%s,當(dāng)前風(fēng)力:%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,調(diào)用方法很簡單(瀏覽器就可以玩)
1、同樣是注冊登錄獲得key,百度語音
http://yuyin.baidu.com/docs/tts/83
2、注冊個(gè)應(yīng)用,隨便啥應(yīng)用都行,獲得APPID
這幾步都可以參考官方接入指南
3、獲得token(一個(gè)月有效期,過期再獲取即可)
瀏覽器輸入:
https://openapi.baidu.com/oauth/2.0/token?grant_type=client_credentials&client_id=你的AppID&client_secret=你的AppKey
返回的JSON里面的“access_token”就是調(diào)用百度語音合成API要用的token
4、合成語音 ,必填、選填參數(shù)可看官方文檔
http://tsn.baidu.com/text2audio?tex=需要合成語音的文本&lan=zh&per=0&cuid=設(shè)備mac地址或手機(jī)的IMEI碼&ctp=1&tok=你的token
5、我們只需要把天氣文本放在第4步的鏈接tex=' '里面就好了
第三步、用樹莓派播放天氣預(yù)報(bào)
樹莓派上安裝linux音頻播放程序 mpg123,執(zhí)行
sudo apt-get install mpg123
這玩意使用起來異常簡單,試試用命令行 “mpg123 語音url” 來播放在線的音頻
mpg123 http://tsn.baidu.com/text2audio?tex=需要合成語音的文本&lan=zh&per=0&cuid=設(shè)備mac地址或手機(jī)的IMEI碼&ctp=1&tok=你的token
現(xiàn)在只要把第一步獲得的天氣文本用mpg123播放就好了,在第一步的代碼基礎(chǔ)上加上這些:
url = "http://tsn.baidu.com/text2audio?tex=" + weather_forcast_txt + "&lan=zh&per=0&cuid=設(shè)備mac地址或手機(jī)的IMEI碼&ctp=1&tok=你的token"
os.system('mpg123 "%s"'%(url)) #需要import os
最后,定時(shí)執(zhí)行天氣播報(bào)腳步就好了
用linux的crontab,可查看crontab定時(shí)任務(wù)
http://linuxtools-rst.readthedocs.io/zh_CN/latest/tool/crontab.html在終端執(zhí)行
sudo crontab -e
新增一條
0 8 * * * python /home/pi/...(你的天氣播報(bào)腳本的路徑)
即每天8點(diǎn)整執(zhí)行語音播報(bào)。
via http://www.jianshu.com/p/e15d2b575609
數(shù)據(jù)挖掘入門與實(shí)戰(zhàn)
教你機(jī)器學(xué)習(xí),教你數(shù)據(jù)挖掘
公眾號(hào): weic2c
責(zé)任編輯:
總結(jié)
以上是生活随笔為你收集整理的python自动获取天气_用python获取天气数据,并作定时播报的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python正则表达式匹配aabb_Py
- 下一篇: python软件安装和使用方法_aws