# 2025-2026-2 《Python程序设计》实验四报告

2025-2026-2 《Python程序设计》实验四报告

课程:《Python程序设计》
班级:2524
姓名:代林淞
学号:20252428
实验教师:王志强
实验日期:2026年5月18日
必修/选修:公选课

1. 实验内容

Python综合应用:爬虫、数据处理、可视化、机器学习、神经网络、游戏、网络安全等。
本次实验选择爬取天气数据,实现自动化企业微信定时消息提醒。通过调用免费公开天气与空气质量API,获取真实实时气象信息,使用Python进行数据解析与处理,结合定时任务实现每日早上7点自动运行,最终通过企业微信机器人Webhook接口推送天气提醒,综合运用网络请求、JSON解析、定时任务、第三方接口调用等技术,完成Python综合应用实践。

开发工具使用PyCharm,运行环境为Windows系统。

2. 实验过程及结果

实验准备:安装requests第三方库,选取wttr.in天气API与Open-Meteo空气质量API(Github地址: Open-Meteo),无需申请密钥即可获取数据,配置企业微信群机器人Webhook推送地址。
编写爬虫代码:调用天气与空气质量接口,发送网络请求,获取实时天气、今日最高温、最低温、体感温度、湿度、风速、AQI空气质量等信息。
数据处理:解析返回的JSON格式数据,提取关键气象信息,对AQI数值划分优、良、轻度污染等等级,根据温度、降雨、空气质量自动生成出行温馨提示。
消息推送:将整理后的天气信息格式化,调用企业微信Webhook接口,以POST方式发送文本消息。
定时功能:采用时间轮询方式实现定时,先设置1分钟延迟测试推送功能,调试无误后修改为每日早上7点自动执行。
程序调试:解决接口字段缺失、网络连接异常、变量匹配等问题,完善异常捕获,保证程序稳定运行。
实验结果:程序可无人值守自动运行,每日7点准时爬取真实天气数据并推送到企业微信,信息完整、推送稳定,完成全部实验功能。

完整源代码

import requests
import time
from datetime import datetime

# 企业微信机器人Webhook地址
webhook_url = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=d10e9c81-8456-49ee-bc45-2c0f02c74290"

def get_weather():
    try:
        # 获取天气信息
        url = "https://wttr.in/Beijing?format=j1"
        response = requests.get(url, timeout=10)
        data = response.json()

        current = data["current_condition"][0]
        temp = current["temp_C"]
        feelslike = current["FeelsLikeC"]
        sky = current["weatherDesc"][0]["value"]
        wind = current["windspeedKmph"]
        humidity = current["humidity"]

        weather = data["weather"][0]
        temp_min = weather["mintempC"]
        temp_max = weather["maxtempC"]

        # 获取AQI空气质量
        aqi_url = "https://air-quality-api.open-meteo.com/v1/air-quality?latitude=39.9042&longitude=116.4074&current=european_aqi"
        aqi_data = requests.get(aqi_url, timeout=10).json()
        aqi = int(aqi_data["current"]["european_aqi"])

        # AQI等级判断
        if aqi <= 50:
            aqi_level = "优"
        elif aqi <= 100:
            aqi_level = "良"
        elif aqi <= 150:
            aqi_level = "轻度污染"
        elif aqi <= 200:
            aqi_level = "中度污染"
        else:
            aqi_level = "重度污染"

        # 出行温馨提示
        tip_list = []
        if int(temp_min) < 10:
            tip_list.append("⚠️早晚偏凉,注意添衣")
        if int(temp_max) > 28:
            tip_list.append("⚠️白天炎热,做好防晒")
        if "雨" in sky:
            tip_list.append("⚠️今日有雨,出门带伞")
        if aqi > 100:
            tip_list.append("⚠️空气质量一般,减少剧烈运动")
        if not tip_list:
            tip_list.append("☀️天气舒适,出行愉快")
        tip = " ".join(tip_list)

        msg = f"""
【每日7点早安·天气自动提醒】
🌤️ 今日天气:{sky}
🌡️ 当前温度:{temp}℃|体感温度:{feelslike}℃
🌡️ 今日温度范围:{temp_min}℃ ~ {temp_max}℃
💨 风速:{wind} km/h
💧 空气湿度:{humidity}%
🌫️ 空气质量:{aqi_level}(AQI:{aqi})
💡 温馨提示:{tip}
⏰ 推送时间:{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}
"""
        return msg

    except Exception as e:
        return f"【天气推送异常】\n错误信息:{e}\n{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}"

