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

原标题:用python获取天气数据,并作定时播报

数据挖掘入门与实战 公众号: 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表示的对象就是标准的Java语言的对象,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

数据挖掘入门与实战

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

公众号: weic2c

责任编辑:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/258764.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c++实现解析文件路径

注意&#xff1a;本实现只能解析类似linux下的路径&#xff0c;即“/data/a.txt”&#xff0c;而不能解析“c:\a.txt” 或者“c:\\a.txt”&#xff0c;但是应该很容易扩展改写实现此功能。 FilepathParse.h #include <string> using std::string;void parseFilepath(str…

gedit搭建c开发环境

在管理外部工具中&#xff0c;创建启动脚本 1 #!/bin/sh 2 DIR$GEDIT_CURRENT_DOCUMENT_DIR 3 NAME$GEDIT_CURRENT_DOCUMENT_NAME 4 /home/lxy/code/c/struct/run.sh ${DIR}/${NAME} 创建run.sh #!/bin/sh file$1 ext${file##*.}#C if [ $ext "c" ]; thenif [ -f $f…

Oracle数据库入门——常用的数据字典

一、oracle数据字典主要由以下几种视图构成&#xff1a;1.user视图以user_为前缀&#xff0c;用来记录用户对象的信息 2.all视图以all_为前缀&#xff0c;用来记录用户对象的信息及被授权访问的对象信息 3.dba视图以dba_为前缀&#xff0c;用来记录数据库实例的所有对象的信息 …

一个excel文档里复制黏贴另外表单跟着变动_利用Excel连接Power BI,实现PPT报告自动输出...

​文/HALI就职于汽车行业战略部门 专注汽车市场信息情报收集和分析因为工作需要&#xff0c;每月周期性的更新数据和撰写PPT 报告成为繁重的劳动。结果是很多时间花费在数据处理上&#xff0c;真正的分析工作&#xff0c;往往只能草草收场。不能坐以待毙&#xff0c;就要想想有…

出现23.97帧率的原因

http://raytao.lofter.com/post/3d177_185a386 关于那些“格&#xff08;Frame&#xff09;”不得不说的事 今天早上&#xff0c;鄙人在社交网络发了这一系列的问题&#xff1a;请解释以下名词之间的关系或差异。帧&#xff0c;格&#xff0c;帧率&#xff0c;时基&#xff0c;…

8-3建立蒙版

http://www.missyuan.com/thread-527018-1-1.html 在实际操作中&#xff0c;99.9%的蒙版都是通过选区建立的 所以选区要选好 点击图层调板下方的按钮直接建立蒙版(下左图红色箭头处)&#xff0c;效果等同于【图层_图层蒙版_显示选区】 图层中有了两个对象&#xff1a;一是图层&…

今天试了一下iscroll

感觉5和4差别还是有一点的&#xff0c;虽然不是很多&#xff0c;今天用了一下&#xff0c;感觉还是很不错。 今天看到有人提问说如果页面要引入多个iscroll怎么弄的问题&#xff0c;其实很简单&#xff0c;页面再多实例化一次就可以了。 如&#xff1a; myScroll new iScroll(…

使用ajax将数据显示在指定位置_AJAX学习主题之一

学习主题&#xff1a;AJAX删除用户功能实现根据视频中的讲解&#xff0c;完成以下内容简述删除功能的基本思路流程点击按钮获取当前元素中的用户uid&#xff0c;向服务器发起请求&#xff0c;将uid提交到服务器删除指定用户&#xff0c;浏览器获取浏览器响应结果。独立完成删除…

matlab 配置mex 识别vs2015

问题&#xff1a;先安装了matlab&#xff0c;后装了vs13和vs15,但是mex -setup时却不能识别vs15&#xff0c;采用了两种办法&#xff0c;最终得以识别。解决方案&#xff1a;先采用方法&#xff1a; http://blog.csdn.net/yc461515457/article/details/51635842 &#xff0c;但…

互联网企业安全高级指南3.6 需要自己发明安全机制吗

3.6 需要自己发明安全机制吗 1. 安全机制的含义 首先解释一下发明安全机制这句话的意思。安全机制包括&#xff1a;常见的对称和非对称加密算法&#xff0c;操作系统自带的RBAC基于角色的访问控制&#xff0c;自带的防火墙Netfilter&#xff0c;Android的基于appid隔离的机制&…

钩子方法

Class#inherited 类被继承时调用 Module#included 模块的生命周期中调用 Module#extend_object 模块扩展类时调用 Module#method_added Module#method_removed Module#method_undefined转载于:https://www.cnblogs.com/qinyan20/p/3656156.html

ember启动报错

ember[4858] (FSEvents.framework) FSEventStreamStart: register_with_server: ERROR: f2d_register_rpc() > (null) (-21) events.js:85 throw er; // Unhandled ‘error’ event ^ Error: watch EMFILE at exports._errnoException (util.js:746:11) at FSEvent.FS…

js日期比较大小_node.js 内存泄漏的秘密

每日前端夜话第276篇翻译&#xff1a;疯狂的技术宅作者&#xff1a;Giovanny Gongora来源&#xff1a;nodesource正文共&#xff1a;3955 字预计阅读时间&#xff1a;10分钟一直以来&#xff0c;跟踪 Node.js 的内存泄漏是一个反复出现的话题&#xff0c;人们始终希望对其复杂性…

win7+vs2015/13+caffe+matlab+python(CPU only)配置

首先声明本教程可以适用于vs2015 和vs2013 .以vs2015为例。 安装必备软件 vs 2015 /vs2013 matlab 2016a(64bit)推荐使用Anaconda 2.7 或者Miniconda 2.7这两个Python发布版本cmake 3.8.0 以上caffe-window: https://github.com/BVLC/caffe/tree/windows 可选软件&#xff1…

Performance Co-Pilot

Install Performance Co-Pilot 提前安装依赖 [rootiZrj97j6t7ih9hgz1me35hZ ~]# cat install.sh yum install -y docker yum install -y git yum install -y yum-utils-1.1.31-40.el7.noarch yum install lex yum install flex yum install -y bison yum install -y perl-ExtUt…

字符串转换整形数,结构体数组排序

#include <stdio.h> #include<string.h> #include<conio.h> #include <stdlib.h> FILE *p; #define N 3 struct hacker {char name[11];char num[20];char xingbie[3]; }z[N];//输入模块 void shuru() {char *s"网名 QQ号码 性别信息…

如何发布打包并发布自己的Android应用(APP)

第一步&#xff0c;在Eclipse中选择需要打包的项目&#xff0c;然后右键--选择Export&#xff0c;会弹出一个打包的提示框&#xff0c;如下图所示。 按Next之后&#xff0c;会继续出现一个提示框&#xff0c;这里你可以选择自己需要打包的项目&#xff08;默认是刚才选中的&…

js变量提升_一道JS变量提升题

var a 0;if(true){a 1;function a(){};a 21;console.log(a);}console.log(a);// 21 1 当前上下文代码执行之前&#xff0c;会将带var/function的进行声明/定义。当遇到“{}”时&#xff0c;新版浏览器和老版浏览器的处理不一致。老版浏览器&#xff08;IE10以下&#xff09;…

Adaboost的几个人脸检测网站

【1】基础学习笔记之opencv(1)&#xff1a;opencv中facedetect例子浅析 http://www.cnblogs.com/tornadomeet/archive/2012/03/22/2411318.html【2】OpenCV学习笔记&#xff08;二十七&#xff09;——基于级联分类器的目标检测objdect http://blog.csdn.net/yang_xian521/arti…