【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-12
   for 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:
           continue
   print(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[‘最高气温’]中的每个值分配到这些预定义的区间中。结果存储在新的列’温度区间’中,为每个最高气温值标记了对应的温度区间。

在这里插入图片描述

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

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

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

相关文章

【工具】Zotero|使用Zotero向Word中插入引用文献(2023年)

版本:Word 2021,Zotero 6.0.30 前言:两年前我找网上插入文献的方式,网上的博客提示让我去官网下个插件然后才能装,非常麻烦,导致我对Zotero都产生了阴影。最近误打误撞发现Zotero自带了Word插件&#xff0c…

集成IDE开发环境,Java开发工具IntelliJ IDEA 2023中文

IntelliJ IDEA 2023是一款功能强大的软件,其为程序员提供了一款先进的集成开发环境。它以智能、高效和人性化为主要特点,致力于提高开发人员的生产力,帮助程序员更快、更好地编写代码。IntelliJ IDEA 2023支持多种语言和框架,包括…

iOS 通用链接的配置(Universal Links)

一、打开Associated Domains 1.首先登录 苹果开发者网站 2.Certificates, Identifiers & Profiles 下的Identifiers 找到要配追的Identifiers 点进去 3.打开Associated Domains然后保存 二、更新Profile文件 如果我们使用自动的,可以忽略这一步,…

梦极光(ez_re???)

ez_re 先查壳看看,没有壳 32位 我先说说这道题 打开分析找到主函数 在这里就是flag了,用十六进制转ascll码 我们先运行这个程序看看 我想说说我的想法 首先没看出来这里是十六进制转ascll码其次41D538数组用来干啥来的?题目里面给出的请…

Docker监控Weave Scope的安装和使用

1.本地安装Weave Scope 1)创建文件夹。 mkdir /usr/local/bin/scope 2)从本地上传文件。 rz scope.bin以资源形式已上传到文章开篇。 3)修改scope.bin文件为可执行文件。 chmod 755 /usr/local/bin/scope/scope.bin 4)执行sco…

Linux文件目录结构_文件管理

Linux文件目录结构 Linux目录结构简洁 windows:以多根的方式组织文件 C:\ D:\ E:\ Linux: 以单根的方式组织文件/ Linux目录结构视图 注意区分: 系统管理员:中文“根”,root 系统目录(文件夹):根&#xf…

Unity之ARFoundation如何实现BodyTracking人体跟踪

前言 ARBodyTracking,就是指通过手机AR扫描并精确的捕获人物的肢体部位的技术。如下图所示 这项技术目前是有苹果的ARKit提供,苹果的body tracking 功能需要使用配备 TrueDepth 摄像头的设备,配备 A12 仿生芯片、运行 iOS 13 或更高版本的设备,比如 iPhone X 及更新机型。…

matlab频谱合成音乐《追光者》

选择你喜欢的一首钢琴曲,下载并分析曲谱,用matlab工具用频谱合成方法完成这首曲子的音乐合成。 前言:此文章为个人使用Matlab合成一首《追光者》音乐,且带混响和声效果 文章目录 一.题目二.要求三.课程设计目的四.概要设计五.详细…

【算法】一个简单的整数问题(树状数组、差分)

题目 给定长度为 N 的数列 A,然后输入 M 行操作指令。 第一类指令形如 C l r d,表示把数列中第 l∼r 个数都加 d。 第二类指令形如 Q x,表示询问数列中第 x 个数的值。 对于每个询问,输出一个整数表示答案。 输入格式 第一行…

chatgpt prompt提示词

ChatGPT 最近十分火爆,今天我也来让 ChatGPT 帮我阅读一下 Vue3 的源代码。 都知道 Vue3 组件有一个 setup函数。那么它内部做了什么呢,今天跟随 ChatGPT 来一探究竟。 实战 1.setup setup 函数在什么位置呢,我们不知道他的实现函数名称&…

每日一练:简易计算器

1. 题目 设计实现一个简易的计算器,可以进行加减乘除的计算。可以考虑通过GUI和命令行输入等方式实现。 2. 设计思路 创建一个简单的用户界面,可以使用 Python 的 Tkinter模块。在界面上放置按钮,每个按钮代表一个数字、运算符或其他功能。…

【Redis实现全局唯一ID】

一、全局唯一ID的需求产生。 在订单业务中,我们需要保证id是绝对唯一的。 使用数据库自增长的id在分布式的情况下把表做了拆分处理后有可能会出现id重复的情况,这就违背了唯一性。而且数据自增长的id有很强的规律性,可以根据id推断出订单的数…

人工智能|机器学习——机器学习如何判断模型训练是否充分

一、查看训练日志 训练日志是机器学习中广泛使用的训练诊断工具,每个 epoch 或 iterator 结束后,在训练集和验证集上评估模型,并以折线图的形式显示模型性能和收敛状况。训练期间查看模型的训练日志可用于判断模型训练时的问题,例…

基于振弦式轴力计和采集仪的安全监测解决方案

基于振弦式轴力计和采集仪的安全监测解决方案 振弦式轴力计是一种测量结构物轴向力的设备,通过测量结构物上的振弦振幅变化,可以确定结构物轴向力的大小。采集仪是一种用于采集和存储传感器数据的设备,通常与振弦式轴力计一起使用&#xff0c…

Redis基本操作及使用

📑前言 本文主要是【Redis】——Redis基本操作及使用的文章,如果有什么需要改进的地方还请大佬指出⛺️ 🎬作者简介:大家好,我是听风与他🥇 ☁️博客首页:CSDN主页听风与他 🌄每日一…

【08】Python运算符

文章目录 1.算术运算符2.赋值运算符3.条件运算符4.逻辑运算符5.比较运算符6.运算符的优先级本期博客中,我们将学习python中常用的运算符的用法。              1.算术运算符 1.加法运算符(+): a = 10 b = 5 c = a + b print(c

LeetCode(35)螺旋矩阵【矩阵】【中等】

目录 1.题目2.答案3.提交结果截图 链接: 54. 螺旋矩阵 1.题目 给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。 示例 1: 输入:matrix [[1,2,3],[4,5,6],[7,8,9]] 输出&#xff1a…

TOD和PPS精确时间同步技术

介绍 PPS和TOD PPS和TOD是两种用于精确时间同步的技术,它们在许多领域都有广泛的应用,总的来说,PPS和TOD被广泛应用于各种需要高度精确时间同步的领域,包括通信、测量、测试、系统集成和计算机网络等。 一、PPS PPS&#xff08…

五分钟 k8s 实战-应用探针

Probe.png 今天进入 kubernetes 的运维部分(并不是运维 kubernetes,而是运维应用),其实日常我们大部分使用 kubernetes 的功能就是以往运维的工作,现在云原生将运维和研发关系变得更紧密了。 今天主要讲解 Probe 探针相…

leetCode 39.组合总和 + 回溯算法 + 剪枝 + 图解 + 笔记

39. 组合总和 - 力扣(LeetCode) 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合 can…