def send_work_wechat():
    message = get_weather()
    payload = {"msgtype":"text","text":{"content":message}}
    requests.post(webhook_url, json=payload)
    print(f"✅ {datetime.now().strftime('%Y-%m-%d %H:%M:%S')} 已推送今日天气")

def timing_task():
    print("程序已启动,等待每日早上7点自动推送...")
    while True:
        now = datetime.now()
        # 每天7:00准时推送
        if now.hour == 7 and now.minute == 0:
            send_work_wechat()
            time.sleep(60)  # 防止重复发送
        time.sleep(30)

if __name__ == "__main__":
    timing_task()

3. 实验过程中遇到的问题和解决过程

问题 1

调用天气 API 时,返回 JSON 字段名称不固定,频繁出现KeyError键缺失报错,无法正常读取空气质量、天气信息。

解决方案:更换稳定免费公开 API,拆分天气与空气质量两个接口分别请求,统一数据字段格式,增加异常捕获语句,避免接口波动导致程序崩溃。

问题 2

定时任务逻辑不完善,仅严格 7:00:00 才执行,若程序启动晚 1 秒则当天不推送,测试不方便。

解决方案:测试阶段修改为延迟 60 秒立即推送,正式版采用轮询判断小时与分钟,只要到达 7 点区间就执行一次推送,同时设置休眠避免重复发送。

问题 3

企业微信推送格式混乱、换行异常,消息排版不美观。

解决方案:使用 f‑string 规范文本格式,统一换行符,增加表情符号优化阅读体验,调试接口确保文本正常发送。

4. 实验感悟

本次综合实验让我熟练掌握了 Python 网络请求、JSON 数据解析、接口调用、定时任务设计等实用技能。天气推送项目贴近生活,将爬虫、数据处理、自动化推送结合在一起,让我理解了 Python 在自动化办公、日常提醒中的实际应用价值。

实验过程中遇到接口不稳定、字段报错、定时逻辑错误等问题,通过查阅资料、调试代码、分步测试逐一解决,提升了自己的排错能力和代码规范意识。同时认识到第三方接口存在不稳定性,编写程序时需要做好异常处理,保证程序健壮性。

通过本次实验,我对 Python 综合应用有了更全面的认识,今后可以拓展实现多城市天气推送、添加降水概率、紫外线等更多气象指标,进一步完善自动化项目。

全课总结:

通过这次Python课程,我深刻感受到Python语言相较于C++的简洁与强大。课程帮助我系统地掌握了编程基础概念和知识,学会了很多Python内置函数以及第三方库的用法。同时,我们也接触了socket编程和爬虫这类实践性很强的技术,让我真正体会到用Python解决实际问题的能力。

更重要的是,我意识到写代码不能只追求功能实现,还需要具备严谨的计算机思维,提前考虑各种意外情况,比如数据溢出、死循环、输入异常等。同时,我也规范了命名风格,学会了如何有效调试代码,掌握了从零开始组织一个项目代码的正确流程。此外,我还了解了Gitee/GitHub这类代码托管平台,并学会了如何创建和使用自己的库。

课程感想:

老师的讲解简单明了,每节课都能让我实实在在地学到新东西。我非常喜欢上老师的Python课,课程内容既有基础又有实战,收获满满。不愧是dky第一难抢的课,能选上真的太值了!

posted @ 2026-05-18 19:11  Doglists  阅读(39)  评论(0)    收藏  举报