每日天气提醒:专为你定制

更新:11-08 名人轶事 我要投稿 纠错 投诉

最近在博客上看到一个基于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

每日天气提醒:专为你定制和的问题分享结束啦,以上的文章解决了您的问题吗?欢迎您下次再来哦!

用户评论

她的风骚姿势我学不来

这也太贴心了!女生听起来都会开心很满足的啊

    有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位网友表示赞同!

    【每日天气提醒:专为你定制】相关文章:

    1.蛤蟆讨媳妇【哈尼族民间故事】

    2.米颠拜石

    3.王羲之临池学书

    4.清代敢于创新的“浓墨宰相”——刘墉

    5.“巧取豪夺”的由来--米芾逸事

    6.荒唐洁癖 惜砚如身(米芾逸事)

    7.拜石为兄--米芾逸事

    8.郑板桥轶事十则

    9.王献之被公主抢亲后的悲惨人生

    10.史上真实张三丰:在棺材中竟神奇复活

    上一篇:2024双十一手机优惠攻略:淘宝京东苹果手机价格大揭秘,双11最佳购买时机解析 下一篇:高效阅读技巧:掌握这招,轻松牢记每本书的精华!