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

发布时间 2023-06-07 18:40:36作者: 2103280127符阳

 

一、选题的背景

为什么要选择此选题?要达到的数据分析的预期目标是什么?从社会、经济、技术、数据来源等方面进行描述(200 字以内)(10分)

天气作为日常生活中不可忽视的因素,对人们的出行、衣食住行等方面均有影响。此次选题旨在通过对泉州市2022年天气数据的收集和分析,了解该地区各季节天气的变化情况,为当地居民提供参考信息,并为相关部门制定应急预案提供依据。

预期目标是建立一个完整、详细的数据集,包括每日的日期", "最高气温", "最低气温", '天气'等气象数据,并基于这些数据进行可视化分析,构建出图表,展示各类天气指标的趋势变化。通过这些可视化展示,能够更加直观地反映泉州市各季节天气特点和规律,为人们提供科学、准确的参考信息。

二、主题式网络爬虫设计方案

1.主题始网络爬虫名称

 爬取泉州2022年天气数据并做可视化分析

2.本数据集的数据内容与数据特征分析

采集泉州2022年天气数据中的日期,最高气温,最低气温,天气等数据

对泉州一整年的雨季,旱季进行分析,给出泉州天气变化参考

3.数据分析的课程设计方案概述(包括实现思路与技术难点)

  1. 数据采集

首先确定需要采集的数据来源,从网站获取。使用Python中的Requests库发送HTTP请求获取网页源代码,利用BeautifulSoup或正则表达式等技术筛选出感兴趣的数据,存储到本地或数据库中。

  1. 数据可视化分析

将采集到的数据进行清洗、预处理等操作,使用Python中的Pandas库进行数据分析,并可视化展示。可以使用Matplotlib、Seaborn等第三方库进行数据可视化,生成折线图、柱状图、散点图、热力图等形式,直观呈现数据变化规律和趋势。

技术难点:

  1. 如何确定需要采集的数据来源,需要对数据本身有一定的了解。
  2. 对于网页源代码的处理需要一定的HTML和CSS基础。
  3. 数据清洗和预处理时需要考虑异常数据的处理方法。
  4. 数据可视化过程中需要根据不同数据类型选择不同的展示方式,需要对各种图表形式有一定的了解。

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

1.主题页面的结构与特征分析

目标内容界面:

2. Htmls 页面解析

 

3.节点查找方法与遍历方法

查找方法:find(): 查找第一个匹配到的节点。find_all(): 查找所有匹配到的节点,并返回一个列表。

遍历方法:contents: 返回当前节点的直接子节点列表。 children: 返回当前节点的直接子节点的迭代器。descendants: 返回当前节点的所有子孙节点的迭代器。

parent: 返回当前节点的父节点。parents: 返回当前节点的所有祖先节点的迭代器。

 

四、网络爬虫程序设计(60分)

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

五、总结

爬取泉州2022年天气数据经过数据处理和可视化分析后的结果,我对于数据采集,数据清洗,数据可视化的方法以及步骤更加的熟练。以下是我对其的总结。

  1. 数据采集

数据采集:数据采集是整个过程的第一步。在进行数据采集前,需要确定采集的目标、采集的数据类型、采集的源站点等信息。确定好这些信息后,就可以开始编写爬虫程序了。使用Python爬虫需要掌握一定的网络知识和编程技巧,同时也需要了解如何处理HTTP请求和响应。

  1. 数据清洗

采集到数据后,需要进行数据清洗。数据清洗包括去除噪声数据、填充缺失值、转换数据类型等步骤。数据清洗是保证数据质量的重要环节,也是后续分析的基础。

  1. 数据可视化

经过清洗后的数据可以进行可视化分析。在进行数据可视化前,需要先选择合适的可视化工具,例如Matplotlib、Seaborn、Plotly等。数据可视化的目标是将数据以图形的方式呈现出来,帮助人们更容易地理解数据背后的含义和关系。在进行数据可视化时,不同的图形类型适合不同的数据类型和分析目标,需要根据具体情况进行选择。

在完成此设计中,完成数据可视化中的轮播图是我对于此次设计比较满意的一个部分,但是整体代码不够简介,完成的速度太慢,效率较低。整体来说基本达到心中的预期。

对自身的建议:

  1. 选择合适的采集工具和技术

选择合适的采集工具和技术可以提高数据采集的效率和质量。需要根据目标网站的结构、数据类型等信息来选择采集工具和技术。常用的采集工具包括Scrapy、BeautifulSoup、Selenium等,需要熟悉它们的使用方法和注意事项。

  1. 进行有效的数据清洗

在进行数据清洗时,需要注意数据类型转换、缺失值填充、异常值处理等问题,以确保数据的准确性和完整性。同时,应该考虑使用自动化的方法和工具,例如Pandas库、NumPy库等。

  1. 选择合适的可视化工具和技术

选择合适的可视化工具和技术可以提高数据可视化的效果和吸引力。需要根据数据类型、分析目的等信息来选择可视化工具和技术。常用的可视化工具包括Matplotlib、Seaborn、Plotly等,需要熟悉它们的使用方法和注意事项。

  1. 常态化数据采集、清洗和可视化

对于需要长期采集、清洗和可视化的数据,建议实现常态化的数据采集、清洗和可视化。这可以通过自动化脚本和任务计划来实现,以减少人工干预和提高效率。

  1. 不断学习和改进

数据采集和可视化是一项技术密集型的工作,需要不断学习和改进。之后要定期了解最新的数据采集和可视化技术,同时也要关注相关领域的研究成果和最佳实践,以提高自己的技能水平和工作质量。

总之,使用Python爬虫完成对数据的采集和可视化分析是一项非常有用的技术,需要掌握一定的技术和方法,并不断进行改进和优化。