# 天气数据自动采集与推送系统——定时任务与自动化采集 教学设计

| **课题** | **天气数据自动采集与推送系统——定时任务与自动化采集** |
|---------|------------------------------------------|
| **课时** | 1课时(40分钟) |
| **教学目标** | **知识目标**：理解定时任务的概念与应用场景，掌握schedule库的基本使用方法，了解程序保活与后台运行的基本原理。<br>**技能目标**：能够使用schedule库创建定时任务，能够将前两节课的天气采集模块整合为自动化运行程序，能够实现"每隔N分钟自动采集并保存数据"的完整功能，能够添加日志记录与异常处理确保程序稳定运行。<br>**素养目标**：建立"自动化思维"，理解软件系统的无人值守运行模式，培养将技术能力转化为实用工具的工程意识。 |
| **教学重难点** | **重点**：schedule库的安装与基本API使用；定时任务的创建、调度与触发；程序保活的while循环实现；日志记录的规范写法。<br>**难点**：理解schedule的非阻塞调度机制与run_pending()的作用；设计合理的任务执行间隔；处理长时间运行程序的异常与资源管理。 |
| **教学资源准备** | 多媒体课件（含定时任务场景案例、系统架构图）；前两节课完成的weather_fetcher.py和multi_thread_fetcher.py模块；schedule库安装包；日志配置示例代码；完整项目运行演示视频。 |

## 教学过程

| 教学环节 | 教学内容 | 教师活动 | 学生活动 | 设计意图 |
|:---------|:---------|:---------|:---------|:---------|
| **1. 自动化场景导入**<br>(6分钟) | 展示生活中的自动化案例（如定时提醒、自动备份），引出"让天气采集程序自动运行"的需求，明确本课时要实现的项目最终目标。 | **场景列举**<br>列举自动化应用：闹钟、定时发送报表、服务器定时备份等，提问："我们的天气系统如何做到每小时自动采集？"<br><br>**目标演示**<br>播放完整项目运行视频：程序启动后自动每30分钟采集一次数据，保存到文件并输出日志，无需人工干预。 | **联系经验**<br>回忆日常使用的自动化功能，理解"定时执行"的价值；<br><br>**明确目标**<br>观看演示，建立"让程序自己跑起来"的认知，理解本课时是项目的"收官之作"。 | 通过生活化案例建立自动化认知；通过完整演示展示项目最终形态，激发学生的成就欲望和完成项目的动力。 |
| **2. 定时任务原理**<br>(7分钟) | 讲解定时任务的实现机制，介绍Python的schedule库，演示基本的任务调度代码，说明"调度循环"的概念。 | **原理讲解**<br>说明定时任务的本质：程序持续运行，定期检查是否到达执行时间；介绍schedule库是对时间检查逻辑的封装；<br><br>**基础演示**<br>编写简单示例：<br>```python<br>import schedule<br>import time<br>def job():<br>    print("任务执行！")<br>schedule.every(10).seconds.do(job)<br>while True:<br>    schedule.run_pending()<br>    time.sleep(1)<br>```<br>逐行讲解：定义任务函数、设置调度规则、启动循环检查。 | **聆听理解**<br>理解"持续检查+触发执行"的调度机制，记录schedule的核心API；<br><br>**代码跟随**<br>输入演示代码并运行，观察每10秒自动执行一次的效果，尝试修改间隔时间（如30秒、1分钟）。 | 通过原理讲解揭开定时任务的"神秘面纱"；通过简单示例建立"设置规则-启动循环"的操作模型，为项目集成打基础。 |
| **3. 项目模块集成**<br>(13分钟) | 指导学生创建主程序文件，整合前两节课的采集模块，实现"定时自动采集多城市天气并保存"的完整功能，添加时间戳与日志输出。 | **架构讲解**<br>说明项目文件结构：weather_fetcher.py（单城市）、multi_thread_fetcher.py（并发）、main_scheduler.py（定时主程序）；<br><br>**集成演示**<br>演示main_scheduler.py编写过程：<br>```python<br>import schedule<br>from multi_thread_fetcher import fetch_all_cities<br>def auto_fetch():<br>    data = fetch_all_cities()<br>    # 保存到文件，添加时间戳<br>    print(f"[{time.strftime('%Y-%m-%d %H:%M:%S')}] 采集完成")<br>schedule.every(30).minutes.do(auto_fetch)<br>```<br>讲解数据保存方案（CSV或JSON）、时间戳格式化；<br><br>**运行测试**<br>启动程序，观察首次执行和后续自动触发的效果。 | **理解架构**<br>明确各模块的职责分工，理解main_scheduler是"指挥中心"；<br><br>**动手编码**<br>创建main_scheduler.py，导入并发采集模块，设置定时规则（如每30分钟），添加数据保存代码；<br><br>**测试验证**<br>运行程序，确认定时执行正常，检查保存的数据文件格式与内容。 | 通过模块集成培养系统化编程思维；通过完整实现建立"小模块组成大系统"的认知；通过实际运行验证项目的实用性。 |
| **4. 稳定性优化**<br>(10分钟) | 讲解长时间运行程序的常见问题，指导学生添加异常处理、日志记录、资源管理等代码，确保程序稳定可靠。 | **问题分析**<br>说明长期运行可能遇到的问题：网络故障、API限流、内存泄漏等；强调健壮性的重要性；<br><br>**优化方案**<br>演示添加try-except包裹任务函数、配置logging模块记录日志：<br>```python<br>import logging<br>logging.basicConfig(filename='weather.log', level=logging.INFO)<br>def auto_fetch():<br>    try:<br>        # 采集逻辑<br>        logging.info("采集成功")<br>    except Exception as e:<br>        logging.error(f"采集失败：{e}")<br>```<br>讲解日志级别（INFO、ERROR）、日志文件的查看方法；<br><br>**最佳实践**<br>建议添加程序启动提示、优雅退出机制（Ctrl+C处理）。 | **认识风险**<br>理解"程序不能假设一切正常"的思想，记录异常处理的必要性；<br><br>**优化代码**<br>为auto_fetch()添加try-except，配置logging输出到文件，测试故意制造错误（如API密钥错误）观察日志记录；<br><br>**完善程序**<br>添加程序启动提示信息，如"天气采集系统已启动，每30分钟执行一次"。 | 通过问题分析培养风险意识；通过优化方案教学提升代码质量；通过日志实践建立生产级程序的开发习惯。 |
| **5. 项目总结与展望**<br>(4分钟) | 回顾整个项目的三个核心模块，总结从HTTP请求到多线程再到自动化的完整技术链条，展望后续可扩展的功能方向。 | **项目回顾**<br>梳理项目实现路径：第1课时建立数据源→第2课时提升采集效率→第3课时实现自动化运行；<br><br>**成果展示**<br>请学生展示运行中的程序和保存的数据文件，分享项目完成的成就感；<br><br>**扩展方向**<br>提出可选的增强功能：数据可视化（matplotlib）、极端天气告警推送（邮件/短信）、Web界面展示等；<br><br>**任务布置**<br>课后任务：让程序在电脑上持续运行24小时，观察日志并统计采集成功率。 | **总结反思**<br>回顾三次课的学习历程，理解"技术服务于需求"的思想；<br><br>**展示成果**<br>演示自己的运行程序，分享实现过程中的收获与困难；<br><br>**展望未来**<br>思考项目的实用场景和可改进方向，接收课后实验任务。 | 通过系统回顾强化知识体系；通过成果展示建立成就感与自信；通过扩展方向保持学习兴趣和探索欲望。 |

