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

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请求到指定的URL8     resp_html = etree.HTML(resp.text)  # 解析响应的HTML9     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 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 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     # 数据预处理s15     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-1237 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 TEXT72                     )''')  # 创建天气表格,如果不存在则创建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 # 将日期格式的数据类型改为month13 df['日期'] = df['日期'].apply(lambda x: pd.to_datetime(x)) 14 print(df['日期'])15 16 17 # 新建一列月份数据(将日期中的月份month 一项单独拿取出来)18 df['month'] = df['日期'].dt.month19 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()

相关文章:

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

一、主题页面的结构与特征分析 1&#xff0e;主题页面的结构与特征分析 目标内容界面&#xff1a; 2. Htmls 页面解析 3&#xff0e;节点查找方法与遍历方法 查找方法&#xff1a;find(): 查找第一个匹配到的节点。find_all(): 查找所有匹配到的节点&#xff0c;并返回一个…...

【Unity3D】ECS入门学习(十二)IJob、IJobFor、IJobParallelFor

IJob&#xff1a;开启单个线程进行计算&#xff0c;线程内不允许对同一个数据进行操作&#xff0c;也就是如果你想用多个IJob分别计算&#xff0c;将其结果存储到同一个NativeArray<int>数组是不允许的&#xff0c;所以不要这样做&#xff0c;如下例子就是反面教材&#…...

存储进阶笔记(二):Linux 存储栈:从 Device Mapper、LVM 到文件系统(2024)

记录一些平时接触到的存储知识。由于是笔记而非教程&#xff0c;因此内容不求连贯&#xff0c;有基础的同学可作查漏补缺之用。 存储进阶笔记&#xff08;一&#xff09;&#xff1a;硬件基础&#xff1a;HDD/SDD、JBOD、RAID 等&#xff08;2024&#xff09; 存储进阶笔记&am…...

MySQL——操作

一.库的操作 1.基本操作 创建数据库 create database 数据库名称; 查看数据库 show databases; 删除数据库 drop database 数据库名称; 执行删除之后的结果: 数据库内部看不到对应的数据库对应的数据库文件夹被删除&#xff0c;级联删除&#xff0c;里面的数据表全部被删 所…...

c++表达范围勿用数学符号

目的 遇上了一个C基础问题&#xff0c;一下子陷到里面&#xff0c;不知怎么回事了&#xff0c;知道后&#xff0c;又感觉太可笑。 这也许就是成长的代价。 下面就是细说说所遇上的问题。 关于C逻辑的一些知识点&#xff1a; 定义: 用逻辑运算符将两个表达式链接起来的式子称为…...

SAP PP bom历史导出 ALV 及XLSX 带ECN号

bom总数 104W PS超过XLSX上限 &#xff0c;那就分文件 *&---------------------------------------------------------------------* *& Report ZRPT_PP_BOM_HIS_ECN *&---------------------------------------------------------------------* *& tcode:zpp0…...

【AIGC-ChatGPT职业提示词指令】智能职业规划助手:基于SVG可视化的职业发展指南系统

引言 在当今快速变化的职场环境中,职业发展规划变得越来越复杂和充满挑战。无论是想要转行的技术人员,还是希望突破瓶颈的职场人士,都需要一个清晰的指导方向和可执行的行动计划。基于这种需求,我们设计了一个智能职业规划助手系统,它能够通过数据可视化的方式,为用户提…...

node.js之---单线程异步非阻塞 I/O

单线程模型 1、Node.js 使用 单线程 来处理客户端请求和执行任务 2、如果遇到异步任务&#xff0c;node.js使用事件循环和异步 I/O 模型&#xff0c;使得它能够高效地处理大量并发请求 异步操作有哪些 1、读取文件 2、网络请求 3、数据库操作等等 异步非阻塞 I/O Node.…...

DotnetSpider实现网络爬虫

1. 使用DotnetSpider框架 DotnetSpider是一个开源的、轻量、灵活、高性能、跨平台的分布式网络爬虫框架,适用于.NET平台。它可以帮助开发者快速实现网页数据的抓取功能。 1.1 安装DotnetSpider NuGet包 首先,你需要在你的.NET项目中安装DotnetSpider NuGet包。你可以通过…...

