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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/946817.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MATLAB程序转C# WPF,dll集成,混合编程

工作中遇到一个需求&#xff0c;有一部分算法的代码需要MATLAB来进行处理&#xff0c;而最后需要集成到C#中的wpf项目中去&#xff0c;选择灵活性更高的dll&#xff0c;去进行集成。&#xff08;可以简单理解为&#xff1a;将MATLAB的函数&#xff0c;变为C#中类的函数成员&…

Ubuntu24.04最新版本安装详细教程

Ubuntu 24.04 LTS发布说明 推荐的系统配置要求&#xff1a; 双核2 GHz处理器或更高 4 GB系统内存 25 GB磁盘存储空间 可访问的互联网 光驱或USB安装介质 Ubuntu 24.04官方下载网址&#xff1a;https://cn.ubuntu.com/download/desktop 04. Ubuntu 22.04(创建虚拟机方式一) 4…

【YOLO算法改进】ALSS-YOLO:无人机热红外图像|野生动物小目标检测

目录 论文信息 论文创新点 1.自适应轻量通道分割和洗牌&#xff08;ALSS&#xff09;模块 2.轻量坐标注意力&#xff08;LCA&#xff09;模块 3.单通道聚焦模块 4.FineSIOU损失函数 摘要 架构设计 轻量高效网络架构 - ALSS模块 LCA模块 单通道聚焦模块 损失函数优…

【PDF物流单据提取明细】批量PDF提取多个区域内容导出表格或用区域内容对文件改名,批量提取PDF物流单据单号及明细导出表格并改名的技术难点及小节

相关阅读及下载&#xff1a; PDF电子物流单据&#xff1a; 批量PDF提取多个区域局部内容重命名PDF或者将PDF多个局部内容导出表格&#xff0c;具体使用步骤教程和实际应用场景的说明演示https://mp.weixin.qq.com/s/uCvqHAzKglfr40YPO_SyNg?token720634989&langzh_CN扫描…

MySQL数据库笔记——主从复制

大家好&#xff0c;这里是Good Note&#xff0c;关注 公主号&#xff1a;Goodnote&#xff0c;本文详细介绍 MySQL的主从复制&#xff0c;从原理到配置再到同步过程。 文章目录 简介核心组件主从复制的原理作用主从复制的线程模型主从复制的模式形式复制的方式设计复制机制主从…

大数据技术-Hadoop(三)Mapreduce的介绍与使用

目录 一、概念和定义 二、WordCount案例 1、WordCountMapper 2、WordCountReducer 3、WordCountDriver 三、序列化 1、为什么序列化 2、为什么不用Java的序列化 3、Hadoop序列化特点&#xff1a; 4、自定义bean对象实现序列化接口&#xff08;Writable&#xff09; 4…

从零开始学TiDB(7)TiDB 的MPP架构概述

MPP架构介绍&#xff1a; 如图&#xff0c;TiDB Server 作为协调者&#xff0c;首先 TiDB Server 会把每个TiFlash 拥有的region 会在TiFlash上做交换&#xff0c;让表连接在一个TiFlash上。另外 TiFlash会作为计算节点&#xff0c;每个TiFlash都负责数据交换&#xff0c;表连接…

接雨水-力扣热题100

题目&#xff1a; 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 示例 1&#xff1a; 输入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1]输出&#xff1a;6解释&#xff1a;上面是由数组 [0,1,0,2,1,…

AI大模型语音识别转文字

提取音频 本项目作用在于将常见的会议录音文件、各种语种音频文件进行转录成相应的文字&#xff0c;也可从特定视频中提取对应音频进行转录成文字保存在本地。最原始的从所给网址下载对应视频和音频进行处理。下载ffmpeg(https://www.gyan.dev/ffmpeg/builds/packages/ffmpeg-…

基于微信小程序的校园点餐平台的设计与实现(源码+SQL+LW+部署讲解)

文章目录 摘 要1. 第1章 选题背景及研究意义1.1 选题背景1.2 研究意义1.3 论文结构安排 2. 第2章 相关开发技术2.1 前端技术2.2 后端技术2.3 数据库技术 3. 第3章 可行性及需求分析3.1 可行性分析3.2 系统需求分析 4. 第4章 系统概要设计4.1 系统功能模块设计4.2 数据库设计 5.…

