2024最新-基于 VUE + Flask全国空气质量预测数据可视化

news2024/9/20 11:24:16

目录

1.1. 项目介绍

1.2. 技术栈

1.3. 数据来源 

    1.3.1. 设置城市和时间为爬虫程序的入口

    1.3.2. 爬虫程序主要代码

   1.3.3. 后端代码调用js

1.4. 后端实现

1.5. 前端实现

1.6. 页面展示

1.6.1. 地图展示

1.6.1.1 省级地图

 1.6.1.2 县级地图

1.6.2. 全国分布

1.6.3. 区域分布

1.6.4. 城市比较

1.6.5. 统计排名

1.6.6 历史数据

1.6.7 模型预测


1.1. 项目介绍

    今天我们介绍一个从数据采集、数据加工、数据预测,最后集成到数据可视化展示的一个完整的项目案例。

1.2. 技术栈

  • 前端:Vue.js
  • 后端:Flask
  • 数据源:全国空气质量监测数据(可从公开API获取)
  • 可视化库:Echart.js

1.3. 数据来源 

      通过实时采集全国 23个省、5个自治区、4个直辖市和2个特别行政区下的293个市的每一天的空气质量数据。

     通过分析网站接口,扣取JS代码,编写后端代码嗲用js,实现数据的采集。

    1.3.1. 设置城市和时间为爬虫程序的入口

m0fhOhhGL = "GETDAYDATA"
oNLhNQ = {
    city: '云浮',
    month: '202309'
}

    1.3.2. 爬虫程序主要代码

function poPBVxzNuafY8Yu (m0fhOhhGL, oNLhNQ) {
    var aMFs = "3c9208efcfb2f5b843eec8d96de6d48a";
    var cVWG2 = "WEB";
    var t5GECZQ = new Date().getTime();
    var pKmSFk8 = {
        appId: aMFs,
        method: m0fhOhhGL,
        timestamp: t5GECZQ,
        clienttype: cVWG2,
        object: oNLhNQ,
        secret: hex_md5(aMFs + m0fhOhhGL + t5GECZQ + cVWG2 + JSON.stringify(osZ34YC04S(oNLhNQ)))
    };
    pKmSFk8 = BASE64.encrypt(JSON.stringify(pKmSFk8));
    pKmSFk8 = AES.encrypt(pKmSFk8, acky6QolJSJi, acixHVhiNqmK);
    return pKmSFk8;
}

function dxvERkeEvHbS(data) {
    data = BASE64.decrypt(data);
    data = DES.decrypt(data, dskQCqpdBOGo, dsiqYiQHbZQp);
    data = AES.decrypt(data, ask4u6FbhGV8, asi2hhkBUJbo);
    data = BASE64.decrypt(data);
    return data;
}

   1.3.3. 后端代码调用js

# -*- coding: utf-8 -*-
"""
@Time : 2024/8/30 22:10
@Auth : Gmq
@File :xxx.py
@IDE :PyCharm
@WECHAT :debugger66
"""
import json
import time
from queue import Queue
import requests
import execjs
from pymongo import MongoClient
from lxml import etree

client = MongoClient()
collection = client['2tData']['airquality']


class GN:
    def __init__(self):
        self.url = 'https://www.aqistudy.cn/historydata/api/historyapi.php'
        self.headers = {
            "Accept": "*/*",
            "Accept-Language": "en-GB,en;q=0.9,zh-CN;q=0.8,zh;q=0.7",
            "Sec-Fetch-Dest": "document",
            "Sec-Fetch-Mode": "navigate",
            "Origin": "https://www.aqistudy.cn",
            "Sec-Fetch-Site": "none",
            "Upgrade-Insecure-Requests": "1",
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0",
            "sec-ch-ua": "Not/A)Brand;v=8, Chromium;v=126, Microsoft Edge;v=126",
            "sec-ch-ua-mobile": "?0",
            "sec-ch-ua-platform": "Windows",
            "Referer": "https://www.aqistudy.cn/historydata/daydata.php?city=^%^E5^%^8C^%^97^%^E4^%^BA^%^AC&month=2023-11^",
            "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
        }
        self.m0fhOhhGL = 'GETDAYDATA'
        self.oNLhNQ = {}
        self.js = execjs.compile(open('xxx.js',encoding='utf-8').read())
        # self.ip_queue = Queue()

    def request_data(self, city, month):
        self.oNLhNQ['city'] = city
        self.oNLhNQ['month'] = month
        proxy_ip = self.ip_queue.get()
        # 使用代理必须设置代理账号和密码
        username = '代理账号'
        password = '代理密码'
        
        proxies = {
             "http": "http://%(user)s:%(pwd)s@%(proxy)s/" % {"user": username, "pwd": password, "proxy": proxy_ip},
             "https": "http://%(user)s:%(pwd)s@%(proxy)s/" % {"user": username, "pwd": password, "proxy": proxy_ip}
        }

        pKmSFk8 = self.js.call('poPBVxzNuafY8Yu', self.m0fhOhhGL, self.oNLhNQ)
        print(pKmSFk8)
        res = requests.post(self.url, headers=self.headers, data={'hA4Nse2cT': pKmSFk8})

        result = self.js.call('dxvERkeEvHbS', res.text)

        return json.loads(result)

    def run(self):
        for one_city in self.get_city():
            reuslt = self.request_data(one_city, '202405')
            for i in reuslt['result']['data']['items']:
                i['city'] = one_city
                collection.insert_one(i)

    @staticmethod
    def get_city():
        citys = []
        with open('./a.html', 'r', encoding='utf-8') as f:
            text = f.read()
        xhtml = etree.HTML(text)
        lis = xhtml.xpath('//div[@class="all"]//ul[@class="unstyled"]/div/li')
        for li in lis:
            city = li.xpath('./a/text()')
            citys.append(city[0])
        return citys


