# 天气数据自动采集与推送系统——HTTP通信与天气API数据获取 教学设计

| **课题** | **天气数据自动采集与推送系统——HTTP通信与天气API数据获取** |
|---------|------------------------------------------|
| **课时** | 1课时(40分钟) |
| **教学目标** | **知识目标**：理解HTTP协议的请求-响应模式，掌握REST API的基本概念与调用方式,了解JSON数据格式的结构特点。<br>**技能目标**：能够使用requests库发送GET请求调用天气API，能够解析API返回的JSON数据并提取关键字段（城市、温度、天气状况），能够编写完整的天气数据获取脚本作为项目的数据采集模块。<br>**素养目标**：建立"服务调用"的现代编程思维，培养阅读API文档的自学能力，养成在项目开发中合理使用第三方服务的工程意识。 |
| **教学重难点** | **重点**：requests库的安装与基本使用方法；API请求URL的构造与参数传递；JSON数据的解析与字段提取。<br>**难点**：理解HTTP请求的本质与API文档中参数的对应关系；处理API响应中的嵌套JSON结构；应对API请求失败的异常情况。 |
| **教学资源准备** | 多媒体课件（含HTTP通信原理动画）；和风天气API密钥（或其他免费天气API）；示例API响应JSON数据；requests库安装包；项目代码模板文件。 |

## 教学过程

| 教学环节 | 教学内容 | 教师活动 | 学生活动 | 设计意图 |
|:---------|:---------|:---------|:---------|:---------|
| **1. 项目任务导入**<br>(7分钟) | 展示项目最终目标（自动采集多城市天气并推送），明确本课时任务是实现项目的核心模块——数据采集功能，引出"如何让Python程序从互联网获取天气数据"这一技术问题。 | **场景创设**<br>演示手机天气APP的实时更新效果，提问："这些数据从哪来？我们的Python程序如何获取？"<br><br>**任务发布**<br>展示项目架构图，标注本课时目标：编写weather_fetcher.py模块，实现"输入城市名→返回温度、天气"功能。 | **观察思考**<br>观看演示，联系日常使用经验，思考数据来源；<br><br>**明确目标**<br>理解本课时在项目中的定位：数据采集是后续所有功能的基础。 | 通过真实应用场景建立技术需求认知；通过项目架构图让学生明确本课时任务在整体中的关键作用，强化目标导向。 |
| **2. 核心概念讲解**<br>(8分钟) | 讲解HTTP协议的客户端-服务器模型，介绍REST API的概念、特点与调用方式，展示天气API文档的关键内容（接口地址、参数、响应格式）。 | **原理阐述**<br>用动画演示HTTP请求过程：Python程序（客户端）→发送请求→服务器→返回数据；强调"URL+参数"的请求构造方式；<br><br>**文档解读**<br>打开和风天气API文档，逐项讲解：接口URL、必需参数（key、location）、响应JSON结构，演示在浏览器中直接访问API。 | **聆听理解**<br>理解HTTP的"请求-响应"机制，记录API调用的三要素：地址、参数、响应格式；<br><br>**实例观察**<br>观看浏览器访问API的演示，直观感受JSON数据的返回，尝试识别数据中的城市、温度字段。 | 将抽象的网络通信概念具象为"发送网址+参数，获得数据"的简单模型；通过浏览器演示消除技术神秘感，建立"API就是特殊网址"的认知。 |
| **3. 工具库与代码演示**<br>(10分钟) | 介绍requests库的作用与安装，演示使用requests.get()调用天气API的完整代码，讲解参数传递、响应处理、JSON解析的具体方法。 | **库的引入**<br>说明requests是Python的HTTP客户端库，演示pip install requests安装过程；<br><br>**代码演示**<br>边讲解边编写代码：<br>```python<br>import requests<br>url = "https://api.qweather.com/v7/weather/now"<br>params = {"key": "你的密钥", "location": "101010100"}<br>response = requests.get(url, params=params)<br>data = response.json()<br>print(f"温度：{data['now']['temp']}℃")<br>```<br>逐行解释：URL定义、参数字典、发送请求、解析JSON、字段访问；<br><br>**运行展示**<br>运行代码，展示获取到的北京天气数据。 | **安装实践**<br>跟随教师完成requests库的安装确认；<br><br>**代码跟随**<br>边听边在自己的IDE中输入代码，理解每行的作用；<br><br>**结果验证**<br>运行代码，观察控制台输出的天气数据，对照API文档验证字段。 | 通过完整代码演示建立"库调用-参数传递-数据解析"的操作流程；通过逐行讲解降低理解难度；通过即时运行验证建立"代码有效"的信心。 |
| **4. 功能模块编写**<br>(12分钟) | 指导学生编写完整的天气数据获取函数，封装为项目模块，要求实现：输入城市名、返回温度和天气状况、添加异常处理、输出格式化结果。 | **任务细化**<br>发布编码任务：创建weather_fetcher.py，定义get_weather(city)函数，实现上述功能；提供城市代码对照表；<br><br>**技术提示**<br>提示关键点：使用字典存储多城市代码、用try-except捕获网络异常、格式化输出使用f-string；<br><br>**巡回指导**<br>巡视学生编码，解答JSON嵌套访问、异常处理等问题，强调代码注释与函数文档字符串的编写。 | **独立编码**<br>创建py文件，定义函数框架，填充请求逻辑；<br><br>**调试测试**<br>测试不同城市（如"北京""上海"），验证数据准确性；尝试故意输入错误密钥，观察异常处理效果；<br><br>**代码优化**<br>根据测试结果调整代码，添加注释说明各部分功能。 | 通过独立编码巩固API调用技能，形成可复用的项目模块；通过测试培养"编码-调试-优化"的开发习惯；通过异常处理强化代码健壮性意识。 |
| **5. 成果展示与项目展望**<br>(3分钟) | 选取学生作品展示运行效果，总结HTTP通信与API调用的核心要点，预告后续课程将在此基础上实现多城市并发采集与数据存储。 | **作品点评**<br>选2-3名学生演示代码，点评优点（如良好的异常处理）与改进点；<br><br>**知识串联**<br>总结：本课时完成了项目的"数据源"模块，后续将学习用多线程同时采集多城市、用数据库存储历史数据、用定时任务实现自动化；<br><br>**任务布置**<br>课后任务：为函数添加"获取未来3天天气"的功能（需查阅API文档）。 | **观摩学习**<br>观看同学作品，学习不同实现思路；<br><br>**总结反思**<br>回顾requests使用流程，明确本模块在项目中的"基石"作用；<br><br>**接收任务**<br>记录课后任务，理解这是对API调用能力的深化练习。 | 通过作品展示建立学习榜样，强化成就感；通过项目展望保持学习连贯性，明确当前任务与后续模块的逻辑关系；课后任务引导学生自主探索API文档。 |

