【Python程序设计】基于Python Flask的全国气象数据采集及可视化系统-附下载方式以及项目参考论文,原创项目其他均为抄袭

news2024/11/22 6:20:12

基于Python Flask的全国气象数据采集及可视化系统

    • 一、项目简介
    • 二、项目技术
    • 三、项目功能
    • 四、运行截图
    • 五、分类说明
    • 六、实现代码
    • 七、数据库结构
    • 八、源码下载地址

一、项目简介

本项目是一个基于Web技术的实时气象数据可视化系统。通过爬取中国天气网的各个城市气象数据,并将其保存到自己的数据库中,我们利用Python、Flask、ECharts和MySQL等技术,实现了数据的分析和可视化呈现。这是一个采用B/S架构的现代化气象数据管理系统,用户只需通过浏览器便可访问。在项目完善版本中,我们进一步优化了数据处理和可视化,提高了系统的性能和用户体验。

二、项目技术

  • Python爬虫技术:借助Python强大的网络爬虫库,我们能够高效地从中国天气网上获取实时气象数据,并将其转化为结构化数据。
  • Flask后端框架:作为一种轻量级的后端框架,Flask简化了开发流程,使得我们能够快速搭建灵活且可扩展的Web应用程序。
  • MySQL数据库:作为一个成熟的关系型数据库管理系统,MySQL提供了高效可靠的数据存储和查询能力,使得我们能够方便地管理爬取的气象数据。
  • ECharts大数据可视化:ECharts作为当时流行的数据可视化库,为我们提供了丰富的图表类型和交互式特性,使得我们能够将庞大的气象数据以直观的图表形式展示给用户。
  • layui后台管理前端框架:借助layui框架,我们实现了美观、简洁的后台管理界面,提升了用户操作的友好性和便捷性。

三、项目功能

系统功能模块的设计是基于对现实需求的深入理解和用户体验的关注,详情功能结构图,如下图所示。主要包括以下五大功能:

  • 可视化功能模块:通过ECharts技术,将爬取的气象数据转化为图表形式,以直观的方式展示各城市的气象情况,使用户能够快速把握气象趋势和变化,更好地做出决策。
  • 版本管理功能模块:用于记录系统的不同版本,包括功能更新、性能优化和Bug修复等内容,确保系统持续发展和不断完善。
  • 用户管理功能模块:实现用户注册、登录和权限控制,不同用户拥有不同的菜单权限,保障系统的安全性和数据隐私。
  • 实时气象数据管理功能模块:用于存储、更新和管理从中国天气网爬取的实时气象数据,确保数据的准确性和及时性。
  • 爬虫管理功能模块:针对爬虫任务进行管理,包括设置爬取频率、指定目标城市等,以确保爬虫的高效稳定运行。
    在这里插入图片描述

四、运行截图

大屏可视化页面请添加图片描述

用户登录页面
请添加图片描述用户注册页面
请添加图片描述后台管理首页面
在这里插入图片描述后台用户管理页面
在这里插入图片描述后台版本管理页面
在这里插入图片描述后台气象管理页面
在这里插入图片描述后台气象编辑页面
在这里插入图片描述后台爬虫日志管理页面
在这里插入图片描述

五、分类说明

AQI:

0-50良好

51-100:中等

101-150:偏差,对敏感人群不健康

151-200:差,不健康

201-300:极差,非常不健康

300+:有毒

风力等级:

在这里插入图片描述

六、实现代码

爬虫头部实现代码

class GetWeather:
    def __init__(self):
        self.baseUrl = r""
        self.headers = {'Accept': "*/*",
                        'Accept-Encoding': 'gzip, deflate',
                        'Accept-Language': 'keep-alive',
                        'Connection': '',
                        'Cookie': ''.encode("utf-8").decode("latin1"),
                        'Host': 'd1.weather.com.cn',
                        'Referer': '',
                        'User-Agent': '', }
        self.loadList = []
        # 格式为:列表里面的子列表都是一个省份的所有城市,子列表里所有元素都是字典,每个字典有两项
        self.cityList = [] 
        self.cityDict = {}
        self.result = xlwt.Workbook(encoding='utf-8', style_compression=0)
        self.sheet = self.result.add_sheet('result', cell_overwrite_ok=True)
        self.cityRow = 0
        self.totalGet = 0

