Python爬虫——2023年西安全年气温数据并进行可视化处理

Python爬虫——2023年西安全年气温数据并进行可视化处理

一、网站选择

我们要找到西安历史气温数据,可以去一些天气网站上查找,但不一定每一个天气网站都会留有各城市的历史天气数据,因此我在这里给大家推荐两个网站方便大家进行历史气温的获取:

1.天气网

这个网站点进去后可以根据城市的首字母进行城市的选择,选择后就可以查找想要年份月份的气温数据(目前最早到2011年)
下来以2023年西安气温作为示例:
在首字母为x中找到西安
在这里插入图片描述

在下图选择对应的时间即可
在这里插入图片描述

2.2345天气王

进入网站后点击最上面的导航->历史天气
在这里插入图片描述

进入后可以切换城市与具体时间
在这里插入图片描述

二、爬虫代码编写

代码编写对第一个网站的2023年西安气温进行数据爬取

1.库函数的选择

我们使用的是Python语言进行数据的爬虫,首先确定代码编写当中所需要用到的库:

import requests  # 模拟浏览器进行网络请求
from lxml import etree  # 进行数据预处理
import csv  # 写入csv文件

——request库是爬虫所需要的最基本的进行网络请求的库
——etree是使用xpath解析所需要用到的对数据进行预处理的库
——csv是用来将获取到的数据进行存储的库

2.获取天气数据

首先定义一个获取天气数据的函数grtWeather,参数为url,接下来新建一个列表weather_info,这个列表用于存放一个月的天气数据。接下来设置请求头:(一般情况下会因为浏览器版本不同导致请求头不同,请勿直接复制粘贴!!!)

空白处鼠标右键选择检查/F12–>找到network(网络)–>找到202301.html点击–>找到标头最下面的User-Agent复制作为请求头即可
在这里插入图片描述

    # 请求头headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 Edg/120.0.0.0'}

接下来接收响应数据,通过request的get方法进行接收,参数一般为url与headers(分清楚是get还是post方法)
在这里插入图片描述

接下来通过etree将网络上的页面源码数据加载到resp_html中,参数为resp.text,其中text返回字符串形式的响应数据。

    # 请求 接收到了响应数据resp = requests.get(url, headers=headers)# 数据预处理resp_html = etree.HTML(resp.text)

使用resp_html.xpath将对应地址的数据返回,其中xpath地址可以这样进行编写:
1.在控制台找到element(元素)后点击最上方的鼠标按钮
2.在左侧页面找到自己想要查找的元素,如图所示
3.点击后右侧的元素就会自动跳转到你所点击的元素位置上,就可以查看具体的元素位置了
例:本图日期的位置为:ul class = 'thrui’标签下的li标签中
//:表示的是多个层级,可以表示从任意位置开始定位(‘/html//title’)(‘//title’)
属性定位://div[@class=“song”]
在这里插入图片描述
因此此处的xpath位置为:

    # xpath提取所有数据resp_list = resp_html.xpath("//ul[@class='thrui']/li")

我们可以看到在ul下的每一个li标签当中都有着日期、最高温、最低温、天气、风向五个元素,想要将它们存储起来就需要使用一个字典进行存储,并且需要使用一个循环对每一个li标签进行遍历以获得每一天的数据(一个li标签对应一个月的一天)。首先定义一个day_weather_info字典,再分别对日期,最高温,最低温,天气(将自己需要的数据进行处理即可)进行数据的存储:

对于日期而言,我们需要对其具体的xpath路径进行解析,可以看到日期是在li标签下的第一个div下,因此获取div[1]下的文本即可,其中的split是对获取的日期前后的空白进行抹除以确保格式统一,接下来的剩余元素按照统一方式处理即可。

最后将每天的天气数据追加到列表中并返回它即可。
/text():获取的是标签中直系的文本内容
//text():获取的是标签中非直系的文本内容(所有的文本内容)

    # for循环迭代遍历for li in resp_list:day_weather_info = {}# 日期day_weather_info['date_time'] = li.xpath("./div[1]/text()")[0].split(' ')[0]# 最高气温 (包含摄氏度符号)high = li.xpath("./div[2]/text()")[0]day_weather_info['high'] = high# 最低气温low = li.xpath("./div[3]/text()")[0]day_weather_info['low'] = low# 天气day_weather_info['weather'] = li.xpath("./div[4]/text()")[0]weather_info.append(day_weather_info)return weather_info
