TOC
前言
通过Flask搭建web/Echarts可视化大屏,并定时获取数据。
参考视频:here
参考效果:here
项目介绍
基于Python+Flask+Echarts的Epidemic监控系统,主要技术路线如下:
- Python爬虫 
- Python操作MySql数据库 
- 使用Flask构建web项目 
- 基于Echarts的数据可视化展示 
- 在Linux上部署web项目以及定时获取数据 
- nCov数据可视化大屏流程: 

- 项目结构安排: - 1 
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56- ├── app.py #Flask启动文件
 ├── chromedriver_win32 #chrome浏览器驱动
 │ └── chromedriver.exe
 ├── db.py #数据库连接配置
 ├── log #存放爬虫日志
 │ └── log_his
 ├── __pycache__
 │ ├── app.cpython-36.pyc
 │ ├── db.cpython-36.pyc
 │ └── utils.cpython-36.pyc
 ├── requirements.txt #收集到的依赖包
 ├── sh #shell脚本用于快速启动爬虫
 │ ├── start_by_gunicorn.sh
 │ ├── up_det.sh
 │ ├── up_his.sh
 │ └── up_hot.sh
 ├── spider.py #爬虫文件
 ├── sqlfile #相应的数据库脚本文件
 │ ├── 000-details.sql
 │ ├── 001-history.sql
 │ ├── 002-hotsearch.sql
 │ ├── 003-word.sql
 │ ├── cov.sql
 │ └── getCityTop5.sql
 ├── static #静态资源
 │ ├── css
 │ │ └── main.css
 │ │ └── word.css
 │ ├── image
 │ │ ├── bgg.png
 │ │ ├── footer.png
 │ │ ├── icon.jpg
 │ │ └── header.png
 │ └── js
 │ ├── api
 │ │ └── Tencent_api.js
 │ ├── china.js
 │ ├── controller.js
 │ ├── ec_center.js
 │ ├── echarts.min.js
 │ ├── ec_left1.js
 │ ├── ec_left2.js
 │ ├── ec_right1.js
 │ ├── ec_right2.js
 │ ├── jquery.js
 │ ├── word
 │ │ ├── controller_w.js
 │ │ ├── ecc_world.js
 │ │ ├── ec_world.js
 │ │ ├── vintage.js
 │ │ └── world.js
 │ └── worldcloud.js
 ├── templates
 │ ├── word.html
 │ └── index.html # 主页面
 └── utils.py #工具脚本,获取MySQL数据
数据获取
- 数据获取可以从各地区卫健委获取,也可通过腾讯、百度、天行数据的免费接口或网易实时数据接口。 
- 本文采用腾讯数据和百度的热搜数据进行存储 - 1 
 2- self.url1 = "https://view.inews.qq.com/g2/getOnsInfo?name=disease_h5" #实时数据
 self.url2 = "https://view.inews.qq.com/g2/getOnsInfo?name=disease_other" #历史数据- 1 - self.url = "https://voice.baidu.com/act/virussearch/virussearch?from=osari_map&tab=0&infomore=1" #百度热搜数据页面- 1 
 2- self.url3 = "https://api.inews.qq.com/newsqa/v1/automation/foreign/country/ranklist" #腾讯国外数据接口,实时。国家:182
 self.url4 = "https://voice.baidu.com/newpneumonia/get?target=trend&isCaseIn=1&stage=publish" #百度国外数据接口,至前一日。国家:207
- 思路:分别在spider.py中创建:Word_data、Tencent_Data 和 Badidu_Hot 类用于操作爬取数据,并将爬取到的数据预处理后存入MySQL数据库。 
- 数据存储:创建details、history、hotsearch、word表,用于存储爬取到的数据 - 1 
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13- create table details
 (
 id int auto_increment comment '主键自增长'
 primary key,
 update_time datetime null comment '更新时间',
 province varchar(50) null comment '省份',
 city varchar(50) null comment '城市',
 confirm int null comment '累计确诊',
 confirm_add int null comment '新增确诊',
 heal int null comment '治愈',
 dead int null comment '死亡'
 )
 comment '详细数据';- 1 
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17- create table history
 (
 ds datetime not null comment '日期'
 primary key,
 confirm int null comment '累积确诊',
 confirm_add int null comment '新增确诊',
 suspect int null comment '疑似',
 suspect_add int null comment '新增疑似',
 heal int null comment '治愈',
 heal_add int null comment '新增治愈',
 dead int null comment '死亡',
 dead_add int null comment '新增死亡',
 importedCase int null comment '累计境外输入',
 importedCase_add int null comment '新增境外输入'
 )
 comment '历史数据记录';- 1 
 2
 3
 4
 5
 6
 7
 8- create table hotsearch
 (
 id int auto_increment,
 dt datetime not null comment '时间',
 content varchar(255) null comment '内容',
 primary key (id, dt)
 )
 comment '百度热搜数据';- 1 
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12- create table word
 (
 id int auto_increment
 primary key,
 name varchar(50) null,
 update_time datetime null,
 confirm_add int null comment '新增确诊',
 confirm int null comment '累计确诊',
 heal int null comment '治愈',
 dead int null comment '死亡'
 )
 comment '世界数据';