if __name__ == '__main__':
    gn = GN()
    gn.run()

1.4. 后端实现

1.4.1 介绍

       后端采用flask框架编写数据接口和主要逻辑处理,采用mysql数据库进行数据的增删改查。

1.4.2 项目架构

flask_project/
│
├── app/                   # 主应用目录
│   ├── __init__.py        # 应用工厂模式
│   ├── routes.py          # 路由定义
│   ├── models.py          # 数据模型
│   ├── forms.py           # 表单定义
│   ├── static/            # 静态文件(CSS、JavaScript、图片)
│   ├── templates/         # 模板文件(HTML)
│   ├── config.py          # 配置文件
│   └── extensions.py      # 扩展初始化
│
├── migrations/            # 数据库迁移文件
│
├── tests/                 # 测试代码
│   └── ...                # 测试用例
│
├── .env                   # 环境变量配置
├── .gitignore             # Git 忽略文件
├── requirements.txt       # 项目依赖
├── run.py                 # 启动脚本
└── README.md              # 项目说明文件

1.5. 前端实现

1.5.1 介绍

        前端使用Vue 进行数据的交互和响应,可根据需求扩展功能,比如添加更多的 API、使用 Vuex 管理状态、添加路由等。通过前后端分离的方式,能够提高应用的可维护性和扩展性。

my-project/
│
├── backend/                # Flask 后端代码
│   ├── app.py              # Flask 主应用文件
│   ├── requirements.txt     # 后端依赖
│   └── ...                 # 其他后端文件
│
├── frontend/               # Vue 前端代码
│   ├── src/
│   │   ├── components/     # Vue 组件
│   │   ├── views/          # 页面视图
│   │   ├── router/         # 路由配置
│   │   ├── store/          # Vuex 状态管理
│   │   ├── App.vue         # 根组件
│   │   └── main.js         # 入口文件
│   ├── public/
│   └── package.json        # 前端依赖
│
└── README.md               # 项目说明文件

1.6. 页面展示

1.6.1. 地图展示

地图展示主要通过地图向下钻取,选择城市来联动哥哥城市的指标统计数据。

1.6.1.1 省级地图

点击省级区域钻取该省的各个市

 1.6.1.2 县级地图

点击市级区域向下钻取到县级

1.6.2. 全国分布

选择不同哥哥空气空气质量指标来展示各个城市的空气质量。

全国分布

1.6.3. 区域分布

1.6.4. 城市比较

选择不同的城市、指标、月份来比较这两个城市之间的空气质量。

1.6.5. 统计排名

选择城市和月份展示该月份的城市排名和省会排名

1.6.6 历史数据

选择城市展示每个城市的历史数据并且可以按需下载。

1.6.7 模型预测

选择城市预测该城市的AQI

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

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

相关文章

项目生命周期的类型

‌项目生命周期的类型包括预测型生命周期、迭代型生命周期、增量型生命周期、适应型生命周期和混合型生命周期。 预测型生命周期(或称为瀑布型生命周期) 从名称中我们就可以看出,我们对行业和项目是非常了解的,可以预测到下一步…

Laravel邮件发送:从配置到发邮件的指南!

Laravel邮件发送功能如何实现?怎么使用Laravel发信? Laravel作为一款流行的PHP框架,提供了强大且易用的邮件发送功能。AokSend将详细介绍如何从配置到实际发送邮件的全过程,帮助你快速掌握Laravel邮件发送的技巧。 Laravel邮件发…

解决CodeBlocks中的界面wxSmith界面无法打开问题?

在CodeBlocks中,wxSmith如果想要保存已经编辑好的UI界面,你需要勾选生成xrc文件才行。 譬如我这里就有好几个wxSmith的界面,由于没有生成xrc文件,导致关闭项目后,再次打开wxs界面,无法正常导入了&#xff0…

QT开发:事件循环与处理机制的概念和流程概括性总结

事件循环与处理机制的概念和流程 Qt 事件循环和事件处理机制是 Qt 框架的核心,负责管理和分发各种事件(用户交互、定时器事件、网络事件等)。以下是详细透彻的概念解释和流程讲解。 1. 事件循环(Event Loop)的概念 …

AI+教育|拥抱AI智能科技,让课堂更生动高效

AI在教育领域的应用正逐渐成为现实,提供互动性强的学习体验,正在改变传统教育模式。AI不仅改变了传统的教学模式,还为教育提供了更多的可能性和解决方案。从个性化学习体验到自动化管理任务,AI正在全方位提升教育质量和效率。随着…