完整的函数体
def getWeather(url):weather_info = []   # 新建一个列表,将爬取的每月数据放进去# 请求头信息:浏览器版本型号,接收数据的编码格式headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 Edg/120.0.0.0'}# 请求 接收到了响应数据resp = requests.get(url, headers=headers)# 数据预处理resp_html = etree.HTML(resp.text)# xpath提取所有数据resp_list = resp_html.xpath("//ul[@class='thrui']/li")# for循环迭代遍历for li in resp_list:day_weather_info = {}# 日期day_weather_info['date_time'] = li.xpath("./div[1]/text()")[0].split(' ')[0]# 最高气温 (包含摄氏度符号)high = li.xpath("./div[2]/text()")[0]day_weather_info['high'] = high# 最低气温low = li.xpath("./div[3]/text()")[0]day_weather_info['low'] = low# 天气day_weather_info['weather'] = li.xpath("./div[4]/text()")[0]weather_info.append(day_weather_info)return weather_info

3.url的设置与数据的存储

首先定义一个列表用于存放十二个月的天气数据,接下来使用一个for循环来对1-12月进行遍历,这里来讲一下为什么要遍历12个月而不是直接使用xpath来获取每一个月的数据:
在这里插入图片描述
在这里插入图片描述
通过上面两张图可以看出当我们切换不同的月份时变化的知识网址上的时间(202301–>202310),当月份小于10的时候显示的月份前有一个0,大于10后正常,因此我们只需要每次改变url就可以对不同月份的数据进行处理,这也是我们定义上面函数的原因,通过传入不同月份的url来处理不同月份的数据,方便可行。我们将唯一变化的时间作为变量weather_time通过循环进行修改即可,将变化的值传入url中再通过函数来获取1-12月每一个月的数据并将其追加到列表中即可。

weathers = []# for循环生成有顺序的1-12
for month in range(1, 13):# 获取某一月的天气信息# 三元表达式weather_time = '2023' + ('0' + str(month) if month < 10 else str(month))print(weather_time)url = f'https://lishi.tianqi.com/xian/{weather_time}.html'# 爬虫获取这个月的天气信息weather = getWeather(url)# 存到列表中weathers.append(weather)
print(weathers)

4.文件写入

通过打开文件以写入数据,设置编码格式为’utf-8’,newline=’ '(保证换行符正确解析),初始化一个writer对象用于写入数据方法的使用,先写入列名:日期、最高气温、最低气温、天气,再一次写入多行将所有数据写入文件中。

with open("2023西安气温.csv", 'w', encoding='utf-8', 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])

5.数据爬取完整代码

import requests  # 模拟浏览器进行网络请求
from lxml import etree  # 进行数据预处理
import csv  # 写入csv文件def getWeather(url):weather_info = []   # 新建一个列表,将爬取的每月数据放进去# 请求头信息:浏览器版本型号,接收数据的编码格式headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 Edg/120.0.0.0'}# 请求 接收到了响应数据resp = requests.get(url, headers=headers)# 数据预处理resp_html = etree.HTML(resp.text)# xpath提取所有数据resp_list = resp_html.xpath("//ul[@class='thrui']/li")# for循环迭代遍历for li in resp_list:day_weather_info = {}# 日期day_weather_info['date_time'] = li.xpath("./div[1]/text()")[0].split(' ')[0]# 最高气温 (包含摄氏度符号)high = li.xpath("./div[2]/text()")[0]day_weather_info['high'] = high# 最低气温low = li.xpath("./div[3]/text()")[0]day_weather_info['low'] = low# 天气day_weather_info['weather'] = li.xpath("./div[4]/text()")[0]weather_info.append(day_weather_info)return weather_infoweathers = []# for循环生成有顺序的1-12
for month in range(1, 13):# 获取某一月的天气信息# 三元表达式weather_time = '2023' + ('0' + str(month) if month < 10 else str(month))print(weather_time)url = f'https://lishi.tianqi.com/xian/{weather_time}.html'# 爬虫获取这个月的天气信息weather = getWeather(url)# 存到列表中weathers.append(weather)
print(weathers)# 数据写入(一次性写入)
with open("2023西安气温.csv", 'w', encoding='utf-8', 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])

6.csv文件预览

在这里插入图片描述

三、数据可视化

1.库函数的选择

import pandas as pd
from pyecharts import options as opts
from pyecharts.charts import Line

——pandas库主要用于读取csv文件以及数据清洗
——pyecharts中的Line主要用于绘制折线图,常见的还有地图与柱状图
——options主要用于设置折线图的显示项的应用