Web程序开发:可视化展示
- 通过Flask、h5和Echarts进行可视化的开发,前端页面数据获取通过Ajax进行请求,并通过js给Echarts组件赋值展示。 
- 主界面:index.html - 1 
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72- <!DOCTYPE html>
 <html>
 <head>
 <meta charset="utf-8">
 <title>ncov</title>
 <script src="../static/js/jquery.js"></script>
 <script src="../static/js/echarts.min.js"></script>
 <script src="../static/js/china.js"></script>
 <script src="../static/js/worldcloud.js"></script>
 <link href="../static/css/main.css" rel="stylesheet" />
 </head>
 <body>
 <div id="gyroContain">
 <div id="header">
 <div id="data"><!--其他信息-->
 <a href="#">CSDN</a>
  | 
 <a href="#">世界Epidemic实时追踪</a>
 <br>
 数据来源 : 腾讯 & 百度
 </div>
 <div id="title">
 <span>全国Epidemic实时跟踪</span>
 </div>
 <div id="time"></div>
 </div>
 <div id="footer"><!--页面低端--></div>
 <div id="l1">我是左1</div>
 <div id="l2">我是左2</div>
 <div id="c1">
 <div class="num" id="num1">
 <h1></h1>
 </div>
 <div class="num" id="num2">
 <h1></h1>
 </div>
 <div class="num" id="num3">
 <h1></h1>
 </div>
 <div class="num" id="num4">
 <h1></h1>
 </div>
 <div class="txt">
 <h2>累积确诊</h2>
 </div>
 <div class="txt">
 <h2>剩余疑似</h2>
 </div>
 <div class="txt">
 <h2>累积治愈</h2>
 </div>
 <div class="txt">
 <h2>累积死亡</h2>
 </div>
 </div>
 <div id="c2">我是中2</div>
 <div id="r1">我是右1</div>
 <div id="r2">我是右2</div>
 </div>
 <script src="../static/js/ec_center.js"></script>
 <script src="../static/js/ec_left1.js"></script>
 <script src="../static/js/ec_left2.js"></script>
 <script src="../static/js/ec_right1.js"></script>
 <script src="../static/js/ec_right2.js"></script>
 <script src="../static/js/controller.js"></script>
 </body>
 </html>
- 效果展示:(若需要更好的界面,需通过css进行控制)  
- word.html - 1 
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33- <!DOCTYPE html>
 <html lang="en">
 <head>
 <meta charset="UTF-8">
 <title>nCov—word</title>
 <link rel="icon" href="../static/image/icon.jpg">
 <link href="../static/css/word.css" rel="stylesheet"/>
 <script src="../static/js/jquery.js"> </script>
 <script src="../static/js/echarts.min.js"> </script>
 <script src="../static/js/word/vintage.js"> </script>
 <script src="../static/js/word/world.js"> </script>
 <script src="../static/js/word/controller_w.js"> </script>
 </head>
 <body>
 <div id="gyroContain">
 <div id="area">
 <a href="http://aiiyx.cn" target="_blank">博客</a>
  | 
 <a href="/" target="_blank">中国Epidemic实时追踪</a>
 <br>
 数据来源:百度 & 腾讯
 </div>
 <div id="tit">
 <span>世界Epidemic实时追踪</span>
 </div>
 <div id="tim"> 标题</div>
 <div id="left"> left</div>
 <div id="right"> right</div>
 </div>
 <script src="../static/js/word/ecc_world.js"> </script>
 <script src="../static/js/word/ec_world.js"> </script>
 </body>
 </html>
- 效果展示:  
项目部署
项目部署需要一台Linux服务器,可选择Aliyun服务器或是使用Vmware 创建一台服务器均可。本文采用Vmware创建一台Ubuntu servers 18.4服务器。
1、安装Vmware的教程网上挺多的,自行百度。
2、安装Ubuntu servers 18.4推荐参考:Ubuntu 18.04 LTS Server服务器安装图文教程
3、安装conda、并创建虚拟环境推荐参考:
4、安装文件上载工具:
2
3安装命令:yum install lrzsz -y
使用命令:rz5、将项目上载至Ubuntu服务器
6、Ubuntu安装MySQL,并配置远程连接,创建项目所需数据库
开发者模式部署
开发者模式部署,是正式上线前的测试部署,可以调试项目是否正常。
1、安装项目依赖库
2、更改db.py中的数据库连接配置
3、运行spider.py进行一次爬虫获取数据
4、运行app.py运行项目
5、通过Windows浏览器访问web页面
生产模式部署
部署Flask应用时,通常使用WSGI的应用服务器搭配Nginx作为反向代理
常用的WSGI服务器:gunicorn、uwsgi
正向和反向代理:
安装nginx
静态服务器、动态服务、反向代理、负载均衡、缓存服务
- apt安装: - 1 - sudo apt install nginx
- 文件位置: - 1 
 2
 3
 4- /usr/sbin/nginx :主程序
 /etc/nginx :配置文件
 /usr/share/nginx :存放静态文件
 /var/log/nginx :存放日志
