2024-2025-2 20243422 余岢璇《Python程序设计》综合实践报告(实验四)

2024-2025-2 20243422 余岢璇《Python程序设计》综合实践报告(实验四)

课程:《Python程序设计》
班级:2434
姓名:余岢璇
学号:20243422
实验教师:王志强老师
实验日期:2025年5月14日
必修/选修:公选课

一、选题

在学习网络爬虫的时候,觉得爬虫很有意思,联系到我们学校每天6:30的跑操制度,所以将目标定位在利用爬虫在中国天气网上爬取天气,再利用python编码实现爬虫爬取到当日天气,倘若第二天下雨或者大风四级以上,就自动在班级群里发送不跑操通知。

二、实验目的

1.通过本次实验,可以进一步加强我对于爬虫的理解与认识,同时拓展了解wxauto库的功能;
2.除此之外,此程序若被学工部老师征用,老师则可解放双手,让程序自动爬取天气后发送不跑操通知,大大提高了工作效率,具有较强的实用价值。

三、实验分析与过程

1.首先实现微信自动发消息的功能,一开始了解到的是itchat,登录微信后即可实现自动发消息,但是实用微信扫码后发现怎么都登不上,后来通过网上查阅资料得知itchat只能登陆微信电脑版,而微信电脑版较难操作无法登录,所以选用wxauto库实现自动发消息的功能。以下是微信自动发消息代码的测试。
代码:

from wxauto import WeChat
wx = WeChat()
who = "文件传输助手"
def sendmassage(Msg):
    wx.SendMsg(Msg, who)
def main():
    sendmassage("aaa")
if __name__ == '__main__':
    main()

测试成功截图:

2.现在编写一个爬取天气的代码,将代码分解为n个小函数
函数1:check(url) 检查是否能够登入所爬取的页面
代码实现:

def check(url):
    r = requests.get(url)
    r.encoding = r.apparent_encoding
    if not r.status_code==requests.codes.ok:
        print("❗❗❗❗❗❗❗❗❗❗访问错误❗❗❗❗❗❗❗❗❗❗")
        return " "
    else:
        print("⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐成功访问⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐")
        return  r.text

函数2:findweather() 找寻第二天的天气
首先control + shift + c找到天气数据,其次依次爬取目标数据

def findweather(html):
        bs = BeautifulSoup(html, "html.parser")  
        body = bs.body
        data = body.find('div', { 'id': '7d'})  # 在7天天气里面找到第二天的天气
        ul = data.find('ul',{'class':'t clearfix'})
        li = ul.find('li',{'class':'sky skyid lv2'})
        weather = li.find('p',{'class':'wea'}).string #找到晴雨情况
        #print(weather)
        wind = li.find('p',{'class':'win'})
        force = wind.find('i').string
        #print(force) #找到风力
        return weather+force

函数3:judge(sentence) 若风力大于等于四级,或者第二天下雨,则不跑操
由于条件限制不多,且北京风力很少超过8级,故简单地实现了如下代码:

def judge(sentence):
    if "雨" in sentence:
        return 1
    if '4' in sentence:
        return 1
    if '5' in sentence:
        return 1
    if '6' in sentence:
        return 1
    if '7' in sentence:
        return 1
    if '8' in sentence:
        return 1
    if '9' in sentence:
        return 1
    return 0

函数4:sendmassage(msg) 如果可以实现不跑操的情况,则发送不跑操通知
拓展函数5:write_csv()与read_csv() 创建一个文件,将每天跑操情况存入其中,方便数据统计

def write_csv(file_name, data, field_names=None):
    with open(file_name, 'w', newline='', encoding='utf-8') as file:
        if field_names:
            writer = csv.DictWriter(file, fieldnames=field_names)
            writer.writeheader()
            writer.writerows(data)
        else:
            writer = csv.writer(file)
            writer.writerows(data)

def read_csv(file_name):
    with open(file_name, 'r', newline='', encoding='utf-8') as file:
        reader = csv.reader(file)
        for row in reader:
            print(row)

四、实验过程中遇到的问题和解决过程

问题1: 在创建csv文件后写入数据,读出的数据并没有达到预期效果,如图

问题1解决方案: 在ai辅助后,发现writerows需要的是可以迭代的序列,而原先我的temp是一个字典,除此之外,在findweather()中,每次我都重新修改了temp,但是temp作为一个全局变量,可能会保留之前的值,可是修改过后,仍未达到要求,将所有代码重写,发现若一个数据要加入到一个表头的下面,还是需要字典,于是通过字典,并重新优化了表头编写的判断条件,加入了读取数据的函数