观察者模式全攻略:从设计原理到 SpringBoot 实践案例

🎯 设计模式专栏,持续更新中~~ 欢迎订阅:JAVA实现设计模式 🛠️ 希望小伙伴们一键三连,有问题私信都会回复,或者在评论区直接发言 观察者模式 观察者模式(Observer Pattern)是一种行…

web学习——VUE

VUE&Element 今日目标: 能够使用VUE中常用指令和插值表达式能够使用VUE生命周期函数 mounted能够进行简单的 Element 页面修改能够完成查询所有功能能够完成添加功能 1,VUE 1.1 概述 接下来我们学习一款前端的框架,就是 VUE。 Vue 是…

JAVA并发编程系列(8)CountDownLatch核心原理

拼多多 D2面试,现场编程模拟拼团,10人拼团成功。限时2分钟!开始吧.....!在面试过程经常有算法题、模拟现实案例、经典功能设计、核心原理分析这种。这些看似简单,实际需要候选人有非常扎实的基础,才能应付这…

maxwell 输出消息到 kafka

文章目录 1、kafka-producer2、运行一个Docker容器,该容器内运行的是Zendesk的Maxwell工具,一个用于实时捕获MySQL数据库变更并将其发布到Kafka或其他消息系统的应用3、进入kafka容器内部4、tingshu_album 数据库中 新增数据5、tingshu_album 数据库中 更…

【Django5】django的helloworld

安装django pip install djangoDjango官方中文文档 https://docs.djangoproject.com/zh-hans/5.1/Github链接 https://github.com/django/django创建Django项目 cd到想要创建项目的文件夹下,输入以下命令创建项目 这行代码将会在当前目录下创建一个 mysite 目录 …

Seeing What You Said Talking Face Generation Guided论文随记

Seeing What You Said Talking Face Generation Guided by a Lip Reading Expert 文章认为以往工作很少关注唇语清晰度,希望通过惩罚不准确结果来提升唇部区域动作的可理解性。 原文链接:https://openaccess.thecvf.com/content/CVPR2023/papers/Wang_…

【吊打面试官系列-MySQL面试题】LIKE 声明中的%和_是什么意思?

大家好,我是锋哥。今天分享关于【LIKE 声明中的%和_是什么意思?】面试题,希望对大家有帮助; LIKE 声明中的%和_是什么意思? %对应于 0 个或更多字符,_只是 LIKE 语句中的…

PSINS工具箱函数介绍——myfig

文章目录 关于工具箱使用方法与主要作用例程实践运行代码函数解析关于工具箱 myfig是关于绘图的函数,位置在: p s i n s / b a s e / p l o t psins/\ base/\ plot

深入理解 Linux 内核网络协议栈

Linux 作为全球广泛应用的操作系统,凭借其稳定、高效和开源的特点,已成为服务器、嵌入式系统和个人电脑等领域的首选系统。而在 Linux 系统的核心中,网络协议栈承担了网络数据通信的关键任务。理解 Linux 内核网络协议栈的工作原理&#xff0…

加密与安全_三种常见的注入攻击

文章目录 概述注入攻击类型及危害注入攻击的工作原理SQL注入代码注入XSS(跨站脚本) SQL注入SQ L注入攻击的本质常见误区及注入点误区1:SQL注入仅发生在GET请求中误区2:没有返回数据的接口不易受注入影响误区3:SQL注入的…

SpringSecurity原理解析(八):CSRF防御解析

一、CsrfFilter CsrfFilter 主要功能是用来防止csrf攻击 一、什么是CSRF攻击 跨站请求伪造(英语:Cross-site request forgery),也被称为 one-click attack 或者 session riding,通常缩写为 CSRF 或者 XSRF&#xff0c…

关于广告投放平台的设计

文章目录 广告投放平台的作用广告平台的核心功能 最近在看关于广告投放平台相关的设计,倒是没看到完整的案例介绍。整理一下收集的各种信息,假如需要设计一个广告投放系统,该怎么做? 广告投放平台的作用 要体现广告投放平台的作用…

如何实现LLM的通用function-calling能力?

众所周知,LLM的函数function-calling能力很强悍,解决了大模型与实际业务系统的交互问题。其本质就是函数调用。 从openai官网摘图: 简而言之: LLM起到决策的作用,告知业务系统应该调用什么函数,以及入参是…

动物识别系统Python+卷积神经网络算法+TensorFlow+人工智能+图像识别+计算机毕业设计项目

一、介绍 动物识别系统。本项目以Python作为主要编程语言,并基于TensorFlow搭建ResNet50卷积神经网络算法模型,通过收集4种常见的动物图像数据集(猫、狗、鸡、马)然后进行模型训练,得到一个识别精度较高的模型文件&am…

Android ImageView支持每个角的不同半径

Android ImageView支持每个角的不同半径 import android.annotation.SuppressLint; import android.content.Context; import android.content.res.ColorStateList; import android.content.res.Resources; import android.content.res.Resources.NotFoundException; import an…