01 Oracle 基本操作

Oracle 基本操作 初使用步骤 1.创建表空间 2.创建用户、设置密码、指定表空间 3.给用户授权 4.切换用户登录 5.创建表 注意点&#xff1a;oracle中管理表的基本单位是用户 文章目录 了解Oracle体系结构 1.创建表空间**2.删除表空间**3.创建用户4.给用户授权5.切换用户登录6.表操…...

纯血鸿蒙ArkUI线性布局详解

线性布局说明 线性布局&#xff08;LinearLayout&#xff09;是开发中最常用的布局&#xff0c;通过线性容器Row和Column构建。线性布局是其他布局的基础&#xff0c;其子元素在线性方向上&#xff08;水平方向和垂直方向&#xff09;依次排列。线性布局的排列方向由所选容器组…...

MySQL root用户密码忘记怎么办(Reset root account password)

在使用MySQL数据库的的过程中&#xff0c;不可避免的会出现忘记密码的现象。普通用户的密码如果忘记&#xff0c;可以用更高权限的用户&#xff08;例如root&#xff09;进行重置。但是如果root用户的密码忘记了&#xff0c;由于root用户本身就是最高权限&#xff0c;那这个方法…...

18.springcloud_openfeign之扩展组件二

文章目录 一、前言二、子容器默认组件FeignClientsConfigurationDecoder的注入Contract约定对注解的支持对类上注解的支持对方法上注解的支持对参数上注解的支持@MatrixVariable@PathVariable@RequestParam@RequestHeader@SpringQueryMap@RequestPart@CookieValueFormattingCon…...

18、【OS】【Nuttx】用gdb调试nuttx os

背景 接之前wiki 14、【OS】【Nuttx】Nsh中运行第一个程序 15、【OS】【Nuttx】OS裁剪&#xff0c;运行指定程序&#xff0c;周期打印当前任务 程序跑起来了&#xff0c;OS也裁剪了&#xff0c;下一步就是调试了 目标 用gdb把nuttx程序跑起来 准备环境 vscode商店里C和C相…...

网络爬虫科普:原理、类型、策略与常用工具

网络爬虫科普&#xff1a;原理、类型、策略与常用工具 网络爬虫在当今互联网时代扮演着极为重要的角色&#xff0c;它能帮助我们从海量的网络信息中提取出有价值的数据。以下将从网络爬虫的基本概念、工作流程、类型、搜索策略以及常用工具等方面进行详细科普介绍。 一、网络…...

SQL 实战:动态表创建与多表更新的高级 SQL

在实际的数据库管理和开发中&#xff0c;经常需要临时存储中间计算结果或对多表数据进行批量更新。SQL 提供了动态表创建和多表更新的能力&#xff0c;使复杂业务逻辑能够通过一条 SQL 语句高效完成。本文将介绍如何动态创建临时表和实现多表联动更新&#xff0c;并通过具体示例…...

RabbitMQ基础篇之快速入门

文章目录 一、目标需求二、RabbitMQ 控制台操作步骤1.创建队列2.交换机概述3.向交换机发送消息4.结果分析5.消息丢失原因 三、绑定交换机与队列四、测试消息发送五、消息查看六、结论 一、目标需求 新建队列&#xff1a;创建 hello.queue1 和 hello.queue2 两个队列。消息发送…...

NLP论文速读(NeurIPS 2024)|BERT作为生成式上下文学习者BERTs are Generative In-Context Learners

论文速读|BERTs are Generative In-Context Learners 论文信息&#xff1a; 简介&#xff1a; 本文探讨了在自然语言处理&#xff08;NLP&#xff09;领域中&#xff0c;上下文学习&#xff08;in-context learning&#xff09;的能力&#xff0c;这通常与因果语言模型&#x…...

LeetCode - Google 校招100题 第7天 序列(数据结构贪心) (15题)

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/144744418 相关文章&#xff1a; LeetCode 合计最常见的 112 题&#xff1a; 校招100题 第1天 链表(List) (19题)校招100题 第2天 树(Tree) (21…...

