1、项目介绍

技术栈
采用 Python 语言开发,基于 Flask 轻量级框架搭建 Web 应用程序,使用 MySQL 数据库进行数据存储,通过 requests 爬虫框架从中国天气网获取气象数据,前端利用 Echarts 技术实现数据可视化大屏展示。

功能模块
· 数据可视化分析大屏
· 后台数据控制台
· 数据管理
· 爬虫日志管理
· 注册登录
· 采集页面

项目介绍
本系统基于 Flask 框架构建气象数据可视化平台,通过 requests 库从中国天气网采集各城市气象数据,经 Pandas 库处理分析后存入 MySQL 数据库。系统采用 MVC 架构模式,将数据层、控制层和视图层分离。前端利用 Echarts 技术对温度、风速、风向、空气质量、风力等气象指标进行可视化渲染,展示北京温度与风速变化趋势、全国风向分布饼图、空气质量分布柱状图等。后台提供数据管理、爬虫日志管理、控制台运维等功能,支持管理员启动爬虫、监控数据及编辑气象信息。

2、项目界面

(1)数据可视化分析大屏
该页面是气象数据可视化大屏,展示北京温度与风速变化趋势、全国风向分布饼图、全国气象实时情况列表、全国空气质量分布柱状图以及全国风力分布柱状图,直观呈现多维度气象数据。

在这里插入图片描述

(2)后台数据控制台
该页面是气象数据可视化大屏的管理员后台首页,展示管理员欢迎信息与当前时间,提供启动爬虫、数据监控的快捷操作入口,同时呈现系统运行的相关环境信息,方便管理员进行系统运维与数据采集操作。

在这里插入图片描述

(3)数据管理
该页面是气象数据可视化大屏的后台天气数据管理界面,支持按地区检索空气数据,以表格形式展示各城市的温度、风向、风力、湿度、天气、AQI等气象信息,提供分页查看与数据编辑操作功能。

在这里插入图片描述

(4)爬虫日志管理
该页面是气象数据可视化大屏的爬虫日志管理界面,支持按日志内容检索爬虫运行记录,提供启动爬虫的操作入口,以表格形式展示每一次爬虫任务的编号、日志详情和执行时间,方便管理员追溯爬虫运行状态与结果。

在这里插入图片描述

(5)注册登录
该页面是气象数据可视化大屏的后台登录界面,集成了账号密码输入、自动登录选择、登录操作等功能模块,支持管理员通过身份验证登录系统,同时界面背景展示了全球气象数据网络可视化布局,整合了登录交互与气象数据展示双重功能。
在这里插入图片描述

(6)采集页面
该页面是基于Flask的全国气象数据采集及可视化系统的代码开发界面,展示了用户登录验证、后台页面路由跳转的核心代码逻辑,控制台同步输出数据库查询语句,实现用户权限校验与后台页面访问控制的功能。

在这里插入图片描述

3、项目说明

一、技术栈简要说明

本系统采用 Python 语言开发,基于 Flask 轻量级框架搭建 Web 应用程序,使用 MySQL 数据库进行数据存储,通过 requests 爬虫框架从中国天气网获取气象数据,前端利用 Echarts 技术实现数据可视化大屏展示,系统架构采用 MVC 模式将数据层、控制层和视图层分离。

二、功能模块详细介绍

· 数据可视化分析大屏
该页面是气象数据可视化大屏的核心展示区域,展示北京温度与风速变化趋势折线图、全国风向分布饼图、全国气象实时情况列表、全国空气质量分布柱状图以及全国风力分布柱状图。通过多种图表形式的组合,直观呈现多维度气象数据,帮助用户快速理解全国气象分布特征与变化规律。

· 后台数据控制台
该页面是管理员后台首页,展示管理员欢迎信息与当前时间,提供启动爬虫、数据监控的快捷操作入口,同时呈现系统运行的相关环境信息,包括服务器状态、数据库连接情况等。方便管理员进行系统运维与数据采集操作,提升管理效率。