2.数据处理

首先使用pandas中的read_csv方法读取csv文件中的数据,接下来先对日期进行处理,将年份抹去,使用replace将’2023-'替换为空字符串,对于最高气温与最低气温我们将℃的符号抹去,只留下温度数字并将其转化为int类型即可。

# 读取CSV文件并获取最高温度和最低温度数据
data = pd.read_csv('2023西安气温.csv', encoding='utf-8')
data['日期'] = data['日期'].str.replace('2023-', '')
# 生成 2023 年一整年的日期序列,并转换为字符串格式
data['最高气温'] = data['最高气温'].str.replace('℃', '').astype(int)
data['最低气温'] = data['最低气温'].str.replace('℃', '').astype(int)

3.设置图表与XY轴标签

首先创建一个折线图对象,通过全局选项设置标题为“2023年西安气温变化折线图”,X轴名称为“日期”,将type_设置为category后可以正常显示日期,否则折线图会显示异常,Y轴名称为“温度(℃),将最低气温减5,最高气温加5后显示的折线不会出现低温比高温高的情况。

在后面加上图例显示、工具箱显示、视觉映射配置项可以使得展现的内容更多,可操作的选项也更多,可以更加直观的对数据进行分析观察。

# 创建一个折线图对象
line = Line()# 设置图表标题和XY轴标签
line.set_global_opts(title_opts=opts.TitleOpts(title='2023年西安气温变化折线图'),xaxis_opts=opts.AxisOpts(name='日期', type_='category'),yaxis_opts=opts.AxisOpts(name='温度(℃)',min_=data['最低气温'].min() - 5,max_=data['最高气温'].max() + 5),legend_opts=opts.LegendOpts(is_show=True),toolbox_opts=opts.ToolboxOpts(is_show=True),visualmap_opts=opts.VisualMapOpts(is_show=True))

4.X,Y轴数据填入生成html文件

X轴填入日期即可,Y轴有两条折线,一条为最高气温,一条为最低气温,分别添加到Y轴,并设置为不同的颜色,最后将图表生成为html文件就结束了。

# 将最高气温和最低气温分别添加到折线图中
line.add_xaxis(data['日期'])
line.add_yaxis('最高气温', data['最高气温'], linestyle_opts=opts.LineStyleOpts(color='#ff6347'))
line.add_yaxis('最低气温', data['最低气温'], linestyle_opts=opts.LineStyleOpts(color='#6495ED'))# 将图表渲染为HTML文件
line.render('2023西安气温.html')
print('2023西安全年气温折线图已生成!', end=" ")

5.可视化完整代码

import pandas as pd
from pyecharts import options as opts
from pyecharts.charts import Line# 读取CSV文件并获取最高温度和最低温度数据
data = pd.read_csv('2023西安气温.csv', encoding='utf-8')
data['日期'] = data['日期'].str.replace('2023-', '')
# 生成 2023 年一整年的日期序列,并转换为字符串格式
data['最高气温'] = data['最高气温'].str.replace('℃', '').astype(int)
data['最低气温'] = data['最低气温'].str.replace('℃', '').astype(int)
# 创建一个折线图对象
line = Line()# 设置图表标题和XY轴标签
line.set_global_opts(title_opts=opts.TitleOpts(title='2023年西安气温变化折线图'),xaxis_opts=opts.AxisOpts(name='日期', type_='category'),yaxis_opts=opts.AxisOpts(name='温度(℃)',min_=data['最低气温'].min() - 5,max_=data['最高气温'].max() + 5),legend_opts=opts.LegendOpts(is_show=True),toolbox_opts=opts.ToolboxOpts(is_show=True),visualmap_opts=opts.VisualMapOpts(is_show=True))# 将最高气温和最低气温分别添加到折线图中
line.add_xaxis(data['日期'])
line.add_yaxis('最高气温', data['最高气温'], linestyle_opts=opts.LineStyleOpts(color='#ff6347'))
line.add_yaxis('最低气温', data['最低气温'], linestyle_opts=opts.LineStyleOpts(color='#6495ED'))# 将图表渲染为HTML文件
line.render('2023西安气温.html')
print('2023西安全年气温折线图已生成!', end=" ")

四、结果展示

找到生成的html文件在右上角任选一个浏览器进入即可
在这里插入图片描述

1.折线图展示

在这里插入图片描述
我们主要对右上角的工具箱进行讲解:

2.下载为图片

在这里插入图片描述

