点击蓝字 关注我们



前面学会了微信推送,Tyree在手机上收到了测试消息。他说:“消息是收到了,但数据是过时的。能不能把真实天气数据直接推过来?”
上一课是单独学推送功能,这一课要把之前学的所有技能全部串起来——爬虫、存CSV、画图、推送、定时,做成一个每天早上自动运行的完整工具。
如果上集是单个零件,那么下集就是把零件组装成机器。
1
整体结构
我们的最终目标是每天早上7:30自动完成以下动作:
1. 爬取当天天气数据(第51课)
2. 追加到CSV文件(第53课)
3. 生成温度趋势图(第54课)
4. 推送到微信(第57课上)
5. 以上全部自动执行,无需手动操作(第55课)
把每个功能写成一个函数,然后依次调用。
2
脚本结构说明
整个脚本代码由六个功能模块组成,依次是:
第一个模块:采集天气
fetch_weather() 负责从 wttr.in 获取当天的天气数据。它发一个请求,把返回的 JSON 解析成字典,取出温度、湿度、天气状况三个字段。如果请求失败或数据异常,返回 None。
第二个模块:存到CSV
save_weather(data) 把采集到的数据追加到 weather_history.csv。文件不存在时自动创建并写入表头,存在时追加一行新数据。每天的日期由程序自动生成,不需要手动输入。
第三个模块:画趋势图
plot_weather() 从CSV读取历史温度数据,画出折线图,保存为 weather.png。如果数据少于两条,画图没有意义,直接跳过。
第四个模块:微信推送
send_push(title, content) 把标题和内容发送到PushPlus,返回是否成功。push_weather(weather) 把天气数据组装成推送内容,调用 send_push 发送。
第五个模块:主流程
main() 把上述四个模块串联起来:采集 → 存表 → 画图 → 推送。每完成一步打印一条日志,方便追踪执行情况。
第六个模块:定时启动
脚本被直接运行时,先执行一次 main() 做测试,然后设置每天早上7:30自动执行,进入等待循环。
这六个模块按顺序写在一起,就是完整的脚本。
下面开始分段写。
3
采集天气+存csv的脚本代码
下面我们先把采集天气与存csv的代码写出来,前面学过的,下面来看载图
与


上面截图就是采集天气与保存CSV的代码,接下来我们来画图。
4
画趋势图的脚本代码
画趋势图的代码我们前面也写过,具体的课程也可返回看54课,下面是代码截图

整个代码还没有整合完,下面还有微信推送,主流程和定时任务。下面就把这几个代码合在一起,代码行数有点多哦。
5
微信推送,主流程和定时任务的脚本代码
下面我们来把微信推送,主流程和定时任务结合起来,代码如下图





至此,我们就可以把上面的全部代码合在一起,组合成一个完整的脚本了,注意要换成自己的Token。
6
代码解释
下面我们一起来看看上面脚本中的一些重要代码的解释,其实前面都有讲解过,我们再温习一遍
`fetch_weather()`:爬取北京天气,返回包含温度、湿度、天气状况的字典。
`save_weather(data)`:把天气数据追加到CSV文件,文件不存在时自动创建并写入表头。
`plot_weather()`:读取CSV数据,生成温度趋势图并保存为 `weather.png`。
`send_push(title, content)`:通过PushPlus把消息推送到微信,返回是否成功。
`push_weather(weather)`:把天气数据组装成推送内容,调用 `send_push`。
`count_records()`:统计CSV文件中的数据条数,用于在推送内容中显示“已连续记录X天”。
`main()`:主流程,依次调用采集、存储、画图、推送。
`schedule.every().day.at("07:30").do(main)`:每天早上7:30自动执行主流程。
首次运行会立即执行一次用于测试,之后进入定时等待状态。
7
课后小挑战
挑战1:把城市改成你所在的城市,修改 `fetch_weather` 中的 `Beijing` 参数。
挑战2:在推送内容中增加一句简单的穿衣建议(比如温度>30℃时提示“建议穿短袖”)。
8
今天学到了什么
- 把所有功能模块整合成一个完整脚本
- 用 `schedule` 实现每日定时运行
- 一次运行完成“采集→存表→画图→推送”全流程
好了到这里,天气推送工具的完整链条已经搭建完毕。每天程序自动跑一遍,你起床时微信上已经有了当天的天气数据。
下节课会有惊喜,敬请期待!
————热门推荐————
自学编程第51课:爬虫入门让Python帮你从网页“拿”数据
自学编程第一步:安装Python和Thonny 零基础图文教程
本系列教程持续更新,欢迎关注收藏

点赞
收藏
分享