110
社区成员




课程:《Python程序设计》
班级: 2323
姓名: 李冠呈
学号:20232305
实验教师:王志强
实验日期:2024年5月15日
必修/选修: 公选课
一、实验整体内容
Python综合应用:爬虫、数据处理、可视化、机器学习、神经网络、游戏、网络安全等。
1、编写从社交网络爬取数据,实现可视化舆情监控或者情感分析。
2、利用公开数据集,开展图像分类、恶意软件检测等
3、利用Python库,基于OCR技术实现自动化提取图片中数据,并填入excel中。
4、爬取天气数据,实现自动化微信提醒
5、利用爬虫,实现自动化下载网站视频、文件等。
6、编写小游戏:坦克大战、贪吃蛇、扫雷等等
注:在Windows/Linux系统上使用VIM、PDB、IDLE、Pycharm等工具编程实现。
二、实验内容
爬取天气数据,实现微信自动化提醒
(1)首先寻找一个可以便于爬取并且便于寻找HTML的网站,同时网站还要有足够多的信息
最后找到了这个网站
https://baidu.weather.com.cn/mweather15d/401090020201.shtml
(2)然后通过查看寻找网站的HTML结构,开始编写代码
先引入实验所需的库
import requests
from bs4 import BeautifulSoup as bs
import pandas as pd
import time
import pyautogui as pg
import pyperclip as pc
然后找到user-argent,并且解析HTML结构,爬取天气数据,并将其保存为文件
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36 Edg/125.0.0.0',
'Accept-Encoding': "gzip, deflate",
'Connection': "keep-alive",
'cache-control': "no-cache"
}
url = 'https://baidu.weather.com.cn/mweather15d/401090020201.shtml'
resp = requests.request("GET", url, headers=headers)
resp.encoding = 'utf-8'
soup = bs(resp.text, 'html.parser')
data_all = []
weather_table = soup.find("div", {"id": "listBox"}) # 根据实际HTML结构进行调整
if weather_table:
weather_items = weather_table.find_all("li")
for item in weather_items:
date = item.find("p", {"class": "date"}).text.strip()
day_of_week = item.find("p", {"class": "week"}).text.strip()
day_weather_desc = item.find("span", class_="weatherWord").text.strip()
day_temp = item.find("span", class_="d-temp").text.strip()
night_weather_desc = item.find_all("span", class_="weatherWord")[1].text.strip()
night_temp = item.find_all("span", class_="n-temp")[0].text.strip()
wind_elem = item.find("div", class_="list-right-wind")
wind_info = " ".join([w.text.strip() for w in wind_elem.find_all("span")])
data_all.append([date, day_of_week, day_temp, night_temp, day_weather_desc, night_weather_desc, wind_info])
weather_df = pd.DataFrame(data_all, columns=["日期", "星期", "最高气温(℃)", "最低气温(℃)", "白天天气", "夜间天气", "风向信息"])
weather_df.to_csv("天气信息.csv", encoding="utf_8", index=False)
print("天气信息已保存到 '天气信息.csv'")
(3)实现向微信自动发送消息
wechat_contact = "文件传输助手"
csv_file_path = "天气信息.csv"
data = pd.read_csv(csv_file_path)
print(data)
# 打开微信并选中联系人
pg.hotkey('ctrl', 'alt', 'w')
time.sleep(2)
pg.hotkey('ctrl', 'f')
time.sleep(1)
pc.copy(str(wechat_contact))
pg.hotkey('ctrl', 'v')
time.sleep(2)
pg.press('enter')
time.sleep(1)
pc.copy(str(data))
pg.hotkey('ctrl', 'o')
time.sleep(2)
pg.hotkey('ctrl', 'v')
pg.press('enter')
time.sleep(2)
(4)实验结果
问题一:找网站时经常找到难以获得HTML共性结构的网站
解决方案:听取同学建议
问题二:不知道如何查看网站的HTML结构并将有用的信息提取出来。
解决方案:通过B站学习和gpt学会HTML作用和如何查看HTML结构并提取有用信息。
问题三:在发送信息到微信时,用pg.typewrite()函数总报错,而且不能将想要的信息写入聊天框内。
解决方案:不使用该函数,改为将需要的信息复制粘贴下来再发送。
首先先说本次实验,开始我的构想是做一个可以实现爬取足球赛程的爬虫,实现不仅能够爬取自己想要的足球队的赛程,并且能够在开赛前发送微信提醒,在比赛结束后发送微信告知比赛结果。因为我开始想的是这个想法和天气预报并提醒的基本逻辑是一样的,所以应该只需要稍加改动应该就能实现。但实际操作时我就发现我的想法有点天真。首先很难找到有所有联赛赛程的网站,其次这些网站的HTML结构相当复杂,而且并不是以某个队的队名作为共性元素,比如如果你想查曼联的赛程,在Sofascore上不能通过队名作为共性元素,而是以赢的队伍和输的队伍,咪咕上则是以队伍的主客场来作为共性元素,这与我最开始的想法有很大不同,查找也相当麻烦。而且即使能够爬取,在我目前力所能及的范围也就能做到爬取单一的队而不是想爬哪个爬哪个,所以只能放弃。
再说说这们课程感悟,我学习这门课的初衷是受到了学长的安利,他们说这节课很有意思,老师也很有水平,有人格魅力,于是我选了这门课。在学习的过程中我逐渐发现python这门语言的强大之处,不仅极其容易上手,而且功能十分强大。如果说学习C语言两个学期也就刚刚勉强学会走,那么学python一个学期就几乎可以上场踢球了。不仅如此,pycharm的功能也是强大到夸张,感觉它自己就可以编写程序,几乎不需要我动手,而爬虫也让我感叹python的极强的实用性和极低的上手难度,只要稍微有一点基础就能在几天之内学会爬虫,写出自己的爬虫代码。这让我真切地体会到“人生苦短,我学python”