【Python】python天气数据抓取与数据分析(源码+论文)【独一无二】

请添加图片描述


👉博__主👈:米码收割机
👉技__能👈:C++/Python语言
👉公众号👈:测试开发自动化【获取源码+商业合作】
👉荣__誉👈:阿里云博客专家博主、51CTO技术博主
👉专__注👈:专注主流机器人、人工智能等相关领域的开发、测试技术。


python天气数据抓取与数据分析(源码+论文)【独一无二】


目录

  • python天气数据抓取与数据分析(源码+论文)【独一无二】
  • 一、项目概述
  • 二、项目环境需求
  • 三、数据库设计
    • 1)数据库设计概述
    • 2)逻辑结构设计(E-R图)
    • 3)物理结构设计数据表
  • 四、数据获取实现
    • 4.1 网络请求
    • 4.2 数据解析
    • 4.3 提取具体数据
  • 五、数据存储
    • 5.1. CSV文件存储
    • 5.2 SQL数据库存储
  • 6. 数据呈现
  • 7. 数据分析
    • (1)统计各类天气所占比例
    • (2)统计每年中气温最高的日期
    • (3)统计每年气温的平均值
    • (4)最高气温与最低气温的散点图
    • (5) 统计最高气温分布的箱线图


一、项目概述

本项目包括四个核心部分:数据爬取、数据存储、数据分析和数据可视化。首先,利用Python编写的网络爬虫从专业的历史天气网站上爬取大连市从2011年至2023年的天气数据,包括日期、最高气温、最低气温和天气状况等信息。爬取过程中应用了requests库来模拟浏览器请求和lxml库来解析HTML文档,确保了数据的准确性和完整性。接着,将爬取到的数据存储在两个CSV文件中,并利用pymysql库将数据导入MySQL数据库,便于后续的数据处理和分析。在数据分析阶段,使用pandas库对CSV中的数据进行读取和处理,计算出如每年的平均气温、最高气温的日期等关键统计信息。最后,利用pyecharts库将分析结果以图表的形式进行可视化展示,生成了五种图表:各类天气所占比例的饼图、每年最高气温的日期折线图、每年平均气温的柱状图、最高气温与最低气温的散点图和最高气温分布的箱线图。


二、项目环境需求

  • 开发环境:Python3.7
  • 运行系统:Windows
  • 软件:Pycharm

三、数据库设计

1)数据库设计概述

本项目的数据库设计关键在于有效地组织和存储从网上爬取的大连市历史天气数据。为了实现这一目标,设计了两个主要的数据表:weather_summary和daily_weather,以及相应的字段来存储和索引数据。这些设计考虑到了数据的完整性、查询效率和易于理解性。

weather_summary 表:
此表用于存储每个月的天气摘要信息,包括城市名、年份、月份以及对应的网页URL。
字段设计:

  • city (VARCHAR(255)):城市名称,存储城市名,如“大连”。
  • year (INT):年份,存储数据所属的年份。
  • month (INT):月份,存储数据所属的月份。
  • url (VARCHAR(255)):URL地址,存储爬取该月数据的网页链接。

这个表有助于快速定位某个特定时间段的天气数据来源和基本信息。

daily_weather 表:
此表更加详细,用于存储每天的天气数据,包括城市、日期、最高气温、最低气温和天气状况。
字段设计:

  • city (VARCHAR(255)):城市名称。
  • date_time (DATE):日期,存储每条记录对应的具体日期。
  • high (INT):最高气温,存储当天的最高气温值。
  • low (INT):最低气温,存储当天的最低气温值。
  • weather (VARCHAR(255)):天气,存储当天的天气情况描述。
    该表的设计允许进行详细的日常天气数据分析,如温度变化、极端天气事件等。

关注公众号,回复 “天气数据抓取” 获取源码

2)逻辑结构设计(E-R图)

在这里插入图片描述

3)物理结构设计数据表

在这里插入图片描述


四、数据获取实现

4.1 网络请求

使用requests库发起HTTP GET请求到目标网站。这里的目标网站是以https://lishi.xxx.com/xxx/YYYYMM.html格式的URL,其中YYYY和MM分别代表年份和月份。
为了避免被网站服务器识别为爬虫,代码中设置了请求头headers,其中包含一个User-Agent,模仿常见浏览器的身份。

4.2 数据解析

使用lxml库对响应的HTML内容进行解析。lxml是一个强大的库,可以处理HTML和XML文档,支持XPath查询语言,用于提取HTML文档中的数据。
代码中利用etree.HTML(resp.text)将获取的HTML文本转换成了lxml的HTML对象,方便后续使用XPath进行数据提取。

