一、主题页面的结构与特征分析
1.主题页面的结构与特征分析
目标内容界面:
2. Htmls 页面解析
3.节点查找方法与遍历方法
查找方法:find(): 查找第一个匹配到的节点。find_all(): 查找所有匹配到的节点,并返回一个列表。
遍历方法:contents: 返回当前节点的直接子节点列表。 children: 返回当前节点的直接子节点的迭代器。descendants: 返回当前节点的所有子孙节点的迭代器。
parent: 返回当前节点的父节点。parents: 返回当前节点的所有祖先节点的迭代器。
二、网络爬虫程序设计
1.数据爬取与采集
数据源:https://lishi.tianqi.com/quanzhou/
所用到的库有
1 import requests # 模拟浏览器进行网络请求
2 from lxml import etree # 进行数据预处理
3 import csv # 进行写入csv文件
使用requests中的get方法对网站发出请求,并接收响应数据,
1 resp = requests.get(url, headers=headers)
我们便得到了网页的源代码数据,
2.对数据进行清洗和处理
然后对爬取的网站源代码进行预处理
1 resp_html = etree.HTML(resp.text)
使用xpath工具提取我们所需要的数据
1 resp_list = resp_html.xpath(“//ul[@class=‘thrui’]/li”)
创建一个字典,并使用for循环将我们所提取的数据,放入字典中
1 for li in resp\_list: 2 day\_weather\_info = {} 3 # 日期
4 day\_weather\_info\['date\_time'\] = li.xpath("./div\[1\]/text()")\[0\].split(' ')\[0\]
5 # 最高气温 (包含摄氏度符号)
6 high = li.xpath("./div\[2\]/text()")\[0\]
7 day\_weather\_info\['high'\] = high\[:high.find('℃')\]
8 # 最低气温
9 low = li.xpath("./div\[3\]/text()")\[0\]
10 day\_weather\_info\['low'\] = low\[:low.find('℃')\]
11 # 天气
12 day\_weather\_info\['weather'\] = li.xpath("./div\[4\]/text()")\[0\]
13 weather\_info.append(day\_weather\_info)
14 return weather\_info
然后我们便得到了我们所需要的数据
接着爬取我们这个月的天气信息,存入列表中,然一次性写入我们的csv文件中,这样我们就得到了一个存有泉州2022全年天气情况的文件
# for循环生成有顺序的1-12
for month in range(1, 13):
# 获取某一月的天气信息
# 三元表达式
weather\_time = '2022' + ('0' + str(month) if month < 10 else str(month))
print(weather\_time)
url \= f'https://lishi.tianqi.com/quanzhou/{weather\_time}.html'
# 爬虫获取这个月的天气信息
weather = getWeather(url)
# 存到列表中
weathers.append(weather)
print(weathers)
# 数据写入(一次性写入)
with open("weather.csv", "w",newline='') as csvfile:
writer \= csv.writer(csvfile)
# 先写入列名:columns\_name 日期 最高气温 最低气温 天气
writer.writerow(\["日期", "最高气温", "最低气温", '天气'\])
# 一次写入多行用writerows(写入的数据类型是列表,一个列表对应一行)
writer.writerows(\[list(day\_weather\_dict.values()) for month\_weather in weathers for day\_weather\_dict in month\_weather\])
import sqlite3
文件如下:
3.对我们的数据进行一下词云处理
所用到的库
1 import requests
2 from lxml import etree
3 import csv
4 from wordcloud import WordCloud
5 import matplotlib.pyplot as plt
然后对数据在进行一次爬取与清理
1 # 从URL获取天气信息的函数
2 def getWeather(url): 3 weather\_info = \[\] # 存储天气信息的列表
4 headers = { 5 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.163 Safari/535.1'
6 }
7 resp = requests.get(url, headers=headers) # 发送GET请求到指定的URL
8 resp\_html = etree.HTML(resp.text) # 解析响应的HTML
9 resp\_list = resp\_html.xpath("//ul\[@class='thrui'\]/li") # 使用XPath选择器提取天气信息列表
10 for li in resp\_list:
11 day\_weather\_info = {} # 存储每天天气信息的字典
12 day\_weather\_info\['date\_time'\] = li.xpath("./div\[1\]/text()")\[0\].split(' ')\[0\] # 提取日期时间并存入字典
13 high = li.xpath("./div\[2\]/text()")\[0\] # 提取最高温度
14 day\_weather\_info\['high'\] = high\[:high.find('℃')\] # 去除温度单位并存入字典
15 low = li.xpath("./div\[3\]/text()")\[0\] # 提取最低温度
16 day\_weather\_info\['low'\] = low\[:low.find('℃')\] # 去除温度单位并存入字典
17 day\_weather\_info\['weather'\] = li.xpath("./div\[4\]/text()")\[0\] # 提取天气情况并存入字典
18 weather\_info.append(day\_weather\_info) # 将每天天气信息字典添加到天气信息列表中
19 return weather\_info
20 def main():
21 weathers = \[\] # 存储所有月份的天气信息的列表
22 for month in range(1, 13):
23 weather\_time = '2022' + ('0' + str(month) if month < 10 else str(month))
24 print(weather\_time)
25 url = f'https://lishi.tianqi.com/quanzhou/{weather\_time}.html'
26 weather = getWeather(url)
27 weathers.append(weather) # 将每个月份的天气信息添加到weathers列表中
28 print(weathers)
29
30 weather\_data = "" # 存储所有天气情况的字符串
31 for month\_weather in weathers:
32 for day\_weather\_dict in month\_weather:
33 weather = day\_weather\_dict\['weather'\] # 提取天气情况
34 weather\_data += weather + " " # 将天气情况添加到weather\_data字符串中,用空格分隔
然后便得到了我们熟悉的数据
wordcloud的分词可视化处理
1 wordcloud = WordCloud(font\_path='C:\\Windows\\Fonts\\微软雅黑\\msyh.ttc', width=800, height=400, font\_step=1,
2 prefer\_horizontal=0.9).generate(weather\_data) # 根据天气数据生成词云
3 plt.figure(figsize=(10, 5))
4 plt.imshow(wordcloud, interpolation='bilinear') # 显示词云图像
5 plt.axis('off')
6 plt.show()
7
8 if \_\_name\_\_ == '\_\_main\_\_':
9 main()
4.数据持久化
import sqlite3
def create\_weather\_table():
conn \= sqlite3.connect('weather.db') # 连接到数据库文件
cursor = conn.cursor()
# 创建天气表格
cursor.execute('''CREATE TABLE IF NOT EXISTS weather (
date\_time TEXT,
high TEXT,
low TEXT,
weather TEXT
)''') # 创建天气表格,如果不存在则创建
conn.commit() # 提交更改到数据库
conn.close() # 关闭数据库连接
def insert\_weather\_data(weather\_data):
conn \= sqlite3.connect('weather.db') # 连接到数据库文件
cursor = conn.cursor()
# 插入天气数据
for month\_weather in weather\_data:
for day\_weather\_dict in month\_weather:
date\_time \= day\_weather\_dict\['date\_time'\] # 获取日期时间
high = day\_weather\_dict\['high'\] # 获取最高温度
low = day\_weather\_dict\['low'\] # 获取最低温度
weather = day\_weather\_dict\['weather'\] # 获取天气情况
cursor.execute("INSERT INTO weather VALUES (?, ?, ?, ?)", (date\_time, high, low, weather)) # 插入数据到天气表格
conn.commit() # 提交更改到数据库
conn.close() # 关闭数据库连接
def main():
create\_weather\_table() # 创建天气表格
weathers \= \[\] # 存储所有月份的天气信息的列表
for month in range(1, 13):
weather\_time \= '2022' + ('0' + str(month) if month < 10 else str(month))
print(weather\_time)
url \= f'https://lishi.tianqi.com/quanzhou/{weather\_time}.html'
weather \= getWeather(url) # 获取天气信息
weathers.append(weather)
print(weathers)
insert\_weather\_data(weathers)
if \_\_name\_\_ == '\_\_main\_\_':
main()
然后数据便以库文件的方式存入电脑中
5.数据可视化
所用到的库
1 import pandas as pd
2 from pyecharts import options as opts
3 from pyecharts.charts import Pie, Bar, Timeline, Line, Scatter
使用pandas.read_csv()读取我们数据文件
1 df = pd.read_csv(‘weather.csv’,encoding=‘gb18030’)
因为绘制的图形是动态的天气轮播图,而此时我们日期的数据类型为字符串,要将类型改为datetime
1 df[‘日期’] = df[‘日期’].apply(lambda x: pd.to_datetime(x))
使用GroupBy聚合对象 以及size().reset_index()方法来将每种天气出现的次数等数据进行分组,统计。
1 df\_agg = df.groupby(\['month','天气'\]).size().reset\_index()
2 print(df\_agg)
对每列数据进行一个命名
df\_agg.columns = \['month','tianqi','count'\]
print(df\_agg)
将数据转化为列表数据
1 print(df\_agg\[df\_agg\['month'\]==1\]\[\['tianqi','count'\]\]\\
2 .sort\_values(by='count',ascending=False).values.tolist())
将处理好的数据传入图表中,绘制横放柱状轮播图
1 # 画图
2 # 实例化一个时间序列的对象
3 timeline = Timeline() 4 # 播放参数:设置时间间隔 1s 单位是:ms(毫秒)
5 timeline.add\_schema(play\_interval=1000) # 单位是:ms(毫秒)
6
7 # 循环遍历df\_agg\['month'\]里的唯一值
8 for month in df\_agg\['month'\].unique():
9 data = (
10
11 df\_agg\[df\_agg\['month'\]==month\]\[\['tianqi','count'\]\]
12 .sort\_values(by='count',ascending=True)
13 .values.tolist()
14 )
15 # print(data)
16 # 绘制柱状图
17 bar = Bar()
18 # x轴是天气名称
19 bar.add\_xaxis(\[x\[0\] for x in data\])
20 # y轴是出现次数
21 bar.add\_yaxis('',\[x\[1\] for x in data\])
22
23 # 让柱状图横着放
24 bar.reversal\_axis()
25 # 将计数标签放置在图形右边
26 bar.set\_series\_opts(label\_opts=opts.LabelOpts(position='right'))
27 # 设置下图表的名称
28 bar.set\_global\_opts(title\_opts=opts.TitleOpts(title='泉州2022年每月天气变化 '))
29 # 将设置好的bar对象放置到时间轮播图当中,并且标签选择月份 格式为: 数字月
30 timeline.add(bar, f'{month}月')
31
32 # 将设置好的图表保存为'weathers.html'文件
33 timeline.render('weathers1.html')
#由于视频上传不了,所以只放了两个月份的天气数据图片
绘制折线图
1 # 画图
2 # 实例化一个时间序列的对象
3 timeline = Timeline() 4 # 播放参数:设置时间间隔 1s 单位是:ms(毫秒)
5 timeline.add\_schema(play\_interval=1000) # 单位是:ms(毫秒)
6
7 # 循环遍历df\_agg\['tianqi'\]里的唯一值(天气类型)
8 for tianqi in df\_agg\['tianqi'\].unique():
9 data = (
10 df\_agg\[df\_agg\['tianqi'\] == tianqi\]\[\['month', 'count'\]\]
11 .sort\_values(by='month', ascending=True)
12 .values.tolist()
13 )
14 # print(data)
15 # 绘制折线图
16 line = Line()
17 # x轴是月份
18 line.add\_xaxis(\[x\[0\] for x in data\])
19 # y轴是出现次数
20 line.add\_yaxis(tianqi, \[x\[1\] for x in data\], is\_smooth=True)
21
22 # 设置图线平滑曲线
23 line.set\_series\_opts(
24 markpoint\_opts=opts.MarkPointOpts(
25 data=\[opts.MarkPointItem(type\_="max", name="最大值")\]
26 )
27 )
28
29 # 设置下图表的名称
30 line.set\_global\_opts(
31 title\_opts=opts.TitleOpts(title='泉州2022年天气趋势'),
32 datazoom\_opts=opts.DataZoomOpts(type\_="slider", range\_start=0, range\_end=100),
33 )
34
35 # 将设置好的line对象放置到时间轮播图中,并且标签选择天气类型
36 timeline.add(line, tianqi)
37
38 # 将设置好的时间轮播图渲染为HTML文件
39 timeline.render("weather\_trend.html")
绘制散点图
1 # 画图
2 # 实例化一个散点图对象
3 scatter = Scatter() 4 # 播放参数:设置时间间隔 1s 单位是:ms(毫秒)
5 timeline.add\_schema(play\_interval=1000) # 单位是:ms(毫秒)
6
7 # 循环遍历df\_agg\['month'\]里的唯一值
8 for month in df\_agg\['month'\].unique():
9 data = (
10 df\_agg\[df\_agg\['month'\]==month\]\[\['tianqi','count'\]\]
11 .sort\_values(by='count',ascending=True)
12 .values.tolist()
13 )
14 # 绘制散点图
15 scatter = Scatter()
16 # x轴是天气名称
17 scatter.add\_xaxis(\[x\[0\] for x in data\])
18 # y轴是出现次数
19 scatter.add\_yaxis('',\[x\[1\] for x in data\])
20
21 # 设置下图表的名称
22 scatter.set\_global\_opts(title\_opts=opts.TitleOpts(title=f'{month}月天气散点图'))
23
24 # 将设置好的scatter对象放置到时间轮播图当中,并且标签选择月份 格式为: 数字月
25 timeline.add(scatter, f'{month}月')
26
27 # 将设置好的时间轮播图渲染为html文件
28 timeline.render('scatter\_timeline.html')
根据以上几个可视化图形可知
泉州市的降雨集中在5月至9月期间,而晴天比较多的月份是10月至来年3月。
6.将以上各部分的代码汇总,附上完整程序代码
(1)数据爬取与清洗,以及持久化部分
1 #\-\*- coding: utf-8 -\*-
2 import requests # 模拟浏览器进行网络请求
3 from lxml import etree # 进行数据预处理
4 import csv # 写入csv文件
5 import sqlite3 6 def getWeather(url): 7 weather\_info = \[\] # 新建一个列表,将爬取的每月数据放进去
8 # 请求头信息:浏览器版本型号,接收数据的编码格式
9 headers = { 10 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.163 Safari/535.1'
11 }
12 # 请求 接收到了响应数据
13 resp = requests.get(url, headers=headers)
14 # 数据预处理s
15 resp\_html = etree.HTML(resp.text) 16 # xpath提取所有数据
17 resp\_list = resp\_html.xpath("//ul\[@class='thrui'\]/li")
18 # for循环迭代遍历
19 for li in resp\_list: 20 day\_weather\_info = {} 21 # 日期
22 day\_weather\_info\['date\_time'\] = li.xpath("./div\[1\]/text()")\[0\].split(' ')\[0\]
23 # 最高气温 (包含摄氏度符号)
24 high = li.xpath("./div\[2\]/text()")\[0\]
25 day\_weather\_info\['high'\] = high\[:high.find('℃')\]
26 # 最低气温
27 low = li.xpath("./div\[3\]/text()")\[0\]
28 day\_weather\_info\['low'\] = low\[:low.find('℃')\]
29 # 天气
30 day\_weather\_info\['weather'\] = li.xpath("./div\[4\]/text()")\[0\]
31 weather\_info.append(day\_weather\_info)
32 return weather\_info 33
34 weathers = \[\] 35
36 # for循环生成有顺序的1-12
37 for month in range(1, 13):
38 # 获取某一月的天气信息
39 # 三元表达式
40 weather\_time = '2022' + ('0' + str(month) if month < 10 else str(month)) 41 print(weather\_time)
42 url = f'https://lishi.tianqi.com/quanzhou/{weather\_time}.html'
43 # 爬虫获取这个月的天气信息
44 weather = getWeather(url) 45 # 存到列表中
46 weathers.append(weather)
47 print(weathers)
48
49
50 # 数据写入(一次性写入)
51 with open("weather.csv", "w",newline='') as csvfile:
52 writer = csv.writer(csvfile) 53 # 先写入列名:columns\_name 日期 最高气温 最低气温 天气
54 writer.writerow(\["日期", "最高气温", "最低气温", '天气'\])
55 # 一次写入多行用writerows(写入的数据类型是列表,一个列表对应一行)
56 writer.writerows(\[list(day\_weather\_dict.values()) for month\_weather in weathers for day\_weather\_dict in month\_weather\]) 57
58
59 import sqlite3 60
61
62 def create\_weather\_table(): 63 conn = sqlite3.connect('weather.db') # 连接到数据库文件
64 cursor = conn.cursor() 65
66 # 创建天气表格
67 cursor.execute('''CREATE TABLE IF NOT EXISTS weather (
68 date\_time TEXT,
69 high TEXT,
70 low TEXT,
71 weather TEXT
72 )''') # 创建天气表格,如果不存在则创建
73
74 conn.commit() # 提交更改到数据库
75 conn.close() # 关闭数据库连接
76
77
78 def insert\_weather\_data(weather\_data): 79 conn = sqlite3.connect('weather.db') # 连接到数据库文件
80 cursor = conn.cursor() 81
82 # 插入天气数据
83 for month\_weather in weather\_data: 84 for day\_weather\_dict in month\_weather: 85 date\_time = day\_weather\_dict\['date\_time'\] # 获取日期时间
86 high = day\_weather\_dict\['high'\] # 获取最高温度
87 low = day\_weather\_dict\['low'\] # 获取最低温度
88 weather = day\_weather\_dict\['weather'\] # 获取天气情况
89
90 cursor.execute("INSERT INTO weather VALUES (?, ?, ?, ?)", (date\_time, high, low, weather)) # 插入数据到天气表格
91
92 conn.commit() # 提交更改到数据库
93 conn.close() # 关闭数据库连接
94
95
96 def main(): 97 create\_weather\_table() # 创建天气表格
98
99 weathers = \[\] # 存储所有月份的天气信息的列表
100 for month in range(1, 13):
101 weather\_time = '2022' + ('0' + str(month) if month < 10 else str(month))
102 print(weather\_time)
103 url = f'https://lishi.tianqi.com/quanzhou/{weather\_time}.html'
104 weather = getWeather(url) # 获取天气信息
105
106
107 weathers.append(weather)
108 print(weathers)
109
110 insert\_weather\_data(weathers)
111
112 if \_\_name\_\_ == '\_\_main\_\_':
113 main()
(2)数据可视化部分
1 #\-\*- coding: utf-8 -\*-
2
3 # 数据分析 读取 处理 存储
4 import pandas as pd 5 from pyecharts import options as opts 6 from pyecharts.charts import Pie, Bar, Timeline, Line, Scatter 7
8 # 用pandas.read\_csv()读取指定的excel文件,选择编码格式gb18030(gb18030范围比)
9 df = pd.read\_csv('weather.csv',encoding='gb18030')
10 print(df\['日期'\])
11
12 # 将日期格式的数据类型改为month
13 df\['日期'\] = df\['日期'\].apply(lambda x: pd.to\_datetime(x)) 14 print(df\['日期'\])
15
16
17 # 新建一列月份数据(将日期中的月份month 一项单独拿取出来)
18 df\['month'\] = df\['日期'\].dt.month
19
20 print(df\['month'\])
21 # 需要的数据 每个月中每种天气出现的次数
22
23 # DataFrame GroupBy聚合对象 分组和统计的 size()能够计算分组的大小
24 df\_agg = df.groupby(\['month','天气'\]).size().reset\_index()
25 print(df\_agg)
26
27 # 设置下这3列的列名
28 df\_agg.columns = \['month','tianqi','count'\]
29 print(df\_agg)
30
31 # 转化为列表数据
32 print(df\_agg\[df\_agg\['month'\]==1\]\[\['tianqi','count'\]\]\\
33 .sort\_values(by='count',ascending=False).values.tolist())
34 """
35 \[\['阴', 20\], \['多云', 5\], \['雨夹雪', 4\], \['晴', 2\]\]
36 """
37
38 # 画图
39 # 实例化一个时间序列的对象
40 timeline = Timeline() 41 # 播放参数:设置时间间隔 1s 单位是:ms(毫秒)
42 timeline.add\_schema(play\_interval=1000) # 单位是:ms(毫秒)
43
44 # 循环遍历df\_agg\['month'\]里的唯一值
45 for month in df\_agg\['month'\].unique():
46 data = ( 47
48 df\_agg\[df\_agg\['month'\]==month\]\[\['tianqi','count'\]\]
49 .sort\_values(by='count',ascending=True)
50 .values.tolist()
51 )
52 # print(data)
53 # 绘制柱状图
54 bar = Bar() 55 # x轴是天气名称
56 bar.add\_xaxis(\[x\[0\] for x in data\]) 57 # y轴是出现次数
58 bar.add\_yaxis('',\[x\[1\] for x in data\]) 59
60 # 让柱状图横着放
61 bar.reversal\_axis()
62 # 将计数标签放置在图形右边
63 bar.set\_series\_opts(label\_opts=opts.LabelOpts(position='right'))
64 # 设置下图表的名称
65 bar.set\_global\_opts(title\_opts=opts.TitleOpts(title='泉州2022年每月天气变化 '))
66 # 将设置好的bar对象放置到时间轮播图当中,并且标签选择月份 格式为: 数字月
67 timeline.add(bar, f'{month}月')
68
69 # 将设置好的图表保存为'weathers.html'文件
70 timeline.render('weathers1.html')
71
72
73 # 画图
74 # 实例化一个时间序列的对象
75 timeline = Timeline() 76 # 播放参数:设置时间间隔 1s 单位是:ms(毫秒)
77 timeline.add\_schema(play\_interval=1000) # 单位是:ms(毫秒)
78
79 # 循环遍历df\_agg\['tianqi'\]里的唯一值(天气类型)
80 for tianqi in df\_agg\['tianqi'\].unique():
81 data = ( 82 df\_agg\[df\_agg\['tianqi'\] == tianqi\]\[\['month', 'count'\]\]
83 .sort\_values(by='month', ascending=True)
84 .values.tolist()
85 )
86 # print(data)
87 # 绘制折线图
88 line = Line() 89 # x轴是月份
90 line.add\_xaxis(\[x\[0\] for x in data\]) 91 # y轴是出现次数
92 line.add\_yaxis(tianqi, \[x\[1\] for x in data\], is\_smooth=True)
93
94 # 设置图线平滑曲线
95 line.set\_series\_opts(
96 markpoint\_opts=opts.MarkPointOpts(
97 data=\[opts.MarkPointItem(type\_="max", name="最大值")\]
98 )
99 )
100
101 # 设置下图表的名称
102 line.set\_global\_opts(
103 title\_opts=opts.TitleOpts(title='泉州2022年天气趋势'),
104 datazoom\_opts=opts.DataZoomOpts(type\_="slider", range\_start=0, range\_end=100),
105 )
106
107 # 将设置好的line对象放置到时间轮播图中,并且标签选择天气类型
108 timeline.add(line, tianqi)
109
110 # 将设置好的时间轮播图渲染为HTML文件
111 timeline.render("weather\_trend.html")
112
113 # 画图
114 # 实例化一个散点图对象
115 scatter = Scatter()
116 # 播放参数:设置时间间隔 1s 单位是:ms(毫秒)
117 timeline.add\_schema(play\_interval=1000) # 单位是:ms(毫秒)
118
119 # 循环遍历df\_agg\['month'\]里的唯一值
120 for month in df\_agg\['month'\].unique():
121 data = (
122 df\_agg\[df\_agg\['month'\]==month\]\[\['tianqi','count'\]\]
123 .sort\_values(by='count',ascending=True)
124 .values.tolist()
125 )
126 # 绘制散点图
127 scatter = Scatter()
128 # x轴是天气名称
129 scatter.add\_xaxis(\[x\[0\] for x in data\])
130 # y轴是出现次数
131 scatter.add\_yaxis('',\[x\[1\] for x in data\])
132
133 # 设置下图表的名称
134 scatter.set\_global\_opts(title\_opts=opts.TitleOpts(title=f'{month}月天气散点图'))
135
136 # 将设置好的scatter对象放置到时间轮播图当中,并且标签选择月份 格式为: 数字月
137 timeline.add(scatter, f'{month}月')
138
139 # 将设置好的时间轮播图渲染为html文件
140 timeline.render('scatter\_timeline.html')
141 import numpy as np
142 from sklearn.linear\_model import LinearRegression
(3)wordcloud分词可视化,词云部分
1 1 # -\*- coding: utf-8 -\*-
2 2
3 3 # 导入必要的库
4 4 import requests 5 5 from lxml import etree 6 6 import csv 7 7 from wordcloud import WordCloud 8 8 import matplotlib.pyplot as plt 9 9
10 10 # 从URL获取天气信息的函数s
11 11 def getWeather(url):
12 12 weather\_info = \[\] # 存储天气信息的列表
13 13 headers = {
14 14 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.163 Safari/535.1'
15 15 }
16 16 resp = requests.get(url, headers=headers) # 发送GET请求到指定的URL
17 17 resp\_html = etree.HTML(resp.text) # 解析响应的HTML
18 18 resp\_list = resp\_html.xpath("//ul\[@class='thrui'\]/li") # 使用XPath选择器提取天气信息列表
19 19 for li in resp\_list:
20 20 day\_weather\_info = {} # 存储每天天气信息的字典
21 21 day\_weather\_info\['date\_time'\] = li.xpath("./div\[1\]/text()")\[0\].split(' ')\[0\] # 提取日期时间并存入字典
22 22 high = li.xpath("./div\[2\]/text()")\[0\] # 提取最高温度
23 23 day\_weather\_info\['high'\] = high\[:high.find('℃')\] # 去除温度单位并存入字典
24 24 low = li.xpath("./div\[3\]/text()")\[0\] # 提取最低温度
25 25 day\_weather\_info\['low'\] = low\[:low.find('℃')\] # 去除温度单位并存入字典
26 26 day\_weather\_info\['weather'\] = li.xpath("./div\[4\]/text()")\[0\] # 提取天气情况并存入字典
27 27 weather\_info.append(day\_weather\_info) # 将每天天气信息字典添加到天气信息列表中
28 28 return weather\_info
29 29 def main():
30 30 weathers = \[\] # 存储所有月份的天气信息的列表
31 31 for month in range(1, 13):
32 32 weather\_time = '2022' + ('0' + str(month) if month < 10 else str(month))
33 33 print(weather\_time)
34 34 url = f'https://lishi.tianqi.com/quanzhou/{weather\_time}.html'
35 35 weather = getWeather(url)
36 36 weathers.append(weather) # 将每个月份的天气信息添加到weathers列表中
37 37 print(weathers)
38 38
39 39 weather\_data = "" # 存储所有天气情况的字符串
40 40 for month\_weather in weathers:
41 41 for day\_weather\_dict in month\_weather:
42 42 weather = day\_weather\_dict\['weather'\] # 提取天气情况
43 43 weather\_data += weather + " " # 将天气情况添加到weather\_data字符串中,用空格分隔
44 44
45 45 wordcloud = WordCloud(font\_path='C:\\Windows\\Fonts\\微软雅黑\\msyh.ttc', width=800, height=400, font\_step=1,
46 46 prefer\_horizontal=0.9).generate(weather\_data) # 根据天气数据生成词云
47 47 plt.figure(figsize=(10, 5))
48 48 plt.imshow(wordcloud, interpolation='bilinear') # 显示词云图像
49 49 plt.axis('off')
50 50 plt.show()
51 51
52 52 if \_\_name\_\_ == '\_\_main\_\_':
53 53 main()
版权归原作者 进击的六角龙 所有, 如有侵权,请联系我们删除。