Python大作业——Python爬虫获取世界疫情信息系统 (统计可视化图表并存入mysql数据库)
目 录
1 项目目的与意义
1.1项目背景说明
1.2项目目的与意义
2 软件开发环境与技术说明
2.1软件开发环境
2.2软件开发技术描述
3 系统分析与设计
3.1项目需求分析说明
3.2系统设计方案
4 系统源代码
4.1系统源代码文件说明
4.2源代码
5 系统使用说明书
6 参考资料
7 附件说明
1 项目目的与意义
1.1项目背景说明
“武汉街道空无一人,但是每个窗户后面都有配合应对疫情的市民。中国展现了惊人的集体行动力与合作精神。”这是世界卫生组织总干事高级顾问布鲁斯·艾尔沃德2月下旬在结束对中国的实地考察后发出的感慨。
放眼全中国,怀有浓厚家国情怀的中国人不计其数。来自中国各地的4.2万余名医护人员快速驰援湖北与武汉,义无反顾地成为“最美逆行者”,有人甚至为此献出了生命。正是抱定共克时艰的意志,14亿中国人齐心响应国家号召,自觉居家隔离,为疫情防控尽自己的一份力。艾尔沃德在考察中国防疫工作后曾动情地说,“中国人民的坚韧和奉献,极大延缓了新冠肺炎疫情传播。”联合国秘书长古特雷斯认为,“中国人民为防控疫情作出的牺牲,是对人类极大的贡献。”
美国破百万、全球大流行, 可以确定地说,目前我们正在经历本世纪以来最严重的灾难,其波及范围,人员伤亡,后续影响及对全球经济形势的损害都将是自二战以来最惨烈的。
目前疫情正在全球肆虐,已波及209个国家,地球上己几无一片净土。截止4月11日,全球确诊人数已近两百万,死亡人数达十余万,而且还在以每天数万确诊,上千死亡的速度飞速增长。目前除中国疫情基本受控之外,欧美各国疫情均在发酵中,拐点还远远没有到来。以现在疫情最严重的美国为例,预计拐点最快也要到月底,以目前的发展速度,达到百万级别确诊和十万级别死亡将是大概率事件。
新冠肺炎疫情对全球经济影响巨大,据最新数据预测,2020年全球经济将萎缩3.0%,为1930年以来遭遇的最大经济危机。不容乐观的是,面对多国放松封锁措施,世界卫生组织警告,疫情尚未到峰值。
1.2项目目的与意义
该项目的研究可以让人们每日清晰地看到世界的疫情数据,时刻关注世界疫情状况在当下也具有重要意义。
据全球疫情实时监控网站统计,每天都有十几亿的访问量,这也看到了大家对于实时的数据重视
2 软件开发环境与技术说明
2.1 软件开发环境
该系统应用eclipse使用JavaScript语言建立可视化界面
Python软件进行数据的爬取
Python标准库和扩展库:pymysql、 requests、bs4
数据库环境:MySQL
2.2软件开发技术描述
界面设计:应用JavaScript对界面进行包装
Python爬取数据连接:
url= https://ncov.dxy.cn/ncovh5/view/pneumonia?from=timeline&isappinstalled=0\' # 请求地址 headers = {\'user-agent\': \'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36\'} # 创建头部信息 response = requests.get(url, headers=headers) # 发送网络请求 content = response.content.decode(\'utf-8\') soup = BeautifulSoup(content, \'html.parser\')
数据库连接:
Python连接MySQL数据库
db = pymysql.connect("localhost", "root", "0000", "yiqing", charset=\'utf8\') cursor = db.cursor()
JavaScript连接MySQL数据库
conn=DriverManager.getConnection("jdbc:mysql://localhost:8080/疫情统计图/world?useUnicode=true&characterEncoding=utf-8","root","");
数据连接:
String sql="select * from world_map where now_time like \'"+time+"%\' "; String sql="select * from world_map where now_time like \'"+time+"%\' ORDER BY deadCount desc "; String sql="select * from world_map where now_time like \'"+time+"%\' order by curedCount desc "; //等等,此处不过多列举
网络连接:
Web:
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0"> <display-name>疫情统计图</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> </web-app>
Python连接JavaScript:
sql_world = "INSERT INTO world_map values (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)"
正则字符串处理:
(.+?) (.*)
等等
3系统分析与设计
3.1项目需求分析说明
仿照约翰·霍普金斯大学制作全球疫情发布图(WEB版),可以实时访问。用例图如下:
3.2系统设计方案
数据库表:
Python爬取数据到数据库
框架设计图如下:
4 系统源代码
4.1系统源代码文件说明
文件 |
作用 |
Python文件 |
爬取世界疫情信息到Mysql |
dao包 |
对数据库进行操作 |
servlet包 |
函数代码 |
util包 |
连接数据库 |
entity包 |
定义类对象的set get方法和构造函数 |
src目录下所有文件 |
后台的java代码,支持界面所有操作 |
world.jsp |
实现界面 |
js和layui文件夹 |
调样式 |
css 和layui文件夹 |
美化界面 |
lib下所有文件 |
连接数据库操作需要引用的jar包 |
Xml文件 |
配置文件 |
chart下所有文件 |
用echart图表用来实现地图 |
|
|
4.2源代码
登录界面
1 package First; 2 3 4 import java.awt.*;//导入awt包 5 import javax.swing.*;//导入swing包 6 import java.awt.event.ActionListener;//导入awt包中的监听器事件包 7 import java.awt.event.ActionEvent;//导入awt包中的ActionEvent事件包 8 9 10 11 public class login extends JFrame { 12 13 14 public login() { 15 setSize(300,290);//设计窗体的大小 16 JLabel a=new JLabel("用户名"); //实例化JLabel对象 17 JLabel b=new JLabel("密 码"); 18 JTextField c=new JTextField(15);//实例化用户名文本框 19 JPasswordField d=new JPasswordField(15);//实例化密码框 20 d.setEchoChar(\'*\');//将输入密码框中的密码以*显示出来 21 JButton e=new JButton("确定"); 22 JButton f=new JButton("重置"); 23 JButton g=new JButton("注册"); 24 setVisible(true);//使窗体可视化 25 Container mk=getContentPane();//获取一个容器 26 // 将用户名、密码的Jlabel和用户名JTextField文本框、密码JPasswordField密码框以及确定JButton、重置JButton、注册JButton添加到container容器里面 // 27 mk.add(a); 28 mk.add(b); 29 mk.add(c); 30 mk.add(d); 31 mk.add(e); 32 mk.add(f); 33 mk.add(g); 34 setBounds(300,300,300,290);//设置窗体的长宽各为300、300 让其显示在左上方的300、300处 35 mk.setLayout(null); 36 // a、b、c、d、e、f、g显示在container容器中的位置坐标 37 a.setBounds(10,40,50,18); 38 b.setBounds(10,80,50,18); 39 c.setBounds(60,40,200,18); 40 d.setBounds(60,80,200,18); 41 e.setBounds(110,180,60,30); 42 f.setBounds(30,180,60,30); 43 g.setBounds(190,180,60,30); 44 45 f.addActionListener(new ActionListener() {//对重置按钮添加监听事件 46 47 @Override 48 public void actionPerformed(ActionEvent arg0) { 49 // TODO Auto-generated method stub 50 c.setText("");//对用户名文本框进行重置 51 d.setText("");//对密码文本框进行重置 52 } 53 54 }); 55 e.addActionListener(new ActionListener() {//对确定按钮添加监听事件 56 57 @SuppressWarnings("deprecation") 58 @Override 59 public void actionPerformed(ActionEvent arg0) { 60 // TODO Auto-generated method stub 61 62 if(c.getText().trim().equals("py")&&new String(d.getPassword()).equals("123456")) {//equals函数进行用户名和密码的匹配 63 JOptionPane.showMessageDialog(null,"登录成功"); 64 65 new world();//进入到world这个窗体中 66 } 67 else if(c.getText().trim().equals("zs")&&new String(d.getPassword()).equals("123")) {//equals函数进行用户名和密码的匹配 68 JOptionPane.showMessageDialog(null,"登录成功"); 69 70 new Add();//进入到world这个窗体中 71 } 72 else { 73 JOptionPane.showMessageDialog(null, "登录失败"); 74 } 75 } 76 77 }); 78 g.addActionListener(new ActionListener(){//对注册按钮添加监听事件 79 @SuppressWarnings("deprecation") 80 @Override 81 public void actionPerformed(ActionEvent arg0) { 82 // TODO Auto-generated method stub 83 new zhuce();//进入都到zhuce窗体中 84 } 85 86 }); 87 88 } 89 public static void main(String[] args) { 90 new main(); 91 92 93 } 94 95 96 }
login
注册界面
package First; import java.sql.*; import java.awt.*; import java.awt.event.*; import javax.swing.*; import com.mysql.jdbc.Driver; import First.login; public class zhuce extends login { private static final long serialVersionUID = -1928970409928880648L; JLabel jlnumber = new JLabel("用户名:"); JLabel jpassword = new JLabel("密码:"); JTextField jtnumber = new JTextField("",20); JTextField jtpassword = new JTextField("",20); JButton buttonadd = new JButton("注册"); JButton buttonreturn = new JButton("取消"); public zhuce() { JPanel jpnumber = new JPanel(); JPanel jtpassword = new JPanel(); JPanel jpforbutton = new JPanel(new GridLayout(1,1)); jpnumber.add(jlnumber); jpnumber.add(jtnumber); jtpassword.add(jtpassword); jtpassword.add(jtpassword); jpforbutton.add(buttonadd); jpforbutton.add(buttonreturn); buttonadd.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){ //Add Connection conn = null; Statement stat = null; PreparedStatement ps=null; String a1=jtnumber.getText(); String e2=jpassword.getText(); String sql = "INSERT INTO student(number,password) values(\'"+a1+"\',\'"+e2+"\')"; try{ Class.forName("com.mysql.jdbc.Driver"); System.out.println("JBDC 连接成功!"); }catch(Exception a){ System.out.println("JBDC 连接失败!"); a.printStackTrace(); } try{ conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/STU?useUnicode=true&characterEncoding=utf-8","root",""); //ps=conn.prepareStatement(sql); //ps.setString(1,jtnumber.getText()); //ps.setString(2,jtname.getText()); //ps.setString(3,jtsex.getText()); //ps.setString(4,jtbirthday.getText()); //ps.setString(5,jtdepartment.getText()); //ps.executeUpdate(); System.out.println("MySQL 连接成功!"); stat = conn.createStatement(); stat.executeUpdate(sql); System.out.println("插入数据成功!"); }catch (SQLException b){ b.printStackTrace(); }finally{ try{ conn.close(); System.out.println("MySQL 关闭成功"); }catch (SQLException c){ System.out.println("MySQL 关闭失败 "); c.printStackTrace(); } } }} ); buttonreturn.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){ login(); } }); this.setTitle("注册信息"); this.setLayout(new GridLayout(9,1)); this.add(jpnumber); this.add(jpassword); this.add(jpforbutton); this.setLocation(400,300); this.setSize(350,300); this.setVisible(true); } }
register
界面实现
jsp代码部分
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 <%@page import="java.util.Date"%> 4 <%@page import="java.text.SimpleDateFormat"%> 5 <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> 6 <!DOCTYPE html> 7 <html> 8 <head> 9 <meta charset="UTF-8"> 10 <title>Insert title here</title> 11 <script src="js/jquery-1.11.3.min.js"></script> 12 <script type="text/javascript" src="chart/echarts.min.js"></script> 13 <script type="text/javascript" 14 src="https://www.echartsjs.com/examples/vendors/echarts/map/js/world.js?_v_=1584687926098"></script> 15 </head> 16 <style> 17 #title { 18 background-color: black; 19 border: solid 1px; 20 font-family: "楷体"; 21 text-align: center; 22 font-color: white; 23 height: 80px; 24 width: 1200px; 25 float: left; 26 } 27 28 #time { 29 background-color: black; 30 border: solid 1px; 31 font-family: "楷体"; 32 text-align: center; 33 font-color: #333; 34 width: 250px; 35 height: 80px; 36 float: left; 37 } 38 39 #left { 40 background-color: black; 41 overflow-x: auto; 42 overflow-y: auto; 43 border: solid 1px; 44 font-family: "楷体"; 45 text-align: center; 46 font-color: #333; 47 width: 250px; 48 height: 800px; 49 float: left; 50 } 51 52 #right { 53 background-color: black; 54 border: solid 1px; 55 font-family: "楷体"; 56 text-align: center; 57 font-color: #333; 58 width: 350px; 59 height: 450px; 60 float: left; 61 } 62 63 #right1 { 64 background-color: black; 65 overflow-x: auto; 66 overflow-y: auto; 67 border: solid 1px; 68 font-family: "楷体"; 69 text-align: center; 70 font-color: #333; 71 width: 175px; 72 height: 450px; 73 float: left; 74 } 75 76 #right2 { 77 background-color: black; 78 overflow-x: auto; 79 overflow-y: auto; 80 border: solid 1px; 81 font-family: "楷体"; 82 text-align: center; 83 font-color: #333; 84 width: 170px; 85 height: 450px; 86 float: right; 87 } 88 89 #mid { 90 background-color: black; 91 border: solid 1px; 92 font-family: "楷体"; 93 text-align: center; 94 font-color: #333; 95 width: 850px; 96 height: 800px; 97 float: left; 98 } 99 100 #line { 101 background-color: #5c5c5c; 102 border: solid 1px; 103 width: 350px; 104 height: 350px; 105 float: left; 106 } 107 </style> 108 <body onload="onload()"> 109 <% 110 111 %> 112 <!-- 为ECharts准备一个具备大小(宽高)的Dom --> 113 <div id="title"> 114 <h2 style="color: white">全球疫情可视化展示</h2> 115 </div> 116 <div id="time"> 117 <h2 id="showtime" style="color: white">time</h2> 118 </div> 119 <div id="left"></div> 120 <div id="mid"></div> 121 <div id="right"> 122 <div id="right1">死亡人数</div> 123 <div id="right2">治愈人数</div> 124 </div> 125 <div id="line">柱状图</div> 126 <script type="text/javascript"> 127 128 function onload(){ 129 130 setInterval("document.getElementById(\'showtime\').innerHTML=new Date().toLocaleString();", 1000); 131 $.post( 132 "Getconfirmed", 133 function(data){ 134 var sum=0; 135 for(var i=0;i<data.length;i++) 136 sum+= parseInt(data[i].confirmedCount); 137 var htmltext="<h style=\'color: white;\'>全球确诊人数为:"+"<span style=\'color: red;font-size:50px\'>"+sum+"</span></h>"; 138 htmltext+="<table>" 139 for(var i=0;i<data.length;i++) 140 htmltext+="<tr><td>"+"<span style=\'color: white;\'>"+data[i].provinceName+"</span></td><td><span style=\'color: red;\'>"+data[i].confirmedCount+"</span></td></tr>"; 141 htmltext+="</table>"; 142 $("#left").html(htmltext); 143 144 }, 145 "json" 146 ); 147 $.post( 148 "GetDead", 149 function(data){ 150 var sum=0; 151 for(var i=0;i<data.length;i++) 152 sum+= parseInt(data[i].deadCount); 153 var htmltext="<h style=\'color: white;\'>全球死亡人数为:"+"<span style=\'color: red;font-size:50px\'>"+sum+"</span></h>"; 154 htmltext+="<table>" 155 for(var i=0;i<data.length;i++) 156 htmltext+="<tr><td>"+"<span style=\'color: white;\'>"+data[i].provinceName+"</span></td><td><span style=\'color: red;\'>"+data[i].deadCount+"</span></td></tr>"; 157 htmltext+="</table>"; 158 $("#right1").html(htmltext); 159 160 }, 161 "json" 162 ); 163 $.post( 164 "Getcured", 165 function(data){ 166 var sum=0; 167 for(var i=0;i<data.length;i++) 168 sum+= parseInt(data[i].curedCount); 169 var htmltext="<h style=\'color: white;\'>全球治愈人数为:"+"<span style=\'color: green;font-size:50px\'>"+sum+"</span></h>"; 170 htmltext+="<table>" 171 for(var i=0;i<data.length;i++) 172 htmltext+="<tr><td>"+"<span style=\'color: white;\'>"+data[i].provinceName+"</span></td><td><span style=\'color: green;\'>"+data[i].curedCount+"</span></td></tr>"; 173 htmltext+="</table>"; 174 $("#right2").html(htmltext); 175 176 }, 177 "json" 178 ); 179 //处理随日期变化的全球确诊人数图 180 var myChart1 = echarts.init(document.getElementById(\'line\')); 181 myChart1.setOption({ 182 title:{ 183 text:\'确诊人数变化\' 184 }, 185 186 tooltip:{}, 187 grid: { 188 left: \'4%\', 189 right: \'4%\', 190 bottom: \'3%\', 191 //是否显示刻度标签 192 containLabel: true 193 }, 194 legend:{ 195 data:[\'确诊数\'] 196 }, 197 xAxis:{ 198 data:[], 199 axisLabel:{ 200 //横坐标全部显示 201 interval:0, 202 //横坐标倾斜45度 203 rotate:-45, 204 }, 205 }, 206 yAxis:{}, 207 series:[{ 208 name:\'确诊数\', 209 type:\'line\', 210 data:[] 211 }] 212 }) 213 var cname=[]; 214 var value=[]; 215 //处理这段时间疫情总数变化趋势 216 $.ajax({ 217 url:"Dataconfirmed", 218 type:"POST", 219 dataType:"JSON", 220 async:true, 221 success:function(data){ 222 for(var i=0;i<data.length;i++) 223 { 224 cname[i]=data[i].provinceName; 225 value[i]=parseInt(data[i].confirmedCount); 226 } 227 myChart1.setOption({ 228 xAxis:{ 229 //放横坐标的数组 230 data:cname, 231 }, 232 series:[{ 233 name:\'确诊数\', 234 //每个横坐标对应的数值 235 data:value 236 }] 237 }); 238 } 239 }); 240 241 //处理世界疫情地图 242 $.ajax({ 243 url:"Allworld", 244 type:"POST", 245 dataType:"JSON", 246 async:true, 247 success:function(data){//表示处理成功之后做什么,后面跟一个匿名函数。回调函数,表示处理页面处理完数据以后执行这个函数。data表示处理页面返回的值,用形参接收。 248 var mydata = new Array(0); 249 250 for(var i=0;i<data.length;i++){ 251 var d = { 252 253 }; 254 d["name"] = data[i].provinceName;//.substring(0, 2); 255 d["value"] = data[i].confirmedCount; 256 d["Yisi_num"] = data[i].suspectedCount; 257 d["Cured_num"] = data[i].curedCount; 258 d["Dead_num"] = data[i].deadCount; 259 mydata.push(d); 260 } 261 //初始化echarts实例 262 var myChart = echarts.init(document.getElementById(\'mid\')); 263 // 指定图表的配置项和数据 264 var option = { 265 tooltip : { 266 trigger: \'item\', 267 formatter : function(params) { 268 return params.name + \'<br/>\' + \'确诊人数 : \' 269 + params.value + \'<br/>\' + \'死亡人数 : \' 270 + params[\'data\'].Dead_num + \'<br/>\' + \'治愈人数 : \' 271 + params[\'data\'].Cured_num + \'<br/>\'+ \'疑似患者人数 : \' 272 + params[\'data\'].Yisi_num; 273 }//数据格式化 274 }, 275 title: { 276 text: \'世界疫情图\', 277 left: \'center\' 278 }, 279 280 legend: { 281 orient: \'vertical\', 282 left: \'left\', 283 data: [\'世界疫情图\'] 284 }, 285 visualMap: { 286 type: \'piecewise\', 287 pieces: [ 288 { min: 70000, max: 50000000, label: \'确诊70000人以上\', color: \'red\' }, 289 { min: 10000, max: 69999, label: \'确诊10000-69999人\', color: \'blue\' }, 290 { min: 5000, max: 9999, label: \'确诊5000-9999人\', color: \'purple\' }, 291 { min: 1500, max: 4999, label: \'确诊1500-4999人\', color: \'yellow\' }, 292 { min: 500, max: 1499, label: \'确诊500-1499人\', color: \'gold\' }, 293 { min: 0, max: 499, label: \'确诊1-499人\', color: \'green\' }, 294 ], 295 color: [\'#E0022B\', \'#E09107\', \'#A3E00B\'] 296 }, 297 toolbox: { 298 show: true, 299 orient: \'vertical\', 300 left: \'right\', 301 top: \'center\', 302 feature: { 303 mark: { show: true }, 304 dataView: { show: true, readOnly: false }, 305 restore: { show: true }, 306 saveAsImage: { show: true } 307 } 308 }, 309 roamController: { 310 show: true, 311 left: \'right\', 312 mapTypeControl: { 313 \'world\': true 314 } 315 }, 316 series: [ 317 { 318 name: \'确诊数\', 319 type: \'map\', 320 mapType: \'world\', 321 322 nameMap : {"Canada": "加拿大", 323 "Turkmenistan": "土库曼斯坦", 324 "Saint Helena": "圣赫勒拿", 325 "Lao PDR": "老挝", 326 "Lithuania": "立陶宛", 327 "Cambodia": "柬埔寨", 328 "Ethiopia": "埃塞俄比亚", 329 "Faeroe Is.": "法罗群岛", 330 "Swaziland": "斯威士兰", 331 "Palestine": "巴勒斯坦", 332 "Belize": "伯利兹", 333 "Argentina": "阿根廷", 334 "Bolivia": "玻利维亚", 335 "Cameroon": "喀麦隆", 336 "Burkina Faso": "布基纳法索", 337 "Aland": "奥兰群岛", 338 "Bahrain": "巴林", 339 "Saudi Arabia": "沙特阿拉伯", 340 "Fr. Polynesia": "法属波利尼西亚", 341 "Cape Verde": "佛得角", 342 "W. Sahara": "西撒哈拉", 343 "Slovenia": "斯洛文尼亚", 344 "Guatemala": "危地马拉", 345 "Guinea": "几内亚", 346 "Dem. Rep. Congo": "刚果(金)", 347 "Germany": "德国", 348 "Spain": "西班牙", 349 "Liberia": "利比里亚", 350 "Netherlands": "荷兰", 351 "Jamaica": "牙买加", 352 "Solomon Is.": "所罗门群岛", 353 "Oman": "阿曼", 354 "Tanzania": "坦桑尼亚", 355 "Costa Rica": "哥斯达黎加", 356 "Isle of Man": "曼岛", 357 "Gabon": "加蓬", 358 "Niue": "纽埃", 359 "Bahamas": "巴哈马", 360 "New Zealand": "新西兰", 361 "Yemen": "也门", 362 "Jersey": "泽西岛", 363 "Pakistan": "巴基斯坦", 364 "Albania": "阿尔巴尼亚", 365 "Samoa": "萨摩亚", 366 "Czech Rep.": "捷克", 367 "United Arab Emirates": "阿拉伯联合酋长国", 368 "Guam": "关岛", 369 "India": "印度", 370 "Azerbaijan": "阿塞拜疆", 371 "N. Mariana Is.": "北马里亚纳群岛", 372 "Lesotho": "莱索托", 373 "Kenya": "肯尼亚", 374 "Belarus": "白俄罗斯", 375 "Tajikistan": "塔吉克斯坦", 376 "Turkey": "土耳其", 377 "Afghanistan": "阿富汗", 378 "Bangladesh": "孟加拉国", 379 "Mauritania": "毛里塔尼亚", 380 "Dem. Rep. Korea": "朝鲜", 381 "Saint Lucia": "圣卢西亚", 382 "Br. Indian Ocean Ter.": "英属印度洋领地", 383 "Mongolia": "蒙古", 384 "France": "法国", 385 "Cura?ao": "库拉索岛", 386 "S. Sudan": "南苏丹", 387 "Rwanda": "卢旺达", 388 "Slovakia": "斯洛伐克", 389 "Somalia": "索马里", 390 "Peru": "秘鲁", 391 "Vanuatu": "瓦努阿图", 392 "Norway": "挪威", 393 "Malawi": "马拉维", 394 "Benin": "贝宁", 395 "St. Vin. and Gren.": "圣文森特和格林纳丁斯", 396 "Korea": "韩国", 397 "Singapore": "新加坡", 398 "Montenegro": "黑山共和国", 399 "Cayman Is.": "开曼群岛", 400 "Togo": "多哥", 401 "China": "中国", 402 "Heard I. and McDonald Is.": "赫德岛和麦克唐纳群岛", 403 "Armenia": "亚美尼亚", 404 "Falkland Is.": "马尔维纳斯群岛(福克兰)", 405 "Ukraine": "乌克兰", 406 "Ghana": "加纳", 407 "Tonga": "汤加", 408 "Finland": "芬兰", 409 "Libya": "利比亚", 410 "Dominican Rep.": "多米尼加", 411 "Indonesia": "印度尼西亚", 412 "Mauritius": "毛里求斯", 413 "Eq. Guinea": "赤道几内亚", 414 "Sweden": "瑞典", 415 "Vietnam": "越南", 416 "Mali": "马里", 417 "Russia": "俄罗斯", 418 "Bulgaria": "保加利亚", 419 "United States": "美国", 420 "Romania": "罗马尼亚", 421 "Angola": "安哥拉", 422 "Chad": "乍得", 423 "South Africa": "南非", 424 "Fiji": "斐济", 425 "Liechtenstein": "列支敦士登", 426 "Malaysia": "马来西亚", 427 "Austria": "奥地利", 428 "Mozambique": "莫桑比克", 429 "Uganda": "乌干达", 430 "Japan": "日本", 431 "Niger": "尼日尔", 432 "Brazil": "巴西", 433 "Kuwait": "科威特", 434 "Panama": "巴拿马", 435 "Guyana": "圭亚那", 436 "Madagascar": "马达加斯加", 437 "Luxembourg": "卢森堡", 438 "American Samoa": "美属萨摩亚", 439 "Andorra": "安道尔", 440 "Ireland": "爱尔兰", 441 "Italy": "意大利", 442 "Nigeria": "尼日利亚", 443 "Turks and Caicos Is.": "特克斯和凯科斯群岛", 444 "Ecuador": "厄瓜多尔", 445 "U.S. Virgin Is.": "美属维尔京群岛", 446 "Brunei": "文莱", 447 "Australia": "澳大利亚", 448 "Iran": "伊朗", 449 "Algeria": "阿尔及利亚", 450 "El Salvador": "萨尔瓦多", 451 "C?te d\'Ivoire": "科特迪瓦", 452 "Chile": "智利", 453 "Puerto Rico": "波多黎各", 454 "Belgium": "比利时", 455 "Thailand": "泰国", 456 "Haiti": "海地", 457 "Iraq": "伊拉克", 458 "S?o Tomé and Principe": "圣多美和普林西比", 459 "Sierra Leone": "塞拉利昂", 460 "Georgia": "格鲁吉亚", 461 "Denmark": "丹麦", 462 "Philippines": "菲律宾", 463 "S. Geo. and S. Sandw. Is.": "南乔治亚岛和南桑威奇群岛", 464 "Moldova": "摩尔多瓦", 465 "Morocco": "摩洛哥", 466 "Namibia": "纳米比亚", 467 "Malta": "马耳他", 468 "Guinea-Bissau": "几内亚比绍", 469 "Kiribati": "基里巴斯", 470 "Switzerland": "瑞士", 471 "Grenada": "格林纳达", 472 "Seychelles": "塞舌尔", 473 "Portugal": "葡萄牙", 474 "Estonia": "爱沙尼亚", 475 "Uruguay": "乌拉圭", 476 "Antigua and Barb.": "安提瓜和巴布达", 477 "Lebanon": "黎巴嫩", 478 "Uzbekistan": "乌兹别克斯坦", 479 "Tunisia": "突尼斯", 480 "Djibouti": "吉布提", 481 "Greenland": "格陵兰", 482 "Timor-Leste": "东帝汶", 483 "Dominica": "多米尼克", 484 "Colombia": "哥伦比亚", 485 "Burundi": "布隆迪", 486 "Bosnia and Herz.": "波斯尼亚和黑塞哥维那", 487 "Cyprus": "塞浦路斯", 488 "Barbados": "巴巴多斯", 489 "Qatar": "卡塔尔", 490 "Palau": "帕劳", 491 "Bhutan": "不丹", 492 "Sudan": "苏丹", 493 "Nepal": "尼泊尔", 494 "Micronesia": "密克罗尼西亚", 495 "Bermuda": "百慕大", 496 "Suriname": "苏里南", 497 "Venezuela": "委内瑞拉", 498 "Israel": "以色列", 499 "St. Pierre and Miquelon": "圣皮埃尔和密克隆群岛", 500 "Central African Rep.": "中非", 501 "Iceland": "冰岛", 502 "Zambia": "赞比亚", 503 "Senegal": "塞内加尔", 504 "Papua New Guinea": "巴布亚新几内亚", 505 "Trinidad and Tobago": "特立尼达和多巴哥", 506 "Zimbabwe": "津巴布韦", 507 "Jordan": "约旦", 508 "Gambia": "冈比亚", 509 "Kazakhstan": "哈萨克斯坦", 510 "Poland": "波兰", 511 "Eritrea": "厄立特里亚", 512 "Kyrgyzstan": "吉尔吉斯斯坦", 513 "Montserrat": "蒙特塞拉特", 514 "New Caledonia": "新喀里多尼亚", 515 "Macedonia": "马其顿", 516 "Paraguay": "巴拉圭", 517 "Latvia": "拉脱维亚", 518 "Hungary": "匈牙利", 519 "Syria": "叙利亚", 520 "Honduras": "洪都拉斯", 521 "Myanmar": "缅甸", 522 "Mexico": "墨西哥", 523 "Egypt": "埃及", 524 "Nicaragua": "尼加拉瓜", 525 "Cuba": "古巴", 526 "Serbia": "塞尔维亚", 527 "Comoros": "科摩罗", 528 "United Kingdom": "英国", 529 "Fr. S. Antarctic Lands": "南极洲", 530 "Congo": "刚果(布)", 531 "Greece": "希腊", 532 "Sri Lanka": "斯里兰卡", 533 "Croatia": "克罗地亚", 534 "Botswana": "博茨瓦纳", 535 "Siachen Glacier": "锡亚琴冰川地区" 536 }, 537 roam: false, 538 label: { 539 show: false, 540 color: \'blue\' 541 }, 542 data: mydata 543 } 544 ] 545 }; 546 547 //使用指定的配置项和数据显示图表 548 myChart.setOption(option); 549 550 }, 551 error:function(){//处理页面出错以后执行的函数。 552 553 } 554 }); 555 } 556 </script> 557 </body> 558 </html>
jsp
dao层
1 package dao; 2 3 import java.sql.Connection; 4 import java.sql.ResultSet; 5 import java.sql.SQLException; 6 import java.sql.Statement; 7 import java.util.ArrayList; 8 9 import entity.World; 10 import util.DBUtil; 11 12 public class Dao { 13 14 public ArrayList<World> getconfirmed(String time) { 15 String sql="select * from world_map where now_time like \'"+time+"%\' "; 16 System.out.println(time); 17 Connection con=null; 18 Statement state=null; 19 ResultSet rs=null; 20 boolean flag=false; 21 con=DBUtil.getConn(); 22 World bean=null; 23 ArrayList<World> list=new ArrayList<World>(); 24 try { 25 state=con.createStatement(); 26 rs=state.executeQuery(sql); 27 while(rs.next()) 28 { 29 bean=new World(); 30 bean.setProvinceName(rs.getString("provinceName")); 31 bean.setConfirmedCount(rs.getString("confirmedCount")); 32 bean.setSuspectedCount(rs.getString("suspectedCount")); 33 bean.setCuredCount(rs.getString("curedCount")); 34 bean.setDeadCount(rs.getString("deadCount")); 35 //System.out.println(bean.getName()+" "+bean.getConfirmed()); 36 list.add(bean); 37 } 38 } catch (SQLException e) { 39 // TODO 自动生成的 catch 块 40 e.printStackTrace(); 41 } 42 DBUtil.close(rs, state, con); 43 return list; 44 } 45 46 public ArrayList<World> getdead(String time) { 47 String sql="select * from world_map where now_time like \'"+time+"%\' ORDER BY deadCount desc "; 48 System.out.println(time); 49 Connection con=null; 50 Statement state=null; 51 ResultSet rs=null; 52 boolean flag=false; 53 con=DBUtil.getConn(); 54 World bean=null; 55 ArrayList<World> list=new ArrayList<World>(); 56 try { 57 state=con.createStatement(); 58 rs=state.executeQuery(sql); 59 while(rs.next()) 60 { 61 bean=new World(); 62 bean.setProvinceName(rs.getString("provinceName")); 63 bean.setConfirmedCount(rs.getString("confirmedCount")); 64 bean.setSuspectedCount(rs.getString("suspectedCount")); 65 bean.setCuredCount(rs.getString("curedCount")); 66 bean.setDeadCount(rs.getString("deadCount")); 67 //System.out.println(bean.getName()+" "+bean.getConfirmed()); 68 list.add(bean); 69 } 70 } catch (SQLException e) { 71 // TODO 自动生成的 catch 块 72 e.printStackTrace(); 73 } 74 DBUtil.close(rs, state, con); 75 return list; 76 } 77 78 public ArrayList<World> getcured(String time) { 79 String sql="select * from world_map where now_time like \'"+time+"%\' order by curedCount desc "; 80 System.out.println(time); 81 Connection con=null; 82 Statement state=null; 83 ResultSet rs=null; 84 boolean flag=false; 85 con=DBUtil.getConn(); 86 World bean=null; 87 ArrayList<World> list=new ArrayList<World>(); 88 try { 89 state=con.createStatement(); 90 rs=state.executeQuery(sql); 91 while(rs.next()) 92 { 93 bean=new World(); 94 bean.setProvinceName(rs.getString("provinceName")); 95 bean.setConfirmedCount(rs.getString("confirmedCount")); 96 bean.setSuspectedCount(rs.getString("suspectedCount")); 97 bean.setCuredCount(rs.getString("curedCount")); 98 bean.setDeadCount(rs.getString("deadCount")); 99 //System.out.println(bean.getCuredCount()); 100 list.add(bean); 101 } 102 } catch (SQLException e) { 103 // TODO 自动生成的 catch 块 104 e.printStackTrace(); 105 } 106 DBUtil.close(rs, state, con); 107 return list; 108 } 109 110 public ArrayList<World> dataconfirmed() { 111 String sql="select * from world_map "; 112 Connection con=null; 113 Statement state=null; 114 ResultSet rs=null; 115 boolean flag=false; 116 con=DBUtil.getConn(); 117 World bean=null; 118 int sum=0; 119 int ans=0; 120 String data=null; 121 ArrayList<World> list=new ArrayList<World>(); 122 try { 123 state=con.createStatement(); 124 rs=state.executeQuery(sql); 125 while(rs.next()) 126 { 127 sum++; 128 bean=new World(); 129 bean.setProvinceName(rs.getString("now_time")); 130 if(sum==1) 131 data=bean.getProvinceName(); 132 bean.setConfirmedCount(rs.getString("confirmedCount")); 133 if(data.equals(bean.getProvinceName())) 134 ans+=Integer.parseInt(bean.getConfirmedCount()); 135 else 136 { 137 String timeString=data.substring(0,10); 138 World bean2=new World(); 139 bean2.setProvinceName(timeString); 140 bean2.setConfirmedCount(String.valueOf(ans)); 141 sum=1; 142 ans=0; 143 ans+=Integer.parseInt(bean.getConfirmedCount()); 144 data=bean.getProvinceName(); 145 list.add(bean2); 146 } 147 } 148 bean.setProvinceName(data.substring(0,10)); 149 bean.setConfirmedCount(String.valueOf(ans)); 150 list.add(bean); 151 } catch (SQLException e) { 152 // TODO 自动生成的 catch 块 153 e.printStackTrace(); 154 } 155 DBUtil.close(rs, state, con); 156 return list; 157 } 158 public ArrayList<World> allworld(String time) { 159 String sql="select * from world_map where now_time like \'"+time+"%\' "; 160 System.out.println(time); 161 Connection con=null; 162 Statement state=null; 163 ResultSet rs=null; 164 boolean flag=false; 165 con=DBUtil.getConn(); 166 World bean=null; 167 ArrayList<World> list=new ArrayList<World>(); 168 try { 169 state=con.createStatement(); 170 rs=state.executeQuery(sql); 171 while(rs.next()) 172 { 173 bean=new World(); 174 bean.setProvinceName(rs.getString("provinceName")); 175 bean.setConfirmedCount(rs.getString("confirmedCount")); 176 bean.setSuspectedCount(rs.getString("suspectedCount")); 177 bean.setCuredCount(rs.getString("curedCount")); 178 bean.setDeadCount(rs.getString("deadCount")); 179 //System.out.println(bean.getName()+" "+bean.getConfirmed()); 180 list.add(bean); 181 } 182 } catch (SQLException e) { 183 // TODO 自动生成的 catch 块 184 e.printStackTrace(); 185 } 186 DBUtil.close(rs, state, con); 187 return list; 188 } 189 } 190 Dao.java 191
dao
显示治愈人数、死亡人数、确诊人数功能
1 package servlet; 2 3 import java.io.IOException; 4 import java.util.Date; 5 import java.text.SimpleDateFormat; 6 import java.util.ArrayList; 7 8 import javax.servlet.ServletException; 9 import javax.servlet.annotation.WebServlet; 10 import javax.servlet.http.HttpServlet; 11 import javax.servlet.http.HttpServletRequest; 12 import javax.servlet.http.HttpServletResponse; 13 14 import com.google.gson.Gson; 15 16 import dao.Dao; 17 import entity.World; 18 19 /** 20 * Servlet implementation class Getconfirmed 21 */ 22 @WebServlet("/Getconfirmed") 23 public class Getconfirmed extends HttpServlet { 24 private static final long serialVersionUID = 1L; 25 26 /** 27 * @see HttpServlet#HttpServlet() 28 */ 29 public Getconfirmed() { 30 super(); 31 // TODO Auto-generated constructor stub 32 } 33 34 /** 35 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) 36 */ 37 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 38 // TODO Auto-generated method stub 39 Dao dao=new Dao(); 40 request.setCharacterEncoding("utf-8"); 41 Date now = new Date(); 42 SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式 43 String Time = dateFormat.format(now);//格式化然后放入字符串中 44 String data=Time.substring(0,10); 45 ArrayList<World> list=dao.getconfirmed(data); 46 Gson gson = new Gson(); 47 response.setContentType("text/html;charset=utf-8"); 48 String json = gson.toJson(list); 49 response.getWriter().write(json); 50 System.out.println(json); 51 } 52 53 /** 54 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) 55 */ 56 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 57 // TODO Auto-generated method stub 58 doGet(request, response); 59 } 60 61 } 62 Getconfirmed.java 63 64 package servlet; 65 66 import java.io.IOException; 67 import java.text.SimpleDateFormat; 68 import java.util.ArrayList; 69 import java.util.Date; 70 71 import javax.servlet.ServletException; 72 import javax.servlet.annotation.WebServlet; 73 import javax.servlet.http.HttpServlet; 74 import javax.servlet.http.HttpServletRequest; 75 import javax.servlet.http.HttpServletResponse; 76 77 import com.google.gson.Gson; 78 79 import dao.Dao; 80 import entity.World; 81 82 /** 83 * Servlet implementation class Getcured 84 */ 85 @WebServlet("/Getcured") 86 public class Getcured extends HttpServlet { 87 private static final long serialVersionUID = 1L; 88 89 /** 90 * @see HttpServlet#HttpServlet() 91 */ 92 public Getcured() { 93 super(); 94 // TODO Auto-generated constructor stub 95 } 96 97 /** 98 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) 99 */ 100 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 101 Dao dao =new Dao(); 102 request.setCharacterEncoding("utf-8"); 103 Date now = new Date(); 104 SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式 105 String Time = dateFormat.format(now);//格式化然后放入字符串中 106 String data=Time.substring(0,10); 107 ArrayList<World> list=dao.getcured(data); 108 Gson gson = new Gson(); 109 response.setContentType("text/html;charset=utf-8"); 110 String json = gson.toJson(list); 111 response.getWriter().write(json); 112 System.out.println(json); 113 } 114 115 /** 116 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) 117 */ 118 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 119 // TODO Auto-generated method stub 120 doGet(request, response); 121 } 122 123 } 124 Getcured.java 125 126 package servlet; 127 128 import java.io.IOException; 129 import java.text.SimpleDateFormat; 130 import java.util.ArrayList; 131 import java.util.Date; 132 133 import javax.servlet.ServletException; 134 import javax.servlet.annotation.WebServlet; 135 import javax.servlet.http.HttpServlet; 136 import javax.servlet.http.HttpServletRequest; 137 import javax.servlet.http.HttpServletResponse; 138 139 import com.google.gson.Gson; 140 141 import dao.Dao; 142 import entity.World; 143 144 /** 145 * Servlet implementation class GetDead 146 */ 147 @WebServlet("/GetDead") 148 public class GetDead extends HttpServlet { 149 private static final long serialVersionUID = 1L; 150 151 /** 152 * @see HttpServlet#HttpServlet() 153 */ 154 public GetDead() { 155 super(); 156 // TODO Auto-generated constructor stub 157 } 158 159 /** 160 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) 161 */ 162 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 163 Dao dao=new Dao(); 164 request.setCharacterEncoding("utf-8"); 165 Date now = new Date(); 166 SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式 167 String Time = dateFormat.format(now);//格式化然后放入字符串中 168 String data=Time.substring(0,10); 169 ArrayList<World> list=dao.getdead(data); 170 Gson gson = new Gson(); 171 response.setContentType("text/html;charset=utf-8"); 172 String json = gson.toJson(list); 173 response.getWriter().write(json); 174 System.out.println(json); 175 } 176 177 /** 178 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) 179 */ 180 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 181 // TODO Auto-generated method stub 182 doGet(request, response); 183 } 184 185 } 186 GetDead.java
View Code
实现日期控制
1 package servlet; 2 3 import java.io.IOException; 4 import java.util.ArrayList; 5 6 import javax.servlet.ServletException; 7 import javax.servlet.annotation.WebServlet; 8 import javax.servlet.http.HttpServlet; 9 import javax.servlet.http.HttpServletRequest; 10 import javax.servlet.http.HttpServletResponse; 11 12 import com.google.gson.Gson; 13 14 import dao.Dao; 15 import entity.World; 16 17 /** 18 * Servlet implementation class Dataconfirmed 19 */ 20 @WebServlet("/Dataconfirmed") 21 public class Dataconfirmed extends HttpServlet { 22 private static final long serialVersionUID = 1L; 23 24 /** 25 * @see HttpServlet#HttpServlet() 26 */ 27 public Dataconfirmed() { 28 super(); 29 // TODO Auto-generated constructor stub 30 } 31 32 /** 33 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) 34 */ 35 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 36 Dao dao =new Dao(); 37 request.setCharacterEncoding("utf-8"); 38 ArrayList<World> list=dao.dataconfirmed(); 39 Gson gson = new Gson(); 40 response.setContentType("text/html;charset=utf-8"); 41 String json = gson.toJson(list); 42 response.getWriter().write(json); 43 System.out.println("日期变化曲线!"); 44 System.out.println(json); 45 } 46 47 /** 48 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) 49 */ 50 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 51 // TODO Auto-generated method stub 52 doGet(request, response); 53 } 54 55 } 56 Dataconfirmed.java
View Code
具体实现
1 import json 2 3 import pymysql 4 import requests 5 from bs4 import BeautifulSoup 6 import datetime 7 8 url = \'https://ncov.dxy.cn/ncovh5/view/pneumonia?from=timeline&isappinstalled=0\' # 请求地址 9 headers = { 10 \'user-agent\': \'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36\'} # 创建头部信息 11 response = requests.get(url, headers=headers) # 发送网络请求 12 content = response.content.decode(\'utf-8\') 13 soup = BeautifulSoup(content, \'html.parser\') 14 15 # 世界确诊getAreaStat 16 listB = soup.find_all(name=\'script\', attrs={"id": "getListByCountryTypeService2true"}) 17 18 world_messages = str(listB)[95:-21] 19 20 print(world_messages) 21 world_messages_json = json.loads(world_messages) 22 worldList = [] 23 now_time = datetime.datetime.now().strftime(\'%Y-%m-%d\') 24 25 for k in range(len(world_messages_json)): 26 worldvalue = (now_time, 27 world_messages_json[k].get(\'countryType\'), world_messages_json[k].get(\'continents\'), 28 world_messages_json[k].get(\'provinceId\'), world_messages_json[k].get(\'provinceName\'), 29 world_messages_json[k].get(\'provinceShortName\'), world_messages_json[k].get(\'cityName\'), 30 world_messages_json[k].get(\'currentConfirmedCount\'), world_messages_json[k].get(\'confirmedCount\'), 31 world_messages_json[k].get(\'suspectedCount\'), world_messages_json[k].get(\'curedCount\'), 32 world_messages_json[k].get(\'deadCount\'), world_messages_json[k].get(\'locationId\'), 33 world_messages_json[k].get(\'countryShortCode\'),) 34 worldList.append(worldvalue) 35 36 db = pymysql.connect("localhost", "root", "0000", "yiqing", charset=\'utf8\') 37 cursor = db.cursor() 38 39 sql_world = "INSERT INTO world_map values (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)" 40 41 worldTuple = tuple(worldList) 42 print(worldTuple) 43 44 try: 45 cursor.executemany(sql_world, worldTuple) 46 db.commit() 47 except: 48 print(\'执行失败,进入回调2\') 49 db.rollback() 50 51 db.close()
View Code
5系统使用说明书
首先进入系统
需要先进行注册:
提示注册成功:
使用刚刚注册的用户名密码就可登陆:
登录成功即进入如下界面即可实时查询:
我在这插入了一个操作小视频,也不知道为啥不可以显示
6 参考资料
[1] https://3g.163.com/news/article_cambrian/FBCUAKGF0521C9T8.html
[2] http://www.jingji.com.cn/shtml/jr/gdxw/110702.html
[3] https://article.itxueyuan.com/666gJq
[4] https://www.arcgis.com/apps/opsdashboard/index.html#/bda7594740fd40299423467b48e9ecf6
[5] https://www.esri.com/en-us/disaster-response/request-assistance
[6] 参考博文:https://www.cnblogs.com/dd110343/p/12404756.html
[7] 参考博文: https://www.cnblogs.com/dd110343/p/12461824.html
7 附件说明
本文档要求的附件资料均压缩在“疫情统计图”压缩文件里。
Eclipse版本是2019
Python需导入的库有:pymysql、 requests、bs4
可执行文件“疫情统计图”将其解压就可运行,为了方便我把Python文件也放进去了,运行时吧Python文件单独出来就可
数据库需要后台建立才可完整运行。
项目源代码也均在压缩包里
注:其实地图可以没有必要有登录注册的,毕竟是人人可看的东西,但此处为了使系统完善强行加入了,登录界面也比较丑。