3.还原

主要是和第四个(区域放大)和第五个(区域缩小)结合起来进行操作,因为日期数太多因此原始折线图上无法查看所有的数据,只有部分数据可以查看,可以通过放大来看需要查看时间的温度信息,查看完成后通过还原来恢复界面。
在这里插入图片描述

4.数据表格:

在这里插入图片描述

5.折线图转化为柱状图

在数据过多时看起来有些不方便
在这里插入图片描述

6.堆叠/平铺图:

在这里插入图片描述

五、结束语

恭喜你已经跟着我完成了从网站选择到数据爬取最后进行可视化的全部流程,虽然本次代码的编写难度不是很大,但是其中的知识点需要牢记并学会使用到实际案例当中去,Python的路还有很长,与诸君共勉!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

牛客30道题解析精修版

1.异常处理 都是Throwable的子类&#xff1a; ① Exception&#xff08;异常&#xff09;:是程序本身可以处理的异常。 ② Error&#xff08;错误&#xff09;: 是程序无法处理的错误。这些错误表示故障发生于虚拟机自身、或者发生在虚拟机试图执行应用时&#xff0c;一般不需要…

选择国产压测工具应注意什么?

随着互联网和信息技术的飞速发展&#xff0c;压力测试成为了确保软件系统稳定性和性能的不可或缺的环节。在压测工具的选择上&#xff0c;近年来国产压测工具逐渐崭露头角&#xff0c;但在使用时仍需谨慎。本文将探讨在选择国产压测工具时需要注意的关键因素。 功能完备性&…

GBASE南大通用数据库GBase 8s常见问题解析 -- 查找锁会话并解锁

本文摘自GBASE南大通用社区&#xff0c;by&#xff1a;wty&#xff0c;原文请点击&#xff1a;GBase 8s常见问题 -- 查找锁会话并解锁|GBASE社区|天津南大通用数据技术股份有限公司|GBASE-致力于成为用户最信赖的数据库产品供应商 问题现象 执行SQL时报错 244: Could not do…

电脑f盘满了怎么清理f盘空间?3个实用的方法!

磁盘空间的大小直接影响到计算机的性能和存储能力。当磁盘空间不足时&#xff0c;会导致系统运行缓慢、无法安装新的程序或存储文件&#xff0c;甚至会使计算机系统崩溃。那么如何解决磁盘空间不足的问题呢&#xff1f;下面提供了一些方法。 方法一&#xff1a;删除不需要的文…

跟着pink老师前端入门教程-day09

二十二、定位 22.1 为什么需要定位 1. 某个元素可以自由的在一个盒子内移动位置&#xff0c;并且压住其他盒子 2. 当我们滚动窗口时&#xff0c;盒子是固定屏幕某个位置的 解决方法&#xff1a; 1. 浮动可以让多个块级盒子一行没有缝隙排列显示&#xff0c;经常用于横向排…

STL第三讲

第三讲 stl六大部件&#xff1a;算法是函数模板&#xff0c;其他的是类模板 算法形式&#xff1a;传入两个迭代器&#xff08;第三个参数可能有&#xff1a;一个比较的准则 算法需要的所有信息从迭代器获取 迭代器分类 基于红黑树的结构是双向迭代器&#xff1b; 基于hash的取…

【计算机网络】UDP协议与TCP协议

文章目录 一、端口号1.什么是端口号2.端口号范围划分3.认识知名端口号(Well-Know Port Number)4.netstat5.pidof 二、UDP协议1.UDP协议端格式2.UDP的特点3.面向数据报4.UDP的缓冲区5.UDP使用注意事项6.基于UDP的应用层协议 三、TCP协议1.TCP协议段格式1.1理解封装解包和分用1.2…

进程通信与socket编程实践之猜数字小游戏

socket是实现进程通信的一种重要方式&#xff0c;本文将通过socket编程实现服务器进程与客户端进程之间的通信&#xff0c;并在通信之外实现猜数字的小游戏。 1. 设计思路 本文设计的C/S结构的猜数字游戏功能如下&#xff1a;服务器端自动生成一个1-100之间的随机数字&#x…

100T数据存进服务器分几步?

大家好&#xff0c;我是豆小匠。 这期来聊聊数据存储相关的问题&#xff0c;包括&#xff1a; 容量评估。技术选型。容灾处理。 另外&#xff0c;文末赠送免费定制红包封面哦&#xff01; 1. 容量评估 通过对容量&性能的评估&#xff0c;可以把业务需求转化成技术语言描…

