Flask+echarts爬取天气预报数据并实现可视化

1、结果展示

折线图
数据集
柱状图

2、爬取所在地未来七天的天气数据

右键新建一个crawl.py文件,代码如下,将爬取到的数据存储到tianqi.txt文件中,

from selenium.webdriver import Chrome
from selenium.webdriver.chrome.options import Options
from selenium.webdriver import ChromeOptions
from time import sleep
from lxml import etree

# 实现无可视化界面
chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')
# 实现规避检测
option = ChromeOptions()
option.add_experimental_option('excludeSwitches', ['enable-automation'])

# 新建一个谷歌浏览器
bro = Chrome(chrome_options=chrome_options, options=option)

# 浏览器最大化
bro.maximize_window()
# 模拟浏览器发送请求
bro.get('https://tianqi.2345.com/')
sleep(1)
# 获取当前界面的源码数据
page_text = bro.page_source
# 数据解析
tree = etree.HTML(page_text)
temp_list = tree.xpath('//div[@id="J_bannerList"]/div')
fp = open('./tianqi.txt','a',encoding='utf-8')
# print(temp_list)
# 将数据写入带本地的tianqi.txt文件中
for temp in temp_list[1:]:
    date = temp.xpath('./div[1]/text()')[0]
    temp_scope = temp.xpath('./div[5]/text()')[0]
    # 去空格
    date = date.strip()
    temp_scope = temp_scope.strip()
    temp_list = temp_scope.split('~')
    highest = temp_list[1][:-1]
    lowest = temp_list[0]
    fp.write(date + " " + lowest + " " + highest + '\n')

fp.close()
sleep(1)
bro.quit()


3、Flask动态传递数据到index.html

右键新建一个flask01.py的文件,对爬取到的数据进行读取,并转换为列表类型,传递给index.html页面,echarts的图表样例负责接收并渲染,代码如下,

from flask import Flask, render_template, jsonify
import pandas as pd
import numpy as np
app = Flask(__name__)

data = pd.read_csv('tianqi.txt', header=None, sep=" ")
# 读取每列的数据
data_1 = data.iloc[:, 0]
data_2 = data.iloc[:, 1]
data_3 = data.iloc[:, 2]
# 将每列的数据转换为列表
array1 = np.array(data_1).tolist()
array2 = np.array(data_2).tolist()
array3 = np.array(data_3).tolist()
# print(array1)
# print(array2)
# print(array3)

# 起始页,也是数据展示页
@app.route('/')
def index():
    return render_template('index.html')


# echarts 名字可以改为任意,但一定要与HTML文件中一致
@app.route('/echarts', methods=["GET"])
def echarts():
    return jsonify(date_time=array1, lowest=array2, highest=array3)


if __name__ == '__main__':
    app.run()

4、页面渲染

在根目录下,新建一个名为templates目录,该目录名为默认的页面存储路径,不可拼错和随意修改,是固定的,然后右键创建一个index.html的文件,代码如下,

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>首页</title>
</head>
<body>
    <!--<script src="../package/dist/echarts.min.js"></script>-->
    <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.4/jquery.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/echarts/5.4.2/echarts.min.js" integrity="sha512-VdqgeoWrVJcsDXFlQEKqE5MyhaIgB9yXUVaiUa8DR2J4Lr1uWcFm+ZH/YnzV5WqgKf4GPyHQ64vVLgzqGIchyw==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
    <div id="main" style="height: 600px;width: auto;"></div>
</body>

<script type="text/javascript">
    const main = echarts.init(document.getElementById('main'))

    const option = ({
  title: {
    text: '未来七天的天气变化'
  },
  tooltip: {
    trigger: 'axis'
  },
  legend: {},
  toolbox: {
    show: true,
    feature: {
      dataZoom: {
        yAxisIndex: 'none'
      },
      dataView: { readOnly: false },
      magicType: { type: ['line', 'bar'] },
      restore: {},
      saveAsImage: {}
    }
  },
  xAxis: {
    type: 'category',
    boundaryGap: false,
    data: []
  },
  yAxis: {
    type: 'value',
    axisLabel: {
      formatter: '{value} °C'
    }
  },
  series: [
    {
      name: '最高温度',
      type: 'line',
      data: [],
      markPoint: {
        data: [
          { type: 'max', name: 'Max' },
          { type: 'min', name: 'Min' }
        ]
      },
      markLine: {
        data: [{ type: 'average', name: 'Avg' }]
      }
    },
    {
      name: '最低温度',
      type: 'line',
      data: [],
      markPoint: {
        data: [{ name: '周最低', value: -2, xAxis: 1, yAxis: -1.5 }]
      },
      markLine: {
        data: [
          { type: 'average', name: 'Avg' },
          [
            {
              symbol: 'none',
              x: '100%',
              yAxis: 'max'
            },
            {
              symbol: 'circle',
              label: {
                position: 'start',
                formatter: 'Max'
              },
              type: 'max',
              name: '最高点'
            }
          ]
        ]
      }
    }
  ]
})
    // 异步加载数据