修改方法:在findweather 的return处作优化,改为return weather,force
感悟:通过这个问题的解决,我再一次体验到了python的方便
问题解决:

问题2: 在编写judge()函数时,方法过于繁琐,以下为ai修正后的代码

    if "雨" in sentence:
        return 1
    if any(str(i) in sentence for i in range(4, 10)):  # 检查 4-9 级风
        return 1
    return 0

问题3: 刚开始在编写sendmassage(msg)函数时,用了itchat库,发现这个库太老了,并且不支持手机版微信发送消息。
问题3解决方案: 通过csdn查询资料,发现还有wxwuto可用,故改用wxauto。

五、代码设计

下载相关库:requests、wxauto、csv等等
具体代码如下:

import csv
from tabnanny import check
import requests
from bs4 import BeautifulSoup
import csv
import json
import requests
import csv
from datetime import datetime
from wxauto import WeChat
import os

wx = WeChat()
who = "文件传输助手"

def sendmassage(Msg):
    wx.SendMsg(Msg, who)

def check(url):
    r = requests.get(url)
    r.encoding = r.apparent_encoding
    if not r.status_code==requests.codes.ok:
        print("❗❗❗❗❗❗❗❗❗❗访问错误❗❗❗❗❗❗❗❗❗❗")
        return " "
    else:
        print("⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐成功访问⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐")
        return  r.text

def judge(sentence):
    if "雨" in sentence:
        return 1
    if any(str(i) in sentence for i in range(4, 10)):  # 检查 4-9 级风
        return 1
    return 0

def findweather(html):
        bs = BeautifulSoup(html, "html.parser")  # 创建BeautifulSoup对象
        body = bs.body
        data = body.find('div', { 'id': '7d'})  # 找到div标签且id = 7d
        ul = data.find('ul',{'class':'t clearfix'})
        li = ul.find('li',{'class':'sky skyid lv2'})
        weather = li.find('p',{'class':'wea'}).string
        #print(weather)
        wind = li.find('p',{'class':'win'})
        force = wind.find('i').string
        #print(force)

        return weather, force

def write_csv(file_name, data, field_names=None):

    with open(file_name, 'w', newline='', encoding='utf-8') as file:
        if field_names:
            writer = csv.DictWriter(file, fieldnames=field_names)
            writer.writeheader()
            writer.writerows(data)
        else:
            writer = csv.writer(file)
            writer.writerows(data)

def read_csv(file_name):

    with open(file_name, 'r', newline='', encoding='utf-8') as file:
        reader = csv.reader(file)
        for row in reader:
            print(row)

def main():

    file_name = 'run_yes&no.csv'
    url = 'http://www.weather.com.cn/weather/101010100.shtml'
    html = check(url)
    weather, force = findweather(html)

    data = weather + force
    print(data)

    j = judge(data)
    if j == 1:
        sendmassage("明天不跑操哈哈哈哈")
        run_status = '✔'
    else:
        run_status = '×'
    data_dict = [
        {'天气': weather, '风力': force, '跑操情况':run_status}
    ]


    write_csv(file_name, data_dict, field_names=['天气', '风力', '跑操情况'])

    read_csv(file_name)

if __name__ == '__main__':
    main()

将代码托管到GITEE:https://gitee.com/uunnnn/gitee/commit/6516eb4f4be45a7629be4eb82d57206488056904

六、实验结果

  1. 演示视频:
    https://www.bilibili.com/video/BV1XsTiz4ETf/

  2. 实验截图:
    发送信息截图:

运行截图:

csv文件:

七、实验感悟与课程总结

写了一天终于把实验写完了,一开始实验过程特别顺利,同学们在爬虫中遇到的问题我都没遇到,可是在保存文件的过程中遇到了不少问题,要么是报错,要么存进文件的格式不对。最终依靠ds,终于改对了,通过这个实验,我再一次体会到了ai的用处,同时也收获了成功的喜悦。
在此特别鸣谢王志强老师,因为王老师生动形象,幽默风趣的教学,使我与python,与编程结下了不解之缘,虽然python课程已经结束了,但是以后的日子里我也会打开我的pycharm,编写一些有趣的小程序,学习一些有意思的库函数。不得不说python真是博大精深,同时我也体会到了编程自动化的方便之处,学习一门课的最好方法就是将其融入到日常生活的运用之中,我认为王老师的教学很好的体现了这一点,寓教于乐,才是学习的最好途径。

posted @ 2025-06-09 21:29  uunn  阅读(34)  评论(0)    收藏  举报