parent: 返回当前节点的父节点
发布时间:2025-06-24 20:26:53 作者:北方职教升学中心 阅读量:620
一、find_all(): 查找所有匹配到的节点,并返回一个列表。二、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-12for 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 requests2 from lxml import etree3 import csv4 from wordcloud import WordCloud5 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\_info20 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 sqlite3def 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 pd2 from pyecharts import options as opts3 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()方法来将每种天气出现的次数等数据进行分组,统计。
遍历方法:contents: 返回当前节点的直接子节点列表。
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月。主题页面的结构与特征分析
1.主题页面的结构与特征分析
目标内容界面:
2. Htmls 页面解析
3.节点查找方法与遍历方法
查找方法:find(): 查找第一个匹配到的节点。
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 np142 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获取天气信息的函数s11 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请求到指定的URL17 17 resp\_html = etree.HTML(resp.text) # 解析响应的HTML18 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\_info29 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()