$.get('/echarts').done(function (data) {
    // 填入数据
    main.setOption({
        xAxis: {
    type: 'category',
    boundaryGap: false,
    data: data.date_time
  },
        series: [{
            // 根据名字对应到相应的系列
            name: '最高温度',
            data: data.highest      //flask传递过来的数据data
        },
        {
            // 根据名字对应到相应的系列
            name: '最低温度',
            data: data.lowest      //flask传递过来的数据data
        }],

    });
});

    main.setOption(option)

</script>
</html>

5、运行展示

切换到flask01.py文件下,右键运行,然后将http://127.0.0.1:5000复制到浏览器即可看到结果展示页面

6、源码链接

点这里获取源码

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
一、任务背景 音乐是人类文化的重要组成部分,也是人类生活中不可或缺的一部分。随着互联网技术的发展,音乐成为了网络娱乐的主流之一,各种音乐平台层出不穷。而这些音乐平台有着海量的音乐数据,对这些数据进行分析和可视化可以更好地了解音乐市场和用户需求,对推动音乐产业的发展有着重要的意义。 二、任务描述 本任务要求利用FlaskEcharts构建一个音乐数据爬取可视化分析系统。系统需要具备以下功能: 1. 数据爬取功能:系统需从某一音乐平台上获取相应的音乐数据,包括歌曲名称、歌手、专辑、时长、播放量、评论数等信息,并存储在数据库中。 2. 数据可视化功能:系统需将爬取数据进行可视化展示,包括但不限于以下几种类型的图表: (1)歌曲排行榜:展示最受欢迎的歌曲排行榜。 (2)歌手排行榜:展示最受欢迎的歌手排行榜。 (3)专辑排行榜:展示最受欢迎的专辑排行榜。 (4)歌曲播放量分布图:展示歌曲播放量的分布情况。 (5)歌曲评论数分布图:展示歌曲评论数的分布情况。 3. 用户管理功能:系统需要实现用户的注册、登录、注销等功能,只有登录用户才能进行数据爬取和查看数据分析结果。 4. 数据查询功能:系统需提供用户进行数据查询的功能,包括但不限于以下几个方面: (1)搜索功能:用户可以根据歌曲名称、歌手、专辑等关键词进行搜索。 (2)筛选功能:用户可以根据不同的维度,如歌曲播放量、评论数等进行筛选。 5. 数据导出功能:用户可以将数据以Excel或CSV的格式导出。 6. 界面友好:系统需具有良好的界面设计,界面美观、易用。 7. 安全性:系统需具有较高的安全性,包括但不限于用户数据的保护、爬取数据的合法性等方面。 三、任务要求 1. 技术选型:使用Flask作为后台框架,使用Echarts进行数据可视化展示。 2. 数据库:使用MySQL作为数据库。 3. 界面设计:界面设计要求美观、易用,需要考虑不同用户的使用习惯和需求。 4. 安全性:系统需具有较高的安全性,包括但不限于用户数据的保护、爬取数据的合法性等方面。 5. 兼容性:系统需兼容主流浏览器,如Chrome、Firefox、IE等。 6. 文档编写:需编写系统的详细设计文档和用户使用手册。 7. 时间要求:本项目为期2个月,需按时完成。 四、验收标准 1. 系统功能完备,能够实现上述要求中的所有功能。 2. 界面美观、易用,符合用户习惯和需求。 3. 系统具有较高的安全性。 4. 系统稳定性良好,能够支持多用户同时访问。 5. 系统文档齐全,包括详细设计文档和用户使用手册。 6. 项目按时完成。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Double Handsome

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值