## 板书设计

```
天气数据自动采集系统 - 完整架构

┌─────────────────────────────────────┐
│   main_scheduler.py (定时调度主程序) │
│   ├── schedule.every(30).minutes    │
│   ├── 异常处理 + 日志记录            │
│   └── while True: run_pending()     │
├─────────────────────────────────────┤
│   multi_thread_fetcher.py (并发模块) │
│   └── ThreadPoolExecutor 并发采集    │
├─────────────────────────────────────┤
│   weather_fetcher.py (数据源模块)    │
│   └── requests.get() 调用API        │
└─────────────────────────────────────┘
           ↓
    自动保存数据文件 + 日志文件

核心代码:
schedule.every(30).minutes.do(任务函数)
while True:
    schedule.run_pending()
    time.sleep(1)
```

## 教学成效与反思

| | |
|:---|:---|
| **教学成效** | 结合本课时项目任务评估：95%学生成功实现定时自动采集功能，85%学生能够添加完整的异常处理与日志记录。通过三节课的连贯学习，学生完整经历了"单功能模块→性能优化→系统集成"的项目开发过程，对软件工程的模块化思想有了深刻体会。定时任务的实现让学生看到了"程序自己工作"的魅力，课堂兴奋度和成就感达到高峰。项目最终成果具有实用性，部分学生表示愿意持续运行并收集数据做后续分析，显示出强烈的学习内驱力。日志记录的引入提升了学生对"生产级代码"的认知。 |
| **教学反思** | 本课时成功将"定时任务与自动化"概念转化为"让天气系统自动运行"的具体目标，学生的学习动机和参与度极高。三节课形成的完整项目链条设计合理，每节课的模块都能无缝集成到最终系统中，验证了项目式教学的有效性。schedule库的简洁API降低了定时任务的学习门槛，学生普遍反馈"比想象中容易"。不足之处：①在40分钟内，对"程序后台运行"的操作系统层面知识（如nohup、系统服务等）未能涉及，部分学生询问"如何让程序关闭终端后仍运行"，建议作为课后拓展资料补充；②日志配置部分主要由教师演示，学生自主设计日志格式的时间不足，建议提供更灵活的日志模板让学生定制；③对"定时任务的精度限制"（如schedule是软实时）未做说明，可能导致学生对时间准确性有过高期待。整体上，项目式教学使三个看似独立的技术主题（HTTP、多线程、定时任务）自然融合为一个有机整体，学生在完成项目的过程中建立了系统化思维和工程实践能力，教学目标超预期达成。建议后续可将此项目作为综合实训案例，引导学生继续扩展功能（如添加Web界面、数据分析模块等）。 |