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

news2024/11/24 8:51:07

基于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新数据

八、源码下载

源码、安装教程文档、项目简介文档以及其它相关文档已经上传到是云猿实战官网,可以通过下面官网进行获取项目!

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

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

相关文章

【Go语言】基于Socket编程的P2P通信程序示例

Go语言的Socket编程实现为开发者提供了一种高效且强大的方式来实现网络通信。通过Go语言的并发模型和内置的网络库&#xff0c;如net包&#xff0c;开发者可以轻松地创建基于套接字的通信应用。Go语言的goroutine和channel机制使并发处理变得简单&#xff0c;能够轻松处理多个连…

Address already in use: bind 如何解决端口号被占用

Address already in use: bind 程序报错&#xff0c;说明端口号已经被占用了。在不重启计算机的情况下&#xff0c;可通过如下方式解决 一&#xff1a; winR 快捷键 输入cmd指令打开黑框 二&#xff1a;输入指令 netstat -ano 查看端口号 三&#xff1a;根据端口号&#xff0c…

色差分量接口ESD静电保护推荐TVS二极管:DW03DLC-B-S和DW05R-E

YCbCr/YPbPr色差分量接口是S-Video端子的升级产品&#xff0c;支持1080P高清&#xff0c;由红、绿、蓝三种颜色的线组成&#xff0c;其中&#xff0c;蓝色和红色分别传输蓝色差信号&#xff08;Cb/Pb&#xff09;和红色差信号&#xff08;Cr/Pr&#xff09;&#xff0c;而绿色传…

【vue3+ts项目】配置husky+配置commitlint

上一篇文章中配置了eslint校验代码工具 【vue3ts项目】配置eslint校验代码工具&#xff0c;eslintprettierstylelint 1、配置husky 每次手动执行命令才能格式化代码&#xff0c;如果有人没有格式化就提交到远程仓库&#xff0c;这个规范就起不到作用了&#xff0c;所有需要强…

【C++初阶】模拟实现vector

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前学习C和算法 ✈️专栏&#xff1a;C航路 &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章对你有帮助的话 欢迎 评论&#x1f4ac; 点赞&#x1…

【测试】pywinauto的简单使用(安装、常用对象、元素控件、鼠标操作、键盘操作)

1.说明 pywinauto是一个用于自动化Python 模块&#xff0c;适合Windows系统的软件&#xff08;GUI&#xff09;&#xff0c;可以通过Pywinauto遍历窗口&#xff08;对话框&#xff09;和窗口里的控件&#xff0c;也可以控制鼠标和键盘输入&#xff0c;所以它能做的事情比之前介…

鲁图中大许少辉博士八一新书《乡村振兴战略下传统村落文化旅游设计》山东省图书馆典藏

鲁图中大许少辉博士八一新书《乡村振兴战略下传统村落文化旅游设计》山东省图书馆典藏

数据宽度、KEIL汇编和GNU汇编的区别

数据宽度 DCB data control byte(byte) DCW data control half word(short) DCD data control word(int) DCQ data control (long)KEIL汇编和GNU汇编的区别 IDA关于please position the cursor within a funtion的解决 我是在C/C++反编译中出现的问题,因为在动态调试的时候…

ctfshow-web11

0x00 前言 CTF 加解密合集CTF Web合集 0x01 题目 0x02 Write Up 这里要求输入的passwd和session必需要相当&#xff0c;那么我们只要让密码和session都为空即可。 以上

Vue的Ajax请求-axios、前后端分离练习

Vue的Ajax请求 axios简介 ​ Axios&#xff0c;是Web数据交互方式&#xff0c;是一个基于promise [5]的网络请求库&#xff0c;作用于node.js和浏览器中&#xff0c;它是 isomorphic 的(即同一套代码可以运行在浏览器和node.js中)。在服务端它使用原生node.js http模块, 而在…

%f占位符

