当前位置: 首页 > article >正文

python爬虫——爬取全年天气数据并做可视化分析

一、主题页面的结构与特征分析

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()

http://www.kler.cn/a/463952.html

相关文章:

  • 如何二次封装组件(vue3版本)
  • 分析服务器 systemctl 启动gozero项目报错的解决方案
  • ubuntu支持ssh
  • PHP框架+gatewayworker实现在线1对1聊天--发送消息(6)
  • 用uniapp写一个播放视频首页页面代码
  • 二维码文件在线管理系统-收费版
  • 【机器学习】工业 4.0 下机器学习如何驱动智能制造升级
  • 【C#设计模式(22)——策略模式(Stratege Pattern)】
  • aws(学习笔记第二十课) codecommit以及codedeploy进行开发
  • 如何在群晖NAS上安装并配置MySQL与phpMyAdmin远程管理数据库
  • 金融风控-授信额度模型
  • VSCode 终端显示“pnpm : 无法加载文件 C:\Program Files\nodejs\npm.ps1,因为在此系统上禁止运行脚本”
  • ruoyi 多租户 开启后针对某一条sql不适用多租户; 若依多租户sql规则修改
  • 如何用CSS3创建圆角矩形并居中显示?
  • 汽车损坏识别检测数据集,使用yolo,pasical voc xml,coco json格式标注,6696张图片,可识别11种损坏类型,识别率89.7%
  • C/C++ 数据结构与算法【树和森林】 树和森林 详细解析【日常学习,考研必备】带图+详细代码
  • 家谱管理系统|Java|SSM|VUE| 前后端分离
  • 自从学会Git,感觉打开了一扇新大门
  • uniapp生成h5后发布到服务器碰到的问题解决
  • 在基于IMX6ULL的Linux嵌入式编程中,与内存相关的堆(Heap)和栈(Stack)有什么区别?Linux 系统中堆和栈的内存布局是怎么样的?
  • Gin 路由实现原理概述
  • springboot配置并使用RestTemplate
  • 攻防世界web第十题Web_python_template_injection
  • DDSort-简单实用的jQuery拖拽排序插件
  • NLP论文速读(NeurIPS 2024)|BERT作为生成式上下文学习者BERTs are Generative In-Context Learners
  • Microsoft SQL Server Integration Services (SSIS) 详细介绍