鲲鹏微认证——openEuler开源操作系统迁移实践

文章目录 为什么要系统搬迁为什么选择欧拉欧拉系统迁移概述实施路径工具实战 为什么要系统搬迁 2020年12月&#xff0c;CentOs作为由开源社区免费提供的操作系统&#xff0c;宣布将对CentO58于2021年底停止服务&#xff0c;CentO57则于2024年6月底停止服务。 这将直接导致操作…

Linux系统SSH远程管理服务

目录 一、SSH服务介绍 1、SSH协议是什么&#xff1f; 2、SSH的优点 3、SSH的客户端与服务端 4、SSH的原理 4.1 公钥首次连接原理 4.2 ssh加密通讯原理 4.2.1 对称加密 4.2.2 非对称加密 4.2 ssh远程登录 二、服务端配置 1、常见配置项 1.1 修改默认端口 1.2 禁止…

未来已来:AI引领智能时代的多领域巨变

大家好&#xff0c;今天我们将深入探讨人工智能如何彻底改变我们的生活方式&#xff0c;领略未来的无限可能性。 1. 医疗革新&#xff1a;AI担任超级医生 医疗领域是AI最引人注目的战场之一。智能医学影像诊断系统&#xff0c;不仅能够精准识别病变&#xff0c;还能辅助医生提…

VS Code使用Git管理开发项目流程

以VSCode远程连接虚拟机开发为例&#xff0c;已经配置好SSH 在Github上搜索心仪的项目&#xff0c;比如权限管理 点击fork到自己账户仓库 虚拟机下创建一个目录 1)mkdir java_test 2)切换到java_test 初始化并克隆项目 1&#xff09; git init:初始化仓库 2&#xff09; g…

掼蛋功能之识别性格篇

常说&#xff1a;千人千面。大多数人一到牌局的场面&#xff0c;往往精神便会放松&#xff0c;面貌神情不再收敛&#xff0c;一言一行体现出的性格暴露无疑&#xff0c;具体表现为以下几种&#xff1a; 1、浮躁冲动型&#xff1a;此类人多数不讲究团队配合&#xff0c;自顾自出…

UE5 - Polycam扫描文件导入插件

Polycam是利用Gaussian Splatting进行3D重建的3D扫描相关软件&#xff0c;其对应有UE引擎的插件&#xff08;Plugin_XV3dGS&#xff09;可以把相关格式的文件导入到引擎&#xff1b; 首先Polycam的官网为&#xff1a;My Captures | Polycam 可以下载各种用户扫描文件&#xff…

vivado I/O和时钟规划设计流程步骤

I/O和时钟规划设计流程步骤 下图显示了左侧的项目设计流程步骤。水平箭头表示项目设计流程中可以执行I/O和时钟规划的点。中的步骤I/O和时钟规划设计流程如右图所示。 项目设计流程从一个空的I/O规划项目、RTL设计项目或合成后网表项目。使用这些项目类型中的任何一种&#xf…

PPO学习

openai用tf实现的真的看不懂&#xff0c;大佬的世界… PPO的详细细节 1. 奖励模型和策略的价值头将 query 和 response 的连接作为输入 奖励模型和策略的价值头 不 仅仅查看响应。相反&#xff0c;它将 query 和 response 连接在一起&#xff0c;作为 query_response def ge…

Python进阶知识:整理6 -> 正则表达式

1 基础匹配用法 # 演示Python中正则表达式re模块的3个基础匹配方法 import re # 1. match()方法 从头匹配 string "hello world" result re.match("hello", string) # 如果头部没有匹配成功就直接失败了,后面就不会继续匹配了 print(result) print(r…

设计模式: 装饰模式

文章目录 一、什么是装饰模式二、装饰模式的结构三、使用场景案例分析 一、什么是装饰模式 在不改变对象原有行为的基础上&#xff0c;动态的来为该对象绑定新的行为。 二、装饰模式的结构 装饰模式结构中主要包含如下角色&#xff1a; Component&#xff08;抽象部件&…

橘子学Mybatis08之Mybatis关于一级缓存的使用和适配器设计模式

前面我们说了mybatis的缓存设计体系&#xff0c;这里我们来正式看一下这玩意到底是咋个用法。 首先我们是知道的&#xff0c;Mybatis中存在两级缓存。分别是一级缓存(会话级)&#xff0c;和二级缓存(全局级)。 下面我们就来看看这两级缓存。 一、准备工作 1、准备数据库 在此之…