· 数据管理
该页面是后台天气数据管理界面,支持按地区检索空气数据,以表格形式展示各城市的温度、风向、风力、湿度、天气、AQI 等气象信息。提供分页查看功能,用户可逐页浏览大量数据,同时支持数据编辑操作,可对气象信息进行修改和更新,确保数据的准确性和时效性。

· 爬虫日志管理
该页面是爬虫日志管理界面,支持按日志内容检索爬虫运行记录,提供启动爬虫的操作入口。以表格形式展示每一次爬虫任务的编号、日志详情和执行时间,方便管理员追溯爬虫运行状态与结果,及时发现和解决爬虫采集过程中的问题。

· 注册登录
该页面是后台登录界面,集成了账号密码输入、自动登录选择、登录操作等功能模块,支持管理员通过身份验证登录系统。界面背景展示了全球气象数据网络可视化布局,整合了登录交互与气象数据展示双重功能,保障系统操作的权限安全。

· 采集页面
该页面是系统的代码开发界面,展示了用户登录验证、后台页面路由跳转的核心代码逻辑,包括 Flask 路由配置、视图函数实现、用户权限校验等关键代码。控制台同步输出数据库查询语句,实现用户权限校验与后台页面访问控制的功能,方便开发者调试和维护系统。

三、项目总结

本系统基于 Flask 框架构建气象数据可视化平台,通过 requests 库从中国天气网采集各城市气象数据,经 Pandas 库处理分析后存入 MySQL 数据库。系统采用 MVC 架构模式,将数据层、控制层和视图层分离,使得系统易于维护和扩展。前端利用 Echarts 技术对温度、风速、风向、空气质量、风力等气象指标进行可视化渲染,展示北京温度与风速变化趋势、全国风向分布饼图、空气质量分布柱状图等。后台提供数据管理、爬虫日志管理、控制台运维等功能,支持管理员启动爬虫、监控数据及编辑气象信息。整体实现了气象数据的自动化采集、存储、管理与可视化展示,为用户理解和分析气象数据提供了高效便捷的工具。

4、核心代码


import json
import requests
import xlwt
import datetime
import os
import time
from utils import dbUtil


class GetWeather:
    def __init__(self):
        self.baseUrl = r"http://d1.weather.com.cn/sk_2d/"
        self.headers = {}
        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

        current_path = os.path.dirname(__file__)
        with open(current_path + "/CITY.txt", 'r', encoding='UTF-8') as load_f:
            loadList = json.load(load_f)  # 34个省份
            for i in range(0, 4):
                self.cityList.append(loadList[i])
            for i in range(4, 34):
                for j in loadList[i]['cityList']:
                    self.cityList.append(j)
            for i in self.cityList:
                if 'districtList' in i.keys():
                    self.cityDict.setdefault(i['cityName'], i['cityId'] + "01")  # 省
                else:
                    self.cityDict.setdefault(i['provinceName'], i['id'] + "0100")  # 直辖市
        print(len(self.cityDict))

    def __getWeatherInfo__(self):
        db = dbUtil()
        count = 0
        for city, id in self.cityDict.items():
            try:
                self.totalGet = self.totalGet + 1
                self.sheet.write(self.cityRow, 0, city)  # 写当前城市名
                PageUrl = self.baseUrl + id + ".html?_" + str(int(time.time() * 1000))
                response = requests.get(PageUrl, headers=self.headers, allow_redirects=False)
                response.encoding = "utf-8"
                self.htmlResult = response.text
                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)
            except Exception as e:
                print(e)
                continue
        t = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
        sql = "insert into slog VALUES (NULL, \"【爬虫启动】爬取数据全国天气数据运行成功,获取数据:" + str(count) + "条\",\"" + t + "\")"
        db.query_noargs(sql)
        db.close_commit()

    def __main__(self):
        print(datetime.datetime.now())
        self.__getWeatherInfo__()
        print(datetime.datetime.now())


# 后台调用爬虫
def online():
    weather = GetWeather()
    weather.__main__()
    return 200

5、项目列表

在这里插入图片描述

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

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