数据清洗存入数据库

 data = json.loads(self.htmlResult.replace("var dataSK=", ""))
                nameen = data["nameen"]  # 城市拼音
                cityname = data["cityname"]  # 城市名称
                temp = data["temp"]  # 当前温度
                WD = data["WD"]  # 风向
                WS = data["WS"].replace("级", "")  # 风力
                wse = data["wse"].replace("km/h", "")  # 风速
                sd = data["sd"].replace("%", "")  # 湿度
                weather = data["weather"]  # 天气
                record_date = data["date"]  # 时间
                record_time = data["time"]  # 时分
                aqi = data["aqi"]  # 时分
                judge_sql = "select count(id) from `weather` where nameen = '" + nameen + "' and cityname='" + cityname + "' and record_date='" + record_date + "' and record_time='" + record_time + "'";
                sql = "INSERT INTO `weather` VALUES (null, '" + nameen + "', '" + cityname + "', '" + record_date + "', '" + record_time + "', " + str(
                    temp) + ", '" + WD + "', " + WS + ", " + wse + ", " + sd + ", '" + weather + "', " + aqi + ", '" + time.strftime(
                    "%Y-%m-%d %H:%M:%S", time.localtime()) + "',0);"
                i = db.query_noargs(judge_sql)[0][0]
                if int(i) > 0:
                    print("跳过:", judge_sql)
                    continue
                update_sql = "update `weather` set is_old=1 where nameen = '" + nameen + "' and cityname='" + cityname + "'";
                print("插入:", sql)
                count += 1
                db.query_noargs(update_sql)
                db.query_noargs(sql)

首页城市空气质量统计

# 获取城市空气质量统计
def get_AQI_total_data():
    db = dbUtil()
    lh_sql = "SELECT COUNT(id) FROM weather WHERE aqi<=50 AND is_old=0"
    zd_sql = "SELECT COUNT(id) FROM weather WHERE aqi>50 AND aqi<=100 AND is_old=0"
    pc_sql = "SELECT COUNT(id) FROM weather WHERE aqi>100 AND aqi<=150 AND is_old=0"
    c_sql = "SELECT COUNT(id) FROM weather WHERE aqi>150 AND aqi<=200 AND is_old=0"
    jc_sql = "SELECT COUNT(id) FROM weather WHERE aqi>200 AND aqi<=300 AND is_old=0"
    yd_sql = "SELECT COUNT(id) FROM weather WHERE aqi>300 AND is_old=0"
    lh = db.query_noargs(lh_sql)[0][0]
    zd = db.query_noargs(zd_sql)[0][0]
    pc = db.query_noargs(pc_sql)[0][0]
    c = db.query_noargs(c_sql)[0][0]
    jc = db.query_noargs(jc_sql)[0][0]
    yd = db.query_noargs(yd_sql)[0][0]
    db.close_commit()
    return jsonify([{"time": "良好", "value": lh, "name": "空气质量"},
                    {"time": "中等", "value": zd, "name": "空气质量"},
                    {"time": "偏差", "value": pc, "name": "空气质量"},
                    {"time": "较差", "value": c, "name": "空气质量"},
                    {"time": "极差", "value": jc, "name": "空气质量"},
                    {"time": "有毒", "value": yd, "name": "空气质量"}])

空气质量可视化构建

function center_kqzlfm() {    
    $.ajax({       
        url: "/main/aqi",
        method: "get",
        success: function (obj) {
            // 基于准备好的dom,初始化echarts实例            
            const myChart = echarts.init(document.getElementById("kqzlfm-table")) 
            // 指定图表的配置项
            let option = {...}            
            // 指定图表的数据
            let data = obj            
            //数据处理 开始
            let xKey = "time" 
            let yKey = "value" 
            let sKey = "name"
            let seriesArr = []
            let dataColumn = []   
            //....省略数据格式化处理太长了
            option.yAxis.type = "value"
            option.xAxis.type = "category"
            option.xAxis.data = dataColumn
            // 数据处理完 
            option.series = seriesObj
            // 使用刚指定的配置项和数据显示图表。
            myChart.setOption(option) 
        }   
    })}

七、数据库结构

slog表

字段名称数据类型是否必填注释
idint
logvarchar(255)
create_timedatetime

sys_version表

字段名称数据类型是否必填注释
idint系统版本
sys_namevarchar(255)名称
sys_versionvarchar(255)描述

user表