基于Docker基础与操作实战

6.1 Docker容器简介 Docker是一个开源的应用容器引擎&#xff0c;它基于Go语言并遵从Apache2.0 协议开源。 Docker是一个用于开发&#xff0c;交付和运行应用程序的开放平台。Docker能将应用程序与基础架构分开&#xff0c;从而可以快速交付软件。借助Docker&#xff0c;您可…...

高转化的Facebook广告文案的秘诀

Facebook 广告文案是制作有效 Facebook 广告的关键方面。它侧重于伴随广告视觉元素的文本内容。今天我们的博客将深入探讨成功的 Facebook 广告文案的秘密&#xff01; 一、广告文案怎么写&#xff1f; 正文&#xff1a;这是帖子的正文&#xff0c;出现在您姓名的正下方。它可…...

支持向量机入门指南:从原理到实践

目录 1 支持向量机的基本概念 1.2 数学表达 2 间隔与支持向量 2.1 几何间隔 2.2 支持向量的概念 2.3 规范化超平面 2.4 支持向量的深入分析 2.4.1 支持向量的特征 2.4.2 支持向量的作用 2.4.3 支持向量的代数表示 2.5 KKT条件 3 最优化问题 3.1 问题的形成 3.2 规…...

汽车打气泵方案|智能充气泵工作原理

汽车打气泵方案最开始是机械式的开发&#xff0c;后来慢慢地演变成由一个气缸、压力传感器和ADC芯片以及主控芯片&#xff0c;就能够使得打气筒具备智能充气功能&#xff0c;摇身一变变成汽车打气泵方案。它具备精准压力检测以及过充过放等功能&#xff0c;利用ADC芯片和压力传…...

Jenkins入门使用

Jenkins入门使用 1先安装jdk才能运行jenkins yum install -y java-1.8.0-openjdk.x86_64 2 安装jenkins&#xff0c;运行&#xff0c;进行端口绑定&#xff0c;启动jenkins docker search jenkins docker pull jenkins/jenkins docker run -d -u root -p 8080:8080 -p 50000:50…...

iOS Masonry对包体积的影响

01 Masonry介绍 Masonry是iOS在控件布局中经常使用的一个轻量级框架&#xff0c;Masonry让NSLayoutConstraint使用起来更为简洁。Masonry简化了NSLayoutConstraint的使用方式&#xff0c;让我们可以以链式的方式为我们的控件指定约束。 常用接口声明与实现&#xff1a; 使用方式…...

Hive分区再分桶表

在Hive中&#xff0c;数据通常是根据分区&#xff08;partition&#xff09;来组织的&#xff0c;但是对于大数据集&#xff0c;单层分区可能不够用&#xff0c;因此可以进一步细分为桶&#xff08;bucket&#xff09;。桶可以用于提供额外的并行处理和优化查询性能。在这种情况…...

三大行业案例:AI大模型+Agent实践全景

本文将从AI Agent和大模型的发展背景切入&#xff0c;结合51Talk、哈啰出行以及B站三个各具特色的行业案例&#xff0c;带你一窥事件驱动架构、RAG技术、人机协作流程&#xff0c;以及一整套行之有效的实操方法。具体包含内容有&#xff1a;51Talk如何让智能客服“主动进攻”&a…...

国产低代码框架zdppy开发笔记002 标准的接口响应

前言 通过前面的学习, 我们已经知道了zdppy_api和zdppy_req的基本用法, 接下来我们会在学习中多次用到这两个框架. 我们已经知道了该如何响应一个字符串,但是我们该如何响应json数据呢? 在zdppy_api中,我们定义了一组规范的API响应, 我们慢慢来看看. 规范的响应 首先来看…...

关于Nginx

1.Nginx的配置 proxy_pass http: 当你需要将请求分发到多个后端服务器时&#xff0c;需要实现负载均衡功能&#xff0c;可以使用upstream指令定义一组服务器&#xff0c;并在proxy_pass中引用这个服务组名称。。如果不需要负载均衡&#xff0c;只需要将请求转发到单一的后端…...

数据库实时会话管理,性能问题诊断后的临门一脚

