当前位置: 首页 > news >正文

《Python程序设计》实验4报告

20252203 2025-2026-2 《Python程序设计》实验4报告
课程:《Python程序设计》
班级:2521
姓名:黄文皓
学号:20252133
实验教师:王志强
实验日期:2026年5月27日
必修/选修: 公选课
一、实验分析、设计、实现过程及结果---
title: 基于Python的多城市天气自动推送系统

摘要

本实践项目设计并实现了一个基于 Python 的天气自动化推送系统。系统通过爬虫技术实时获取多个城市的天气数据,经过数据处理与清洗后,生成未来三天气温趋势图,并通过 PushPlus 平台将包含精美 HTML 卡片的消息推送至用户微信。项目涵盖了爬虫、数据处理、可视化、微信 API 调用及定时任务等多项 Python 核心技术,功能丰富,实用性强,有效提升了日常天气获取的便捷性。


目录

  1. 实验分析
    1.1 背景与目的
    1.2 需求分析
    1.3 功能列表
  2. 系统设计
    2.1 总体架构
    2.2 模块设计
    2.3 工作流程
  3. 实现过程
    3.1 开发环境
    3.2 关键技术及代码解析
  4. 测试与结果展示
  5. 课程总结与感想
  6. 参考文献

1. 实验分析

1.1 背景与目的

日常生活中,及时获取天气信息对出行、穿衣等决策至关重要。然而,主动打开天气 APP 查看较为繁琐,且容易遗忘。Python 凭借其丰富的第三方库,能够方便地实现数据抓取、处理及消息推送。本项目的目的是利用 Python 开发一套自动化天气推送工具,每天定时将天气详情及趋势图发送到微信,让用户被动、及时地接收信息,提升生活效率。

1.2 需求分析

  • 数据获取:需要从可靠数据源实时获取指定城市的当日天气及未来预报。
  • 数据处理:解析 JSON 数据,清洗出温度、湿度、风向等关键字段,并适配展示格式。
  • 可视化:将未来温度数据绘制成折线图,直观展示变化趋势。
  • 推送交互:通过微信渠道推送天气卡片,要求信息全面、排版美观。
  • 定时运行:程序需长期驻留,按预设时间自动执行,无需人工干预。
  • 扩展性:支持多城市、多时段推送,具备日志记录与异常处理能力。

1.3 功能列表

本系统实现了以下 ≥5 个核心功能

  1. 多城市天气爬取:配置城市代码,同时获取多个城市天气。
  2. 数据清洗与加工:解析 JSON,提取温度、湿度、空气质量等,生成结构化的天气信息。
  3. 数据可视化:绘制未来三天最高/最低温曲线图,含渐变填充与数值标注。
  4. 微信消息推送:基于 PushPlus 接口,推送图文并茂的 HTML 天气卡片。
  5. 智能生活建议:根据温度、天气状况自动生成穿衣建议和带伞提醒。
  6. 天气预警:检测暴雨、高温、大风等关键词,追加红色预警卡片。
  7. 每日一言:调用一言 API,为推送增加人文关怀。
  8. 定时任务调度:支持多个时间点(如早晚 7 点)自动执行推送。
  9. 日志记录:记录运行状态、错误信息,便于问题排查。
  10. 多通道备份(可选):支持钉钉机器人备用推送。

2. 系统设计

2.1 总体架构

系统采用模块化设计,主要由以下几层组成:

  • 配置层:集中管理 Token、城市列表、推送时间、预警规则等。
  • 数据获取层:封装对天气 API 的 HTTP 请求,返回原始 JSON。
  • 数据处理层:解析原始数据,生成标准化的天气字典和温度 DataFrame。
  • 可视化层:使用 matplotlib 绘制未来三天温度趋势图。
  • 推送层:通过 PushPlus 素材库上传图片,构建 HTML 卡片并发送。
  • 调度层:基于 schedule 库实现定时任务循环。

2.2 模块设计

  • config.py:配置模块,存放所有可调参数,便于维护。
  • main.py:主逻辑模块,包含以下核心函数:
    • get_weather_data():爬取函数
    • data_process():数据处理函数
    • clothing_advice()get_weather_emoji()get_daily_quote():辅助函数
    • generate_chart():图表绘制函数
    • upload_image():图片上传函数
    • send_pushplus():推送函数
    • daily_task():任务调度入口

2.3 工作流程

  1. 启动时从 config.py 读取配置,注册多个定时任务。

分别建个文件夹

屏幕截图 2026-06-14 193856

代码:

屏幕截图 2026-06-14 191750

  1. 到达设定时间后,遍历城市列表,依次执行:
    • 请求天气 API → 数据解析与加工 → 生成趋势图并上传 → 组装 HTML 推送。

屏幕截图 2026-06-14 191724

屏幕截图 2026-06-14 191730

屏幕截图 2026-06-14 191746

屏幕截图 2026-06-14 191736

  1. 每个城市间隔 1 秒,避免请求过快。
  2. 整个过程记录日志,失败自动重试 3 次。