- nginx命令:here - 1 
 2
 3
 4
 5- service nginx start # 启动nginx
 service nginx reload # 重新加载nginx配置文件
 nginx -s reopen # 重启nginx
 nginx -s stop # 停止nginx
 nginx -v # 查看版本号
- 配置可参考:here - cd /etc/nginx/ ,备份nginx.conf,修改nginx.conf - 1 
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15- ## 此处开始为配置反向代理
 upstream mysvr {
 server 127.0.0.1:5000; ## 服务器地址1
 }
 # error_page 404 /404.html
 server {
 # keepalive_requests 120;
 listen 8080; ## nginx监听端口号
 server_name 192.168.121.139; #cn.nCov.com; ## nginx监听服务器名称(本机ip或域名)
 location / {
 proxy_pass http://mysvr;
 }
 }
 ## 设置反向代理结束 - 注: 查看有关nginx的所有目录列表,输入命令 - 1 - rpm -ql nginx- 可以查看有关nginx目录信息,但是注意 这种命令只能是在基于yun安装的方式才可以。 - 1、安装 Gunicorn: (python虚拟环境下) - 1 - pip install gunicorn- 2、启动 Gunicorn: - 1 - gunicorn -b 127.0.0.1:8080 -D app:app- 编写脚本执行 - 1 
 2
 3
 4- #! /bin/bash
 source /Anaconda/ls/envs/env_nCov/bin/activate env_nCov #env_nCov是conda创建的虚拟环境
 cd /home/klein/workspace/nCOV/
 gunicorn -b 127.0.0.1:5000 -D app:app- -w: 表示进程(worker) 
 -b: 表示绑定ip地址和端口号(bind)
 -D: 以守护进程的形式启动,后台启动- 例:gunicorn -w 2 -b 127.0.0.1:5000 运行文件名称:Flask程序实例名 - 查看后台进程:ps -ef | grep gunicorn - 查询:首先执行如下命令获取Gunicorn进程树: - pstree -ap|grep gunicorn - 关闭:首先执行如下命令获取Gunicorn进程树: - pstree -ap|grep gunicorn - 之后输入如下指令关闭进程: - kill -9 pid - 重启:输入如下指令重启进程: - kill -HUP pid - 3、启动 Nginx在Windows下测试 
定时获取数据
- Ubuntu安装chrome:here 
- ubuntu三行命令安装chrome浏览器 : https://yq.aliyun.com/articles/58040 
- Ubuntu安装google Driver:https://blog.csdn.net/blueheart20/article/details/81566903 
- CENTOS7下使用SELENIUM进行网页自动化访问:http://aiiyx.cn/wz/1605/ 
- 编写虫子脚本: - up_his.sh
 - 1 
 2
 3
 4
 5- #!/bin/bash
 source /Anaconda/ls/envs/env_nCov/bin/activate env_nCov #env_nCov是conda创建的虚拟环境
 python3 /home/klein/workspace/nCOV/spider.py up_his >> /home/klein/workspace/nCOV/log/log_his- up_hot.sh
 - 1 
 2
 3
 4- #!/bin/bash
 source /Anaconda/ls/envs/env_nCov/bin/activate env_nCov #env_nCov是conda创建的虚拟环境
 python3 /home/klein/workspace/nCOV/spider.py up_hot >> /home/klein/workspace/nCOV/log/log_hot- up_det.sh
 - 1 
 2
 3
 4- #!/bin/bash
 source /Anaconda/ls/envs/env_nCov/bin/activate env_nCov #env_nCov是conda创建的虚拟环境
 python3 /home/klein/workspace/nCOV/spider.py up_det >> /home/klein/workspace/nCOV/log/log_det- up_word.sh
 - 1 
 2
 3
 4
 5- #!/bin/bash
 source /Anaconda/ls/envs/env_nCov/bin/activate env_nCov #env_nCov是conda创建的虚拟环境
 python3 /home/klein/workspace/nCOV/spider.py up_word >> /home/klein/workspace/nCOV/log/log_word
- 使用crontab定时虫子任务: https://blog.csdn.net/m0_38109046/article/details/87918111 
- 输入:crontab -e - 1 
 2
 3
 4- 30 * * * * bash /home/klein/workspace/nCOV/sh/up_his.sh 2>&1 &
 3 */2 * * * bash /home/klein/workspace/nCOV/sh/up_hot.sh 2>&1 &
 */5 * * * * bash /home/klein/workspace/nCOV/sh/up_det.sh 2>&1 &
 * 1,5,9,13,17,21 * * * bash /home/klein/workspace/nCOV/sh/up_word.sh 2>&1 &

shell脚本激活conda虚拟环境
怎么用shell脚本激活conda虚拟环境?:
| 1 |  | 
从Linux服务器下载文件
- 下载文件1 sz file
- 上传文件
| 1 |  | 