目录 前言 实时会话管理 DBdoctor 实时会话功能 1.实时会话列表 2.结束会话 3.操作历史 4.SQL分析 结语 前言 在之前的文章中我们介绍了DBdoctor性能洞察功能&#xff0c;它能够快速量化数据库连接会话单条SQL的资源消耗&#xff0c;实现性能问题快速根因定位并给出优…...

以EM算法为例介绍坐标上升(Coordinate Ascent)算法:中英双语

中文版 什么是 Coordinate Ascent 算法&#xff1f; Coordinate Ascent&#xff08;坐标上升&#xff09;是一种优化算法&#xff0c;它通过在每次迭代时优化一个变量&#xff08;或一个坐标&#xff09;&#xff0c;并保持其他变量不变&#xff0c;逐步逼近最优解。与坐标下…...

visual studio连接sql server数据库

目录 1、为什么要建立连接2、在sql server中建立数据库3、visual studio连接sql server数据库4、学生信息管理系统页面布局5、添加事件逻辑 5.1 页面跳转5.2 读取学生信息5.3 查询学生信息5.4 修改学生信息5.5 删除学生信息5.6 添加学生信息 bilibili演示视频 github源码 1、…...

磁盘的相关操作

1.让U盘连接到虚拟机中 两种方法&#xff1a;1>在弹出的窗口中设置 2>通过选项设置 菜单栏---->虚拟机----->可移动设备---->找到U盘名---->连接到虚拟机中 2.查看U盘是否已被成功识别 方法&#xff1a;ls /dev/sd* 显示包含除了sda外的文件说明U盘连接成功…...

数据结构与算法Python版 图的应用与广度优先搜索

文章目录 一、图的应用-词梯问题二、图的广度优先搜索 一、图的应用-词梯问题 词梯问题 Word Ladder 从一个单词演变到另一个单词&#xff0c;其中的过程可以经过多个中间单词。要求是相邻两个单词之间差异只能是1个字母如FOOL变SAGE&#xff1a;FOOL >> POOL >>…...

Unity——InputField组件自动换行和enter键换行

文章目录 输入框实现换行功能 输入框实现换行功能 在Unity中&#xff0c;如果你想要在输入框&#xff08;如InputField&#xff09;中实现换行功能 &#xff0c;你需要确保以下几点&#xff1a; 1、文本组件支持多行&#xff1a; 确保你的InputField的文本组件&#xff08;Te…...

solr9.7 单机安装教程

1.环境要求:jdk11以上 2.下载wget https://dlcdn.apache.org/solr/solr/9.7.0/solr-9.7.0.tgz 3.解压 4.修改solr.in.sh配置 5.启动命令 bin/solr start 6.创建core bin/solr create -c <core名称> 注意:用solr ui界面创建&#xff0c;会提示找不到solrconfig.xml和m…...

​虚幻引擎UE5渲染不够快的解决办法

​虚幻引擎是由Epic Games公司开发的一款功能强大、全球最开放且先进的实时 3D 创作工具&#xff0c;广泛应用于游戏、影视、建筑可视化、虚拟现实等多个领域&#xff01;虚幻引擎UE5如何实现在网上极速渲染呢&#xff1f;本文提供云渲染和云电脑两套方案用于渲染提速&#xff…...

基于STM32的智能家居环境监控系统设计

目录 引言系统设计 硬件设计软件设计系统功能模块 环境监控模块控制模块显示模块系统实现 硬件实现软件实现系统调试与优化结论与展望 1. 引言 随着智能家居技术的发展&#xff0c;环境监控系统已经成为家居管理的重要组成部分。智能家居环境监控系统通过实时监测室内温度、湿…...

Android service framework笔记

1. 网络摘录如何添加一个Application Framework Service(一)(without native code) 如何添加一个Application Framework Service(二)(with native code) 2.书籍摘录...

【图像处理lec10】图像压缩

目录 一、图像压缩基础 1、图像压缩的基本概念 2、数据冗余与压缩比 3、三种主要的数据冗余类型 4、保真度评估标准&#xff08;Fidelity Criteria&#xff09; 5、应用与实践 二、图像压缩模型 1、图像压缩模型概述 &#xff08;1&#xff09;压缩系统的结构 &#…...