4.3 提取具体数据

通过XPath定位HTML文档中存储天气数据的部分,具体是寻找类名为thrui的ul元素下的所有li元素。对于每个li元素,代码进一步提取了日期(date_time)、最高气温(high)、最低气温(low)和天气状况(weather)。
数据清洗:提取的气温数据中包含了摄氏度符号(℃),代码中通过字符串操作去除这个符号,只保留温度的数值部分。
主要代码如下:

   weather_info = []   # 新建一个列表,将爬取的每月数据放进去# 请求头信息:浏览器版本型号,接收数据的编码格式headers = {# 必填,不填拿不到数据'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.163 Safari/535.1'}# 请求 接收到了响应数据resp = requests.get(url, headers=headers)# 数据预处理resp_html = etree.HTML(resp.text)# xpath提取所有数据resp_list = resp_html.xpath("//ul[@class='thrui']/li")# for循环迭代遍历

五、数据存储

5.1. CSV文件存储

在项目中,CSV文件存储是数据管理的重要环节,利用Python的标准库csv实现。这一过程首先通过open()函数打开或创建一个CSV文件,如dalian_weather.csv,以便写入数据。这种文件格式的普遍兼容性使其成为数据共享和轻量级存储的理想选择。在写入数据之前,通过csv.writer()函数创建一个写入器对象,它是后续所有CSV操作的核心。

👇👇👇 关注公众号,回复 “天气数据抓取” 获取源码👇👇👇