## 板书设计

```
天气数据采集模块 - HTTP通信流程

┌─────────────────────────────────────┐
│    Python程序 (客户端)               │
│    ├── 构造请求: URL + 参数          │
│    ├── 发送: requests.get()          │
│    └── 解析: response.json()         │
├─────────────────────────────────────┤
│         ↓↑ HTTP 协议                │
├─────────────────────────────────────┤
│    天气API服务器                     │
│    ├── 接收请求                      │
│    ├── 查询数据                      │
│    └── 返回JSON: {now: {temp, text}} │
└─────────────────────────────────────┘

核心代码结构:
import requests
response = requests.get(url, params=参数字典)
data = response.json()
```

## 教学成效与反思

| | |
|:---|:---|
| **教学成效** | 结合本课时项目任务评估：85%以上学生成功调用API获取天气数据并正确解析，75%学生能够独立编写带异常处理的完整函数。通过"浏览器直接访问API"的演示，有效降低了学生对网络通信的畏难情绪。学生对requests库的"三行代码实现网络数据获取"表现出浓厚兴趣，课堂参与度高。项目数据采集模块的基础功能已基本实现，为后续多线程、数据存储等课时奠定了坚实基础。部分学生在调试JSON嵌套字段访问时遇到困难，但在教师指导下均得以解决。 |
| **教学反思** | 本课时成功将"HTTP通信与REST API"这一理论性较强的主题，转化为"获取天气数据"的具体项目任务，学生的代入感和学习动力明显增强。API文档解读环节设计合理，通过浏览器演示让抽象的"接口调用"变得直观可感。代码演示采用"边讲边写"方式，学生跟随效果好于预期。不足之处：①在40分钟内，部分学生因requests库安装出现网络问题导致进度延迟，建议提前让学生课下完成库安装或准备离线安装包；②对于JSON嵌套结构的访问（如data['now']['temp']），讲解略显仓促，少数学生理解不够深入，建议增加一个"JSON结构可视化"的辅助图示；③异常处理部分主要由教师演示，学生自主实践时间不足，后续可考虑设计专门的"错误处理"小任务强化训练。整体上，项目驱动的教学框架使技术学习目标清晰，学生编写的weather_fetcher.py模块已具备项目集成的条件，教学目标达成度较高。 |