flask后端开发(2):URL与视图

目录 URL定义request获取请求参数 gitcode地址&#xff1a; https://gitcode.com/qq_43920838/flask_project.git URL定义 from flask import FlaskappFlask(__name__)app.route(/) def hello_world():return Hello World!app.route(/profile) def profile():return 我是个人…...

Linux Ubuntu24配置安装Java

目录 一. 通过apt安装java1.1 列出所有可用java版本1.2 安装指定java版本1.3 安装后确认1.4 /etc/alternatives/目录 二. 手动安装java 一. 通过apt安装java 1.1 列出所有可用java版本 apt list openjdk-*jdk apluserubuntu24-01:~$ apt list openjdk-*jdk Listing... Done …...

线段树例题题解

卫星覆盖&#xff08;NOI1997&#xff09; 题面&#xff1a; SERCOI&#xff08;Space-Earth Resource Cover-Observe lnstitute&#xff09; 是一个致力于利用卫星技术对空间和地球资源进行覆盖观测的组织。现在他们研制成功一种新型资源观测卫星 -SERCOI-308。这种卫星可以…...

极品飞车6的游戏手柄设置

极品飞车&#xff0c;既可以用键盘来控制车辆的前进、后退、左转、右转、加速与减速&#xff0c;也可以使用游戏手柄来操作车辆的运行。需要注意的是&#xff0c;极品飞车虽然支持手柄&#xff0c;但是仅支持常见的北通、罗技还有部分Xbox系列的手柄&#xff0c;至于其他的PS4手…...

为何DeepSeek V3模型为自己是ChatGPT?

DeepSeek V3 AI模型&#xff1a;为何它认为自己是ChatGPT&#xff1f; 引言 在人工智能领域&#xff0c;最新的技术进展总是令人兴奋。最近&#xff0c;一家资金雄厚的中国AI实验室DeepSeek发布了一款新的AI模型——DeepSeek V3&#xff0c;它在多个流行基准测试中超越了许多…...

【每日学点鸿蒙知识】人脸活体检测、NodeController刷新、自动关闭输入框、Row设置中间最大宽、WebView单例

1、HarmonyOS 人脸活体检测调用&#xff1f; H5调用应用侧方法可参考以下demo&#xff1a; index.ets Web()//注册方法.javaScriptProxy({object: this.testObj,name: "testObjName",methodList: ["getLocationTS"],controller: this.webController})cla…...

深入理解Composer自动加载机制

Composer是PHP生态系统中最常用的依赖管理工具之一&#xff0c;它不仅能够帮助开发者管理项目的依赖关系&#xff0c;还能够自动加载这些依赖项。自动加载机制是Composer的核心功能之一&#xff0c;通过自动加载&#xff0c;开发者可以在运行时按需加载所需的类和文件&#xff…...

SQL SERVER日常运维巡检系列之-日志

前言 做好日常巡检是数据库管理和维护的重要步骤&#xff0c;而且需要对每次巡检日期、结果进行登记&#xff0c;同时可能需要出一份巡检报告。 本系列旨在解决一些常见的困扰&#xff1a; 不知道巡检哪些东西不知道怎么样便捷体检机器太多体检麻烦生成报告困难&#xff0c;无…...

2024年中国新能源汽车用车发展怎么样 PaperGPT(二)

用车趋势深入分析 接上文&#xff0c;2024年中国新能源汽车用车发展怎么样 PaperGPT&#xff08;一&#xff09;-CSDN博客本文将继续深入探讨新能源汽车的用车强度、充电行为以及充电设施的现状。 用车强度 月均行驶里程&#xff1a;2024年纯电车辆月均行驶超过1500公里&…...

【数据结构】线性数据结构——链表

1. 定义 链表是一种线性数据结构&#xff0c;由多个节点&#xff08;Node&#xff09;组成。每个节点存储数据和指向下一个节点的指针。与数组不同&#xff0c;链表的节点不需要在内存中连续存储。 2. 特点 动态存储&#xff1a; 链表的大小不固定&#xff0c;可以动态增加或…...