weathers = []
message = []
for year in ['2023', '2022', '2021', '2020', '2019', '2018', '2017', '2016', '2015', '2014', '2013', '2012', '2011']:# for循环生成有顺序的1-12for month in range(1, 13):try:# ... 忽略 ...urls = {f'https://xxx.xxx.com/xxx/{weather_time}.html': '大连'}for url, city in urls.items():# 爬虫获取这个月的天气信息weather = getWeather(city, url)# 存到列表中weathers.append(weather)message.append([city, year, month, url])except Exception as e:continueprint(weathers)print(message)# 数据写入(一次性写入)
with open("dalian_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])# 数据写入(一次性写入)
with open("dalian_weather_message.csv", "w", newline='') as csvfile:writer = csv.writer(csvfile)# 先写入列名:columns_name 日期 最高气温 最低气温  天气writer.writerow(["城市", "年份", "月份", "url"])# 一次写入多行用writerows(写入的数据类型是列表,一个列表对应一行)writer.writerows(message)

5.2 SQL数据库存储

SQL数据库存储部分是项目中处理和维护大规模数据集的关键。使用pymysql库与MySQL数据库建立连接,此过程涉及数据库的基本操作,如创建表格、插入数据和事务管理。在数据存储的初始阶段,代码通过执行SQL语句创建weather_summary和daily_weather两个数据表,这些表格的设计旨在准确地反映天气数据的结构和关系。其中,weather_summary表存储每个月的天气摘要。

   # 第一组数据插入 weather_summary 表with conn.cursor() as cursor:sql = "INSERT INTO weather_summary (city, year, month, url) VALUES (%s, %s, %s, %s)"cursor.executemany(sql, message)# 第二组数据插入 daily_weather 表data2 = []for month_data in weathers:for day_data in month_data:record = (day_data['city'], day_data['date_time'], day_data['high'], day_data['low'], day_data['weather'])

6. 数据呈现

关注公众号,回复 “天气数据抓取”

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述


7. 数据分析

(1)统计各类天气所占比例

首先,使用pandas库中的value_counts()方法来统计df[‘天气’]列中各个唯一天气类型的出现次数。这个方法返回一个新的Series对象,其索引是唯一的天气类型,值是每种天气类型的出现次数。接下来,使用pyecharts库中的Pie类创建一个饼图对象。Pie类是一个专门用于生成饼图的类,能够轻松地实现数据的可视化。

关注公众号,回复 “天气数据抓取” 获取源码

在这里插入图片描述

(2)统计每年中气温最高的日期

首先,代码通过pd.to_datetime(df[‘日期’])将df中的’日期’列转换为pandas的DateTime对象。这种转换对于后续的日期处理和分析至关重要,因为它允许使用丰富的日期时间函数。利用DateTime对象的dt属性,代码提取了每条记录的年份信息,并将其存储在新的列’年份’中。这样做便于按年份对数据进行分组和分析。使用groupby(‘年份’)对数据按年份进行分组,然后对每个分组应用idxmax()函数来找出最高气温出现的索引(即日期)。idxmax()函数返回的是最高气温值所在行的索引。

在这里插入图片描述

(3)统计每年气温的平均值

使用groupby(‘年份’)对df中的数据按照’年份’列进行分组。这意味着数据将根据年份被组织起来,每个组包含该年份的所有数据记录。接着,应用agg函数对分组后的数据进行聚合计算。在这里,针对每个年份组,分别计算’最高气温’和’最低气温’的平均值(mean)。这一步骤提供了每年的平均最高气温和平均最低气温的关键数据。

在这里插入图片描述

(4)最高气温与最低气温的散点图

通过绘制一个散点图来探索最高气温和最低气温之间的关系。以下是对这部分代码的详细分析,使用pyecharts库中的Scatter类来创建一个散点图对象。散点图是用于展示两个变量之间关系的理想图表,特别适合于揭示变量之间的相关性或模式。通过Scatter()构造函数初始化了一个散点图实例。
设置X轴和Y轴数据使用add_xaxis()方法设置X轴数据,这里选择了df[‘最高气温’]作为X轴数据,它代表数据集中记录的每天的最高气温。

在这里插入图片描述

(5) 统计最高气温分布的箱线图

创建温度区间,利用pandas的cut函数,代码首先定义了一系列温度区间(temp_bins),这些区间用于对最高气温数据进行分类。这些区间从-10℃开始,每个区间的跨度不同,直到超过数据集中的最高气温。pd.cut函数将df[‘最高气温’]中的每个值分配到这些预定义的区间中。结果存储在新的列’温度区间’中,为每个最高气温值标记了对应的温度区间。

在这里插入图片描述

👇👇👇 关注公众号,回复 “天气数据抓取” 获取源码👇👇👇

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

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

相关文章

pdf文件能扫码查看吗?一键做文本二维码

pdf格式是常用的一种文件格式,很多资料、展示性的内容都会选择这种格式,现在很多人都需要将文件生成二维码图片后分享给他人,那么文件存入二维码展示的方法有哪些呢?下面给大家分享一招使用二维码生成器来生成二维码图片的操作方法…

[英语学习][3][Word Power Made Easy]的精读与翻译优化

[序言] 这次翻译校验, 难度有点大, 原版中英翻译已出现了严重地偏差. 昨晚11点开始阅读如下段落, 花费了1个小时也没有理解原作者的核心表达, 索性睡觉了. 今早学习完朗文单词之后, 9点半开始继续揣摩. 竟然弄到了中午11点30, 终于明白原作者要表达的意思了. 废话不多说&#x…

SVD recommendation systems

SVD recommendation systems 为什么在推荐系统中使用SVD 一个好的推荐系统一定有小的RMSE R M S E 1 m ∑ i 1 m ( Y i − f ( x i ) 2 RMSE \sqrt{\frac{1}{m} \sum_{i1}^m(Y_i-f(x_i)^2} RMSEm1​i1∑m​(Yi​−f(xi​)2 ​ 希望模型能够在已知的ratings上有好的结果的…

[学习笔记]IK分词器的学习

IK分词器有几种模式 # 测试分词器 POST /_analyze {"text":"黑马程序员学习java太棒了","analyzer": "standard" }# 测试分词器 POST /_analyze {"text":"黑马程序员学习java太棒了","analyzer": &quo…

怎么更新BI报表数据?问我就对了

BI大数据分析工具上有大量的BI报表模板,这些模板都是一个个完整的BI报表,只需将数据源更换,立即就能用来分析我们自己的数据。那,BI报表的数据怎么更新?接下来就来说说这事。 目的:更新BI报表数据 工具&a…

第3章 表、栈和队列

前言 本章讨论最简单和最基本的三种数据结构。实际上,每一个有意义的程序都将至少明确使用一种这样的数据结构,而栈则在程序中总是隐含使用,不管你在程序中是否做了声明。 在这一章,我们将: 介绍抽象数据类型…

Pikachu靶场(PHP反序列化漏洞)

查看php反序列化漏洞的概述&#xff0c;了解序列化与反序列化。 构造payload <?php class S{var $test "<script>alert(wjy)</script>"; } $c new S(); echo(serialize($c)); ?>将对象序列化为O:1:"S":1:{s:4:"test";s:…

【Linux下基本指令——(1)】

Linux下基本指令——&#xff08;1&#xff09; 一. ls 指令1.1.语法&#xff1a;1.2.功能&#xff1a;1.3.常用选项&#xff1a;1.4.举例&#xff1a;1.5.Xshell7展示 二. pwd 命令2.1.语法: 2.2.功能&#xff1a;2.3.常用选项&#xff1a;2.4.Xshell7展示 三. cd 指令3.1.语法…

选择跨网数据摆渡系统时,你最关注的功能是哪些?

为什么要选择跨网数据摆渡系统呢&#xff1f;因为做了网络隔离后&#xff0c;要有数据交互。那为什么要做网络隔离呢&#xff1f;主要还是安全方面的考虑&#xff0c;一般有以下几个原因&#xff1a; 1、数据安全保护&#xff1a;对于一些重要数据&#xff0c;比如代码数据、隐…

hutool工具连接数据库实现数据处理重新入库

1 引入依赖 <dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.7.18</version></dependency><!--mysql驱动包--><dependency><groupId>mysql</groupId><ar…

Python语言学习笔记之四(Python文档化)

本课程对于有其它语言基础的开发人员可以参考和学习&#xff0c;同时也是记录下来&#xff0c;为个人学习使用&#xff0c;文档中有此不当之处&#xff0c;请谅解。 Python文档化是指在Python代码中添加注释和文档字符串&#xff0c;以提供有关代码的详细信息和说明。 文档的…

P24 C++ 字符串常量

前言 本期我们讨论字符串字面量。 这是一种基于字符串的东西&#xff0c;上一章我们讲过字符串&#xff0c;你一定要去先去看看那一期的内容。 P23 C字符串-CSDN博客 01 什么是字符串字常量呢&#xff1f; 字符串字面量就是在双引号之间的一串字符 在上面的代码中&#xf…

Unity针对XBOX,SWITCH,PS5手柄的适配踩坑

前言&#xff1a; 记录一点最近在做手柄适配问题的踩坑。 这里推荐一款Unity做手柄适配的插件->Rewired Rewired官方文档链接Rewired Documentation | Supported Controllers Rewired插件里面有个是Player类&#xff0c;这个类获取到当前玩家的输入设备&#xff0c;输入…

酷开系统 | 追求娱乐不止一种方式,酷开科技带你开启新体验!

在当今社会&#xff0c;娱乐方式多种多样&#xff0c;人们对于娱乐的需求和追求也在日益增长。然而&#xff0c;传统的娱乐方式已经无法满足大家对于多元化、个性化的体验需求。此时&#xff0c;酷开科技以其独特的视角和领先的技术&#xff0c;为消费者们带来了全新的娱乐体验…

【数据结构 —— 二叉树的链式结构实现】

数据结构 —— 二叉树的链式结构实现 1.树的概念及其结构1.1.树概念1.2.树的结构1.3树的相关概念1.4.树的表示1.5. 树在实际中的运用&#xff08;表示文件系统的目录树结构&#xff09; 2.二叉树的概念及其结构2.1二叉树的概念2.2.现实中的二叉树&#xff1a;2.3. 特殊的二叉树…

mysql 命令行导入sql 数据,windows导入,强制导入

线上用了polarDB&#xff0c; 本地导入的时候&#xff0c;通过navicat 的备份导入和执行sql文件的方式导入都失败了 用命令行的方式可以导入sql 当我用windows 的cmd 导入的时候&#xff0c;会报一些命令行的错误。 那其实我检查了这个命令是没有问题的。 mysql -uroot -p hu…

asp.net mvc游戏门户网站

c#asp.net mvc 说明文档 运行前附加数据库.mdf&#xff08;或sql生成数据库&#xff09; 主要技术&#xff1a; 基于asp.net mvc架构和sql server数据库&#xff0c;并采用EF实体模型开发三层架构BLL DAL 功能模块&#xff1a; 前端展示首页 新闻公告 英雄档案 视频图片 管理…

解决苹果手机iphone手机强制重启

强制关机&#xff1a; 方法1.同时按住左侧的&#xff0c;- 键中的一个和右侧的电源键 方法2.点击桌面的悬浮键–设备–更多–重新启动

Elasticsearch(一)

一&#xff1a;简介 The Elastic Stack, 包括 Elasticsearch、 Kibana&#xff08;展示数据的项目&#xff09;、 Beats 和 Logstash&#xff08;这两个是采集和传输数据的项目&#xff09; 这些项目组合形成的技术栈称为ELK Stack&#xff0c;能够安全可靠地获取任何来源、任…

想学计算机视觉入门的可以看过来了

文章写了有一段时间了&#xff0c;期间不少小伙伴来咨询如何自学入门AI&#xff0c;或者咨询一些AI算法。 90%的问题我都回复了&#xff0c;但有时确实因为太忙&#xff0c;没顾得过来。 在这个过程中&#xff0c;我发现很多小伙伴问的问题都类似&#xff1a;比如如何入门计算…