author:Jarrett
初稿时间:2020年10月8日
前言
假如有个私人助理每天向我报告我所关心信息,比如我想知道今天的热点新闻,知乎、微博的热点内容,某个技术有了什么新的突破等等信息。
但是,没有真人的“私人助理”但是可以有一个程序来帮我做到以上的事情。一个运行在服务端的程序,每天抓取我想要的信息,再定时地发送我的邮箱,这不就让梦想更进一步了。那就先来完成一个自动发送天气预报的程序,再将这个程序部署在树莓派上,设置为每天早上和下午定时发送到邮箱。
天气数据的获取
api提供商和风天气
和风天气的开发者文档地址为:
https://dev.heweather.com/docs/api/weather
和风天气支持提供某个地区的天气预报和实况天气信息。其城市级天气预报API,包括全球15万个城市或地区的1-15天天气预报、实况天气、逐小时天气预报以及日出日落、月升月落等数据。
和风天气提供的API包括商业版和开发版。
如需要查看更早期的版本的开发文档请访问 S6版本,S6版本的技术支持截止于2020年6月1日。
3天预报 HTTP GET
商业版 https://api.heweather.net/v7/weather/3d?{请求参数}
开发版 https://devapi.heweather.net/v7/weather/3d?{请求参数}
python链接和风天气
url = APIURL + '?location= ' + CITY + '&key=' + KEY
res = requests.get(url)
res = json.loads(res.text) # Change the response to json.
和风天气的返回数据如下所示。
{"HeWeather6":
[{"basic":
{"cid":"CN101271503","location":"彭山","parent_city":"眉山","admin_area":"四川省","cnty":"中国","lat":"30.19229889","lon":"103.87010193","tz":"+8.00"},
"update": {"loc":"2020-10-08 20:40","utc":"2020-10-08 12:40"},
"status":"ok",
"daily_forecast":
[{"cond_code_d":"305","cond_code_n":"305","cond_txt_d":"小雨","cond_txt_n":"小雨","date":"2020-10-08","hum":"85","mr":"22:51","ms":"12:27","pcpn":"1.4","pop":"58","pres":"967","sr":"07:03","ss":"18:39","tmp_max":"19","tmp_min":"16","uv_index":"2","vis":"25","wind_deg":"59","wind_dir":"东北风","wind_sc":"1-2","wind_spd":"3"},
{"cond_code_d":"305","cond_code_n":"305","cond_txt_d":"小雨","cond_txt_n":"小雨","date":"2020-10-09","hum":"87","mr":"23:43","ms":"13:23","pcpn":"1.0","pop":"55","pres":"963","sr":"07:03","ss":"18:38","tmp_max":"20","tmp_min":"16","uv_index":"2","vis":"25","wind_deg":"0","wind_dir":"北风","wind_sc":"1-2","wind_spd":"3"},
{"cond_code_d":"305","cond_code_n":"305","cond_txt_d":"小雨","cond_txt_n":"小雨","date":"2020-10-10","hum":"88","mr":"00:00","ms":"14:15","pcpn":"1.0","pop":"55","pres":"961","sr":"07:04","ss":"18:37","tmp_max":"20","tmp_min":"17","uv_index":"2","vis":"25","wind_deg":"0","wind_dir":"北风","wind_sc":"1-2","wind_spd":"3"}
]}]}
格式整理
使用开发版的API只能提供三天的天气预报数据。从获取的信息中提取到天气描述、最高温度、最低温度、湿度、风向、风级、风速等信息。
forecast = res['HeWeather6'][0]['daily_forecast']
for data in forecast:
cond_txt_d = data['cond_txt_d'] # weather 天气描述
tmp_max = data['tmp_max'] # max temperature.
tmp_min = data['tmp_min'] # min tempereture.
hum = data['hum'] # humanity
wind_dir = data['wind_dir'] # wind direction.
wind_sc = data['wind_sc'] # wind degree.
wind_spd = data['wind_spd'] # wind speed.
发送邮件
邮件发送模块采用菜鸟教程的demo即可完成。
发送的邮箱可以选择国内的163邮箱,QQ邮箱。需要注意的是发送邮箱的token是需要到邮箱的设置页设置的,而不是常用的登录邮箱。
这里建议将发件人姓名(username
)发件人的邮箱地址,收件人的姓名、收件人的邮箱地址,全部放到配置文件中。这样做的目的是方便以后扩展和修改,避免修改程序;另一方面将其加入到gitingore
文件中,就不会被同步。
数据 -> 格式 -> 邮件发送
通过将获取的天气预报数据整理格式,就可以发送天气预报到邮箱了。
邮箱里接收到的信息单纯的文字看上去就很“朴素”,为了增强用户的友好度,我们采用HTML美化。
美化的方法是首先用html设计一个网页,然后再将需要显示的数据给替换为查询的天气信息。
天气预报
界面的美化是因人而异,直接copy了和风天气的UI。
结论
- 用最简单的方式爬取和风天气的API。仅用几行代码就可以获取到天气信息,这也是很多爬虫程序的第一步。
- 邮件发送的模块是可以完全复用的。邮件发送的内容可以是普通的文本,html,图片,以及附件等。
- 这里是实现了发送邮件的内容,下一步需要将其部署在树莓派中,且设置为定时任务。
参考
菜鸟教程:Python SMTP发送邮件
https://github.com/Jarrettluo/Weather_Forecast
网友评论