字段名称数据类型是否必填注释
idint
namevarchar(255)用户名称(供应商名称)
accountvarchar(255)用户账号
passwordvarchar(255)用户密码
companyvarchar(255)企业名称
phonevarchar(255)电话号码
mailvarchar(255)邮箱
typeint0管理员,1普通用户
statusint0禁用1启用

weather表

字段名称数据类型是否必填注释
idint
nameenvarchar(255)城市拼音
citynamevarchar(50)城市名称
record_datevarchar(50)天气时间
record_timevarchar(50)实时时分
tempint当前温度
wdvarchar(20)风向
wsint凤力
wseint风速
sdint湿度
weathervarchar(20)天气
aqiint空气质量
create_timedatetime数据创建时间
is_oldint1老数据,0新数据

八、源码下载地址

原创项目,开发不易,保证项目经过多人调试与测试,可以准确无误运行(经过最新调试,系统依旧可以持续运行

项目获取地址:

#浏览器打开一下官方网站进行项目源码下载
www.shiyuncode.com/productlist/2?search=%E6%B0%94%E8%B1%A1

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

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

相关文章

linkis 1.1.1 报错 No plugin found spark-2.4.8, please check your configuration

按照官方教程设置,但是仍然报错 Caused by: java.util.concurrent.ExecutionException: LinkisException{errCode70063, descNo plugin found spark-2.4.8, please check your configuration, iphadoop0004, port9103, serviceKindlinkis-cg-engineplugin} 这个时候,我们首先检…

配置pyqt5开发环境

安装库 pip install pyqt5 -i https://mirrors.aliuyun.com/pypi/simple pip install pyqt5-tools -i https://mirrors.aliuyun.com/pypi/simple pip install PyQt5designer -i https://mirrors.aliuyun.com/pypi/simple配置External Tools Name:QtDesigner Program:C:\Anaco…

第九章 动态规划part10(代码随想录)

121. 买卖股票的最佳时机 1. 确定dp数组&#xff08;dp table&#xff09;以及下标的含义 用二维dp数组表示第i天的2种状态 dp[i][0] 表示第i天持有股票所得最多现金&#xff0c;可能i-1天就买股票了 dp[i][1] 表示第i天不持有股票所得最多现金 最后求&#xff1a;dp[len-1][0…

SQLServer数据库获取单表重复记录中日期最新的记录

SQLServer数据库获取重复记录中日期最新的记录 CREATE TABLE [dbo].[t_expense_record_info]([id] [int] IDENTITY(1,1) NOT NULL,[goods_id] [int] NULL,[amount] [decimal](18, 6) NULL,[expense_time] [datetime] NULL,[user_id] [int] NULL,[create_date] [datetime] NULL…

qt初入门0:结构体中QString用memset导致崩溃分析及QLatin1String简单查看源码

初识Qt,进行开发时遇到一个崩溃问题 简单整理 1&#xff1a;问题描述如下&#xff0c;结构体中QString成员&#xff0c;然后对结构体调用了memset导致问题&#xff1a; 2&#xff1a;问题分析&#xff0c;加断点调试的方式可以明确分析到行数 可以明确看出&#xff0c;初始化…

msvcr120.dll丢失怎么修复,介绍几种最简单的修复方法

当您在运行某个程序时遇到msvcr120.dll丢失的错误提示时&#xff0c;可能无法正常启动或执行该程序。msvcr120.dll是Microsoft Visual C Redistributable中的一个动态链接库&#xff08;DLL&#xff09;文件&#xff0c;它是一种运行时库&#xff08;Runtime Library&#xff0…

浅谈时序:set_input_delay

1、set_input_delay的本质 set_input_delay是对模块input信号在模块外部延迟的约束&#xff0c;本质上EDA工具会根据约束调整设计内部的器件类型&#xff0c;摆放的位置以及优化内部组合逻辑保证满足约束要求。 约束指导原则&#xff1a;尽量照顾设计外部逻辑延时 set_input…

机器学习编译系列---张量程序抽象

机器学习编译系列---张量程序抽象 1. 张量函数概念的引入与抽象的必要性 1. 张量函数概念的引入与抽象的必要性 在文章机器学习编译系列—概述中提到&#xff0c;机器学习编译的一个很重要操作是做等价变换来减少内存或者提高运行效率。变换是以“元张量函数”(private tensor …

第一百三十一天学习记录:数据结构与算法基础:栈和队列(下)(王卓教学视频)

队列的表示和操作的实现 循环顺序队列是一种使用数组来实现的队列结构&#xff0c;其中头指针和尾指针表示队列的头部和尾部位置。 当队列为空时&#xff0c;头指针和尾指针都指向同一个位置&#xff0c;即数组的第一个位置。这是因为在空队列中&#xff0c;没有任何元素可以作…

软件测试|Python自动化测试实现的思路

Python自动化测试常用于Web应用、移动应用、桌面应用等的测试 Python自动化实现思路通常分为以下几步&#xff1a; 1. 确定自动化测试的范围和目标&#xff1a; 首先需要明确需要进行自动化测试的范围和目标&#xff0c;包括测试场景、测试用例、测试数据等。 2. 选择自动化…

分析商务报表使用什么工具?

传统的BI分析商务报表存在的问题 随着数字化转型的深入推进&#xff0c;企业面临着海量数据的挑战和机遇。数据是企业的重要资产&#xff0c;能够帮助企业洞察市场动态、优化业务流程、提升客户满意度、创造竞争优势。然而&#xff0c;传统的BI&#xff08;商业智能&#xff0…

【IMX6ULL驱动开发学习】07.驱动程序分离的思想之平台总线设备驱动模型和设备树

一、驱动程序分离的思想 【IMX6ULL驱动开发学习】05.字符设备驱动开发模板&#xff08;包括读写函数、poll机制、异步通知、定时器、中断、自动创建设备节点和环形缓冲区&#xff09;_阿龙还在写代码的博客-CSDN博客 之前编写驱动程序的代码存在不少弊端&#xff1a;移植性差…

治疗偏头痛等亚疼痛的远程电神经调控(REN)设备

原文链接&#xff1a; NERIVIO CE标志适应症扩展到青少年和成人偏头痛的预防和急性治疗 (prnewswire.com) 公司官网&#xff1a; Homepage - Theranica APP下载链接&#xff1a; Migraine Headache Treatment - Nerivio 使用过程问题&#xff1a; 常见问题 - 无药物偏头痛两…

解决Oracle中XML插入数据时的空格问题

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

05- 定时器

定时器 定时器5.1 独立看门狗定时器独立看门狗的配置步骤&#xff1a;看门狗计时时间的计算&#xff1a; 5.2 窗口看门狗看门狗有什么作用&#xff1f;窗口看门狗超时时间计算&#xff1a;窗口看门狗的配置过程&#xff1a; 5.3 通用定时器三种定时器&#xff1a; 计数器的时钟…

使用Jmeter进行压力测试你所不知道内幕

在网络很多网友反馈Jmeter的测试结果不准确&#xff0c;下面我们主要聊一下不准确的原因。 Jmeter 是ASF的一款开源免费软件 &#xff0c;在国内被很多中小公司当作性能测试工具广泛使用。Apache软件基金会&#xff08;ASF&#xff09;是一家总部位于美国的非营利性慈善组织。…

Binder机制原理解析

前言 我们都知道Android应用程序由Activity、Service、Broadcast Receiver、Content Provider四大组件构成的,他们可能运行在不同进程中&#xff0c;还有Android系统中还有各种服务&#xff0c;例如Actiivty管理服务ActivityManagerService、电源管理服务PowerManagerService、…

半导体退火那些事(3)

4.半导体退火设备 双腔全自动兼容6-8寸快速退火炉RTP 产地:中国 型号: S803 特点: 室温到1250C&#xff0c;应用于SiC&#xff0c;GaN等第三代半导体领域 简介 (Description) S803系列自动快速退火炉&#xff0c;内置Robot可以自动取放片&#xff0c;适用于最大8英寸 (单片200m…

【MySQL系列】-回表、覆盖索引真的懂吗

【MySQL系列】-回表、覆盖索引真的懂吗 文章目录 【MySQL系列】-回表、覆盖索引真的懂吗一、MYSQL索引结构1.1 索引的概念1.2 索引的特点1.3 索引的优点1.4 索引的缺点 二、B-Tree与BTree2.1 B-Tree2.2 BTree2.3 B-Tree 与BTree树的区别2.4 那么为什么InnoDB的主键最好要搞成有…

【数据结构OJ题】链表的回文结构

原题链接&#xff1a;https://www.nowcoder.com/practice/d281619e4b3e4a60a2cc66ea32855bfa?tpId49&&tqId29370&rp1&ru/activity/oj&qru/ta/2016test/question-ranking 目录 1. 题目描述 2. 思路分析 3. 代码实现 1. 题目描述 2. 思路分析 在做这道…