最近在博客上看到一个基于Python和阿里云的短信发送脚本。我觉得这很有趣,并尝试重现它。
总体思路如下
获取天气网络API数据urllib封装json数据格式更容易操作
阿里云设置aliyun_SDKPython版本统一
每日定时执行通过Linux脚本语言完成
抓取天气
找了好久,找到了一个稳定免费的天气API接口,不仅可以显示实时天气,还具有预测功能(疯狂调用进行中……)。
由于该API支持json和xml两种格式,因此使用urllib包可以轻松获取相应的天气数据。
# -*- 编码:utf-8 -*-
导入urllib
导入json
city=u"Beibei" #要查询的城市
city=urllib.parse.quote(city) #这句话很关键.陷阱太大了
Weather_url="http://www.sojson.com/open/api/weather/json.shtml?city=%s" %city
#捕获网页信息
req=urllib.request.urlopen(weather_url)
rs=req.read().decode() #使用utf-8解码
#获取当天的数据,格式如下
#{"date":"04号星期四","日出":"07:50","high":"高温7.0","low":"低温5.0",
#"sunset":"18:08","aqi":24.0,"fx":"无连续风向","fl":"3级","type":"小雨",
#"通知":"下雨没关系,撑伞挡就行了"}
Weather_info=json.loads(rs)["forecast"] 仅仅几行代码就完成了工作,但是中间有很多坑。
1.API接口重要性
原博客提供的API接口已经过时,对应的数据不再更新,所以在度娘上又找到了另一个比较全面的API。但执行到倒数第二步时,解码失败,错误码
“utf-8”编解码器无法解码位置1: 无效起始字节中的字节0x8b
百度圈子发现提交给服务器的请求头中有一个选项Accept Encoding : gzip, deflate。该信息意味着本地可以接收压缩格式的数据,服务器在处理时会压缩大文件并发回客户端。结尾。即本地接收到的不是完整的json格式,而是压缩后的gzip格式。可以通过request.getheaders查询响应头信息来获取。
然而如何处理请求头,让它不接受压缩格式,一直没弄明白。
最终,通过找到另一个更合适的API,这个问题得到了解决。
2.url汉字编码
此网址中输入的城市名称是用汉字输入的。但是我们都知道,汉字是不能作为URL输入的,需要进行编码。
在原始API文档中,作者使用的是UTF-8编码(实际上是基于URL的UTF-8编码),因此他将汉字转换为UTF-8,然后附上URL地址,但访问失败。
提取对应的汉字编码并显示如下
汉字:贝贝
utf-8:xe5x8cx97xe7xa2x9a
网址:%e5%8c%97%e7%a2%9a
可以发现url将utf-8中的x替换成了%。这是因为url 中不允许使用 等字符。更详细的URL转码文档可以参考阮一峰的博客
博客简要说明
1、如果url中的汉字是路径,则将相关位置替换为UTF-8编码对应的%。
2. 如果URL中的汉字为搜索关键字,则使用操作系统的默认编码。
3. GET和POST方法的编码采用网页的编码。
4.剩下的太复杂,跳过
3. python2.7 vs python3
由于python版本不向后兼容,2.7版本的python语法与3及更高版本的语法有很大不同。考虑到后续阿里云API将采用2.6版本,因此urllib模块需要转换为2.6格式。
由于全文只使用了urllib模块,因此只需要进行小的修改。
python2和python3中urllib的区别
修改后的代码如下
# -*- 编码:utf-8 -*-
__author__="lumo_wang"
导入urllib
导入urllib2
导入json
城市="北碚"
city_encode=urllib.quote(城市)
Weather_url="http://www.sojson.com/open/api/weather/json.shtml?city=%s" %city_encode
请求=urllib2.urlopen(weather_url)
rs=request.read().decode("utf-8")
Weather_info=json.loads(rs)["数据"]["预测"][0]
#数据提取,主要用于删除温度中的汉字
def s2t(字符串):
开关=假
温度=""
对于string: 中的s
if switch==True:
温度+=s
如果s==u"":
开关=真
返回温度
#信息分解
time=Weather_info["date"] #日期——04 星期四
temp_l=Weather_info["low"] #低温—— 低温5.0
低=s2t(temp_l)
temp_h=Weather_info["high"] #高温—— 高温7.0
高-s2t(temp_h)
aqi=Weather_info["aqi"] #aqi指数——23.0
每日天气提醒:专为你定制和的问题分享结束啦,以上的文章解决了您的问题吗?欢迎您下次再来哦!
【每日天气提醒:专为你定制】相关文章:
2.米颠拜石
3.王羲之临池学书
8.郑板桥轶事十则
用户评论
这也太贴心了!女生听起来都会开心很满足的啊
有11位网友表示赞同!
boyfriends doing boyfriend things, i love it!
有15位网友表示赞同!
希望他不是说风来日就是晴天什么的简单预报,要有点细节才行
有6位网友表示赞同!
想象一下收到这份消息的感觉,一定是甜甜的!
有15位网友表示赞同!
如果再附上一些情侣动态表情,那简直太棒了!
有12位网友表示赞同!
女票应该很爱这个 boyfriend 啊!
有7位网友表示赞同!
希望我的男朋友也能这么注意到我每天的天气!
有10位网友表示赞同!
最重要的是这份心意,细节能体现关心
有18位网友表示赞同!
有些女生喜欢知道天气预报吗?我不太清楚,这个男友做的真用心
有16位网友表示赞同!
不管结果如何,女孩听到会有惊喜,这很不错呀!
有15位网友表示赞同!
这种细致的关爱真的让人感动
有8位网友表示赞同!
也许还能加上一些关于女票喜欢的活动的建议吧,比如:今天有点冷记得多穿衣服!
有16位网友表示赞同!
会不会在预报里带点幽默元素?哈哈,期待更多有趣的提醒!
有19位网友表示赞同!
可以考虑做一个专门的手机app来记录和发送这些天气提醒
有15位网友表示赞同!
感觉很有爱呀,这种暖心的小举动会让人觉得很幸福!
有20位网友表示赞同!
我男朋友要是能做到这一点就好了,我一定也会每天都开心!
有19位网友表示赞同!
这么贴心的男友简直是宝藏!
有11位网友表示赞同!