安卓入门十一 常用网络协议四

MQTT&#xff08;Message Queuing Telemetry Transport&#xff09; MQTT是一种轻量级的、发布/订阅模式的消息传输协议。它被设计用于在低带宽或不稳定网络环境下&#xff0c;实现物联网设备之间的可靠通信。 4.1 MQTT详细介绍 发布/订阅模式&#xff1a;MQTT 使用发布/订…

前端多个项目部署在同一个nginx下,前缀不同,配置编写方式

我们前端是微前端的项目&#xff0c;不同模块是分开的不同项目&#xff0c;用访问前缀区分。开发环境部署为了节约资源&#xff0c;直接使用一个nginx当做静态资源服务器&#xff0c;服务多个微前端&#xff0c;示意图如下&#xff1a; 下面是nginx使用的配置(server部分) ser…

Yolo11 基于DroneVehicle数据集的无人机视角下车辆目标检测

1、关于DroneVehicle数据集介绍 DroneVenicle数据集是由天津大学收集、标注的大型无人机航拍车辆数据集。 DroneVehicle 数据集由无人机采集的共 56,878 幅图像组成&#xff0c;其中一半为 RGB 图像&#xff0c;其余为红外图像。我们对五个类别进行了带有方向性边界框的丰富标…

Requests库01|使用Requests库发送 get/post/put/delete请求

学习目标&#xff1a; 能够使用Requests库发送 get/post/put/delete请求&#xff0c;获取响应状态码、数据能够使用UnitTest管理测试用例。 目录 一、Requests库安装和简介 二、设置http请求语法&#xff08;重要&#xff09; 三、应用案例&#xff08;重要&#xff09; …

[有用教程]从 Pixel 快速传输到 Android

概括 更换新手机很容易&#xff0c;但数据迁移却不容易。目前&#xff0c;用户喜欢转换品牌&#xff0c;应用市场上的转换工具也越来越多。然而&#xff0c;它们并不都是安全的。因此&#xff0c;选择一款简单、安全的迁移工具至关重要。 今天我们将讨论如何从 Pixel 转移到 …

【蓝桥杯研究生组】第15届Java试题答案整理

D 题 试题 D: 商品库存管理 时间限制: 3.0s 内存限制: 512.0MB 本题总分&#xff1a;10 分 【问题描述】 在库存管理系统中&#xff0c;跟踪和调节商品库存量是关键任务之一。小蓝经营的仓库中存有多种商品&#xff0c;这些商品根据类别和规格被有序地分类并编号&#xff0c;…

BUUCTF sqli-labs 1

这里就是单纯的找一下flag在哪&#xff0c;通关整个靶场在sql注入分区&#xff0c;虽然还没有通关。 这里要先看一下数据库都有哪些&#xff0c;用到语句&#xff1a;?id-1 union select 1,(select group_concat(schema_name) from information_schema.schemata),3-- 发现这个…

python实现自动登录12306抢票 -- selenium

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 python实现自动登录12306抢票 -- selenium 前言其实网上也出现了很多12306的代码&#xff0c;但是都不是最新的&#xff0c;我也是从网上找别人的帖子&#xff0c;看B站视频&…

Spring自动化创建脚本-解放繁琐的初始化配置!!!(自动化SSM整合)

一、实现功能(原创&#xff0c;转载请告知) 1.自动配置pom配置文件 2.自动识别数据库及数据表&#xff0c;创建Entity、Dao、Service、Controller等 3.自动创建database.properties、mybatis-config.xml等数据库文件 4.自动创建spring-dao.xml spring-mvc.xml …

[微服务] - MQ高级

在昨天的练习作业中&#xff0c;我们改造了余额支付功能&#xff0c;在支付成功后利用RabbitMQ通知交易服务&#xff0c;更新业务订单状态为已支付。 但是大家思考一下&#xff0c;如果这里MQ通知失败&#xff0c;支付服务中支付流水显示支付成功&#xff0c;而交易服务中的订单…