介绍&#xff1a; %f &#xff0c;用来输出实数&#xff08;包括单双精度&#xff09;&#xff0c;以小数形式输出。 通常情况下&#xff0c;当输入的数值或者打印的数值是float类型数据时&#xff0c;使用%f &#xff0c;当然在精度更高的double数据类型下&#xff0c;也可以…

行业追踪,2023-08-22

自动复盘 2023-08-22 凡所有相&#xff0c;皆是虚妄。若见诸相非相&#xff0c;即见如来。 k 线图是最好的老师&#xff0c;每天持续发布板块的rps排名&#xff0c;追踪板块&#xff0c;板块来开仓&#xff0c;板块去清仓&#xff0c;丢弃自以为是的想法&#xff0c;板块去留让…

Windows端口占用CMD关闭端口(8080被占用)

一、背景 作为一名开发&#xff0c;我们是不是经常遇到端口被占用了&#xff0c;比如80&#xff0c;8080等&#xff0c;但是我们却不知道是那个工程启动&#xff0c;对小白来说&#xff0c;估计会很苦恼&#xff0c;网上搜索也很麻烦处理&#xff0c;网上推荐也是如下步骤&…

springBoot防止重复提交

自定义注解AOPRedis 自定义注解 package com.wzw.config.anno;import java.lang.annotation.*;/*** 自定义注解防止表单重复提交*/ Target(ElementType.METHOD) // 注解只能用于方法 Retention(RetentionPolicy.RUNTIME) // 修饰注解的生命周期 Documented public interface …

2024届校招:校招必须知道的三件事

校招提前知 提到校招&#xff0c;不少同学受到“金九银十”的影响&#xff0c;认为九、十月份是进行校招的时间段。但实际上&#xff0c;校招的时间越来越提前&#xff0c;上周陆续有央企、国企开启了24届提前批的招聘&#xff0c;打响了24届校招的第一枪。今天给大家整理了校…

Google Guava Cache的使用

1、前言 Google Guava Cache是Google Guava库中的一个缓存框架&#xff0c;用于缓存计算结果、数据或资源&#xff0c;提高程序访问效率和响应速度。Guava Cache具有以下特点&#xff1a; ①可配置性&#xff1a;Guava Cache支持多种缓存参数的配置&#xff0c;例如缓存大小、…

全流程R语言Meta分析核心技术教程

详情点击链接&#xff1a;全流程R语言Meta分析核心技术教程 一&#xff0c;Meta分析的选题与检索 1、Meta分析的选题与文献检索 1)什么是Meta分析&#xff1f; 2)Meta分析的选题策略 3)精确检索策略&#xff0c;如何检索全、检索准 4)文献的管理与清洗&#xff0c;如何制定文…

【Winform学习笔记(八)】通过委托实现跨窗体传值

通过委托实现跨窗体传值 前言正文1、委托及事件2、通过委托实现跨窗体传值的步骤1.在子窗体中定义委托2.在子窗体中声明一个委托类型的事件3.调用委托类型事件4.在实例化子窗体后&#xff0c;子窗体订阅事件接受方法5.实现具体的事件 3、具体示例4、完整代码5、实现效果 前言 …

cesium官网链接打不开

经常遇到cesium官网的某些链接打不开的情况 比如下面是一个cesium官网的blog链接 https://cesium.com/blog/2015/08/10/Introducing-3D-Tiles/ 可是打不开 解决办法&#xff1a; 把url中所有大写的字母都改成小写 大写的地方用黑体标出&#xff1a;Introducing-3D-Tiles …

SAP SPL(Special Ledger)之注释行项目-Noted Items

财务凭证过账里常见的SPL特殊总账标识根据业务主要有三种&#xff0c;BoE-billing of exchange: 汇票业务&#xff0c;包括商业汇票和银行汇票&#xff1b;Down Payment&#xff0c;预付款业务&#xff0c;包括供应商和客户预付款和申请&#xff1b;其它&#xff0c;一般是保证…