3. 实现过程

3.1 开发环境

  • 操作系统:Windows 11 / Linux (Ubuntu 20.04)
  • Python 版本:3.9
  • 主要第三方库:requests, pandas, matplotlib, schedule
  • IDE/编辑器:PyCharm / VSCode

3.2 关键技术及代码解析

3.2.1 爬虫与数据获取

使用 requests 库调用 t.weather.sojson.com 提供的免费 API,通过城市代码获取 7 天预报 JSON。

def get_weather_data(city_code):headers = {"User-Agent": "Mozilla/5.0"}api = f"http://t.weather.sojson.com/api/weather/city/{city_code}"res = requests.get(api, headers=headers, timeout=10)return res.json() if res.json().get("status") == 200 else None

3.2.2 数据处理
从返回的 JSON 中提取今日天气及未来 3 天预报,清洗温度字段(去除“高温 ”“低温 ”“℃”等),并自动生成穿衣建议、预警和每日一言:

high = int(today["high"].replace("高温 ", "").replace("℃", ""))
low  = int(today["low"].replace("低温 ", "").replace("℃", ""))
weather["穿衣建议"] = clothing_advice(high, low, today["type"])

3.2.3 可视化图表
使用 matplotlib 绘制折线图,两条曲线分别表示最高温和最低温,添加渐变填充和数据点数值标签:

fig, ax = plt.subplots(figsize=(8,5))
ax.plot(dates, highs, marker="o", color="#E74C3C", lw=2, label="最高温")
ax.plot(dates, lows, marker="s", color="#3498DB", lw=2, label="最低温")
ax.fill_between(dates, lows, highs, alpha=0.15, color="#E74C3C")
plt.savefig(f"chart_{city_name}.png", dpi=200)![chart_北京](https://img2024.cnblogs.com/blog/3782412/202606/3782412-20260614193518073-251990511.png)

3.2.4 图片上传与 HTML 推送
先通过 PushPlus 素材库接口上传图片,获得可访问 URL,再拼接出包含渐变背景、圆角卡片和多彩提示条的 HTML,最后调用发送接口:

# 上传图片
img_url = upload_image("chart.png")
# 组装 HTML 卡片
html_content = f"""<div style="..."> ... <img src="{img_url}" /> ...</div>"""
# 推送
payload = {"token": TOKEN, "content": html_content, "template": "html"}
requests.post("https://www.pushplus.plus/send", json=payload)

4. 测试与结果展示

屏幕截图 2026-06-14 141323

chart_杭州

135e43145e97919fbab58d17e74da2f2
!电脑运行
! 手机端

5. 问题与解决

1. 中文乱码

问题现象
matplotlib 生成的温度趋势图中,标题、坐标轴标签的中文显示为小方块。

原因
matplotlib 默认字体不支持中文。

解决方法
在绘图前设置中文字体:

plt.rcParams["font.sans-serif"] = ["SimHei"]       # Windows 常用黑体
# Mac/Linux 可改用 ["PingFang SC"] 或 ["WenQuanYi Micro Hei"]
plt.rcParams["axes.unicode_minus"] = False         # 解决负号显示异常

2. 路径错误:系统找不到指定路径

问题现象
运行脚本时报错 FileNotFoundError 或 “The system cannot find the path specified.”。

原因
使用相对路径(如 logs/、chart_北京.png)时,当前工作目录并非项目根目录。

解决方法
使用相对路径(如 logs/、chart_北京.png)时,当前工作目录并非项目根目录。

3. 推送失败或返回异常

问题现象
调用 PushPlus 接口后,微信未收到消息,日志显示 推送失败

原因与解决
Token 无效:确认已关注 PushPlus 公众号并正确复制 Token,不要有多余空格。

网络超时:增加 timeout 参数,并在代码中加入了 3 次重试机制。

模板格式错误:必须使用 "template": "html" 才能渲染 HTML 内容,纯文本需改为 "txt"。

图片上传失败:检查图片路径是否正确,或改用图床直链替代。

Python 课程感悟与总结


title: Python 课程学习感悟

一学期的 Python 课程结束,从最初对这门语言的一知半解,到能完成一个多功能的天气推送项目,这中间的收获远比我想象的要多。借着这篇感悟,我想梳理一下自己的学习体会,既是对课程的总结,也是对未来学习的鞭策。


1. 从“看代码”到“写代码”

以前学编程,总觉得“看懂就行”。但 Python 课彻底扭转了这个想法。
课程没有停留在语法讲解,而是带着我们边学边做:每一步都需要代码、调 Bug。
正是在这个过程中,我才真正体会到“编程是技能,不是知识”这句话的含义——只有写出来、跑通了,才算学会。


2. Python 的“瑞士军刀”魅力

这门课让我见识了 Python 生态的强大。

  • 爬虫方面,requests 几行代码就能获取网页数据;
  • 数据分析pandas 让结构化处理变得极其优雅;
  • 可视化matplotlib 能画出论文级图表;
  • 自动化schedule + PushPlus 轻松实现微信推送。

更让我惊讶的是,这些强大的工具都是开源免费的。这在以前用的其他编程语言中是很难想象的。这种“站在巨人肩膀上”的开发体验,极大地降低了实现成本,让更多创意能落地。


3. 解决问题的能力才是核心

课程中印象最深的,不是某个函数的用法,而是调 Bug 的过程
中文乱码、路径错误、定时不触发、接口返回异常……每一个问题都让人头疼,但解决之后又充满成就感。
我慢慢摸索出一套排错流程:

  1. 看日志,定位错误行;
  2. 搜索文档或社区(Stack Overflow、博客园);
  3. 做最小化测试,逐步缩小范围;
  4. 实在解决不了,就换个思路或工具。

这种“遇到问题—分析—解决”的思维,我觉得比任何一门课的知识点都更宝贵。


4. 对未来的期待

完成天气推送项目后,我突然意识到,编程的边界其实很小——只要有数据和接口,几乎什么都能自动化
后续我想继续探索:

  • 学习 Flask,把天气推送做成 Web 应用;
  • 接入更多 API(如快递、星座、新闻),做一个生活助手;
  • 尝试用 Python 做量化交易、物联网控制。

课程虽然结束,但 Python 的学习才刚刚开始。


5. 感谢与建议

感谢老师在课堂上手把手演示耐心答疑,尤其是对错误信息的精准解读,让我少走了很多弯路。


结语

Python 课让我从一个编程“旁观者”变成了“实践者”。它教会我的不仅是语法,更是用代码改善生活的思维方式
未来,愿自己保持这份热情,持续用 Python 创造出更多有温度的小工具。感谢王老师的悉心教导。


http://www.rkmt.cn/news/1525766.html

相关文章:

  • 破局进口垄断,深耕本土市场|膜利法则以全产业链实力,重塑国产汽车膜新格局 - 资讯速览
  • UniApp消息推送选型实战:UniPush 2.0 vs 极光推送,从成本到送达率的深度对比
  • 3个步骤掌握Maid:在手机上免费运行AI大模型的终极指南
  • 终极方案:3步彻底解决Cursor自动更新导致试用重置问题
  • 广州擅长职务侵占罪刑事律师推荐榜(2026):涉企经济犯罪辩护深度解析 - 互联网科技品牌测评
  • 基于ML307R Cat.1 4G模块的ESP32智能硬件双网络架构设计与实现
  • 2026年6月最新版来宾正规房屋漏水防水补漏维修口碑名单:创维修缮机构等5家深度测评 - 一修哥咨询
  • OpenGL基础
  • 5分钟掌握猫抓Cat-Catch:浏览器资源嗅探工具的完整使用指南
  • MPC8245 DUART深度解析:从异步串口原理到寄存器编程实战
  • 鸿蒙原生应用实战(五)ArkUI 图片拼接/长图生成:多图合并 + Canvas 绘制 + 导出分享
  • 终极BT下载加速指南:如何用trackerslist项目彻底告别龟速下载
  • 2026年6月最新版莱芜正规房屋漏水防水补漏维修口碑名单:创维修缮机构等5家深度测评 - 一修哥咨询
  • 存算一体芯片软件双模式:单字符驱动网络(普通CPU也能跑)
  • AIOps 智能容量预测与弹性伸缩联动:从经验估算到数据驱动,云资源的成本与性能平衡
  • 深入解析MPC8309 eSDHC中断机制:SDIO通信稳定性的关键
  • 2026年6月最新版酒泉正规房屋漏水防水补漏维修口碑名单:创维修缮机构等5家深度测评 - 一修哥咨询
  • 消费级柔性机器人公司SoulX获融资,首款产品MoYa将带来家庭智能关护新体验!
  • 18-生成器不只是省内存(上)-yield的状态机模型与帧暂停
  • 告别命令行烦恼:将SillyTavern打造成真正的桌面应用,享受一键启动的AI聊天体验
  • 3步搞定洛雪音乐音源配置:免费获取全网无损音乐的终极方案
  • 高压型侧装式磁翻板液位计UXJC-1260-1-A-2
  • FDC故障检测规则设计:从人工经验到AI自动学习
  • MPC8306定时器模块详解:RTC、PIT与GTM的设计原理与工程实践
  • LeetCode 高频题解:滑动窗口与双指针的通用解题框架
  • Java+AI全栈工程师新一代技术人才的进化之路
  • 2026年6月最新版喀什正规房屋漏水防水补漏维修口碑名单:创维修缮机构等5家深度测评 - 一修哥咨询
  • MTK8088单板机制作(二)激活测试
  • 2026年6月最新版黄冈正规房屋漏水防水补漏维修口碑名单:创维修缮机构等5家深度测评 - 一修哥咨询
  • 水机制动屏ZDK-15组合电磁空气阀