全国疫情数据爬取+可视化展示

练习要求:
       1.编程爬取每日最新的疫情统计数据。
       2.并将爬取结果导入到数据库中。
       3.将可视化结果与统计数据结合,实时显示当前最新数据
设计思路,先找到相对应的的网站,用python爬取网站数据,在进行筛选,找到最新的疫情数据,获取数据并存储到mysql数据库中,再进行jsp界面设计、获取数据库数据,并通过Echart显示在web界面中,以柱状图实现数据的可视化。
 
 
代码部分:
python爬虫
# coding=utf-8
import pymysql
import requests
import json

url = "https://c.m.163.com/ug/api/wuhan/app/data/list-total?t=316765403234"
header = {"user-agent": "Mozilla/5.0 (Linux; Android 8.0.0; Pixel 2 XL Build/OPD1.170816.004) AppleWebKit/537.36 ("
                        "KHTML, like Gecko) Chrome/80.0.3987.116 Mobile Safari/537.36"}
response = requests.get(url, headers=header)
mydir = json.loads(response.content.decode())
# 数据库的连接
db = pymysql.connect(host='localhost', port=3306, user='root', passwd='123456', db='yiqing_new', charset='utf8')
# 使用cursor方法创建一个游标
cursor = db.cursor()
# mydir['data']['areaTree'][0]['children']再往后是省份
# print(mydir['data']['areaTree'][0]['children'][33])
for item in mydir['data']['areaTree'][0]['children']:
    name = item['name']
    confirm = item['total']['confirm']
    severe = item['total']['severe']
    heal = item['total']['heal']
    dead = item['total']['dead']
    suspect = item['total']['suspect']
    idcode = item['id']
    lastUpdateTime = item['lastUpdateTime']
    # 插入数据
    """sql = "insert into new_number(id,name,confirm,suspect,heal,dead,severe,idcode,lastupdatetime) values ({},'{}'," \
          "'{}','{}','{}','{}','{}','{}','{}');".format(
        0, name, confirm, suspect, heal, dead, severe, idcode, lastUpdateTime)"""

#插入并更新数据
sql = "insert into new_number(id,name,confirm,suspect,heal,dead,severe,idcode,lastupdatetime) values (%s,%s,%s,%s,%s,%s,%s,%s,%s)" \ "on duplicate key update id=values (id),confirm=values (confirm),suspect=values (suspect),heal=values (heal),dead=values (dead),severe=values (severe),idcode=values (idcode),lastupdatetime=values (lastupdatetime)" print(sql) cursor.executemany(sql, [[0, name, confirm, severe, heal,dead,severe,idcode,lastUpdateTime]]) #cursor.execute(sql) db.commit()

页面展示:jsp

  1 <%@page import="com.alibaba.fastjson.JSON"%>
  2 <%@ page language="java" contentType="text/html; charset=UTF-8"
  3     pageEncoding="UTF-8"%>
  4 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  5 <html>
  6 <head>
  7 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  8 <title>Insert title here</title>
  9  <script src="echarts.min.js"></script>
 10  <script src="https://cdn.staticfile.org/jquery/3.2.1/jquery.min.js"></script>
 11  <script src="https://cdn.staticfile.org/popper.js/1.15.0/umd/popper.min.js"></script>
 12  <script src="https://cdn.staticfile.org/twitter-bootstrap/4.3.1/js/bootstrap.min.js"></script>
 13 <style>
 14             #one{
 15                 /*border: 1px solid black;*/
 16                 width: 1000px;
 17                 height:auto;
 18                 background-color: ghostwhite;
 19                 margin: auto;
 20             }
 21             #main{
 22             width:1000px;
 23             height:outo;
 24             background-color: ghostwhite;
 25             margin: auto;
 26             }
 27             .table
 28             {
 29             margin: auto;
 30             }
 31 </style>
 32 </head>
 33 <body>
 34         <div id="one">
 35         点击查询最新疫情情况:
 36              <input type="submit" value="查询" onclick="search()">
 37         </div>
 38         <br/>
 39 <div id="main" style="width: 100%;height:400px;overflow: auto;"></div>
 40 <table class="table">
 41         <thead class="head">
 42             </thead>
 43         <tbody class="main"></tbody>
 44     </table>
 45 <script type="text/javascript">
 46         // 基于准备好的dom,初始化echarts实例
 47         var myChart = echarts.init(document.getElementById('main'));
 48        
 49         // 指定图表的配置项和数据
 50         myChart.showLoading();
 51         function search() {
 52             var date=$("#date").val();
 53            alert("查找成功");
 54             $.post(
 55                 'YiqingSelvlet',
 56                 {},
 57                 function(msg){
 58                     var json=JSON.parse(msg);
 59                     var size=json.length;
 60                     var names=[];
 61                     var nums=[];
 62                     for(i=0;i<size;i++){
 63                         names.push(json[i].name);
 64                         nums.push(json[i].confirm);
 65                         i++;
 66                     }
 67                   
 68                     myChart.hideLoading();
 69                     var option = {
 70                             title: {
 71                                 text: '最新确诊人数'
 72                             },
 73                             tooltip: {},
 74                             legend: {
 75                                 data:['确诊人数']
 76                             },
 77                             xAxis: {
 78                                 data: names
 79                             },
 80                             yAxis: {},
 81                             series: [{
 82                                 name: '确诊人数',
 83                                 type: 'bar',
 84                                 data: nums
 85                             }]
 86                         };
 87                   myChart.setOption(option);
 88                   tr="<tr><th>省份</th><th>确诊人数</th><th>疑似人数</th><th>治愈人数</th><th>死亡人数</th><th>重症人数</th><th>编码</th><th>最后更新时间</th></tr>";
 89                   $('.head').append(tr);
 90                   for(i=0;i<size;i++)
 91                       $('.main').append("<tr></tr>");
 92                   $('.main tr').each(function(i){
 93                       $(this).append("<td>"+json[i].name+"</td>");
 94                       $(this).append("<td>"+json[i].confirm+"</td>");
 95                       $(this).append("<td>"+json[i].suspect+"</td>");
 96                       $(this).append("<td>"+json[i].heal+"</td>");
 97                       $(this).append("<td>"+json[i].dead+"</td>");
 98                       $(this).append("<td>"+json[i].severe+"</td>");
 99                       $(this).append("<td>"+json[i].idcode+"</td>");
100                       $(this).append("<td>"+json[i].lastupdatetime+"</td>");
101                   })
102            
103                 },
104                //"json"
105                 );
106             
107         }
108      
109    </script>              
110 </body>
111 </html>

selvlet部分代码:

package selvlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import dbutil.YiqingDButil;

/**
 * Servlet implementation class YiqingSelvlet
 */
@WebServlet("/YiqingSelvlet")
public class YiqingSelvlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public YiqingSelvlet() {
        super();
        // TODO Auto-generated constructor stub
    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        response.getWriter().append("Served at: ").append(request.getContextPath());
    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        //doGet(request, response);
        request.setCharacterEncoding("utf-8");
         response.setContentType("text/html;charset=UTF-8");
            response.getWriter().write(YiqingDButil.getall());
    }

}

DBUtil部分代码:

 1 package dbutil;
 2 
 3 import java.sql.Connection;
 4 import java.sql.Date;
 5 import java.sql.DriverManager;
 6 import java.sql.PreparedStatement;
 7 import java.sql.ResultSet;
 8 import java.util.ArrayList;
 9 
10 import com.alibaba.fastjson.JSONArray;
11 import com.alibaba.fastjson.JSONObject;
12 
13 import javabeen.Things;
14 import javabeen.yiqing;
15 
16 public class YiqingDButil {
17     //数据库URL和账号密码
18         public static final String connectionURL="jdbc:mysql://localhost:3306/yiqing_new?useUnicode=true&characterEncoding=GB18030&useSSL=false&serverTimezone=GMT&allowPublicKeyRetrieval=true";
19         public static final String username="root";
20         public static final String password="123456";
21         static Connection connection;
22         static ResultSet rSet;
23         static PreparedStatement sql;
24         //数据库连接
25         public static Connection getConnection()
26         {
27             try {
28                 Class.forName("com.mysql.cj.jdbc.Driver");
29                 return DriverManager.getConnection(connectionURL, username, password);
30             } catch (Exception e) {
31                 // TODO: handle exception
32                 System.out.println("数据库连接失败");
33                 e.printStackTrace();
34             }
35             return null;
36         }                                                   
37         public static String getall()//bianli
38         {
39             try {
40         
41                 connection=getConnection();
42                 sql=connection.prepareStatement("select * from new_number");
43                 System.out.println(sql);
44                 rSet=sql.executeQuery();
45                 JSONArray jsonArray=new JSONArray();
46                 while(rSet.next())
47                 {
48                     //System.out.println(rSet.getString(3));
49                     JSONObject json=new JSONObject();
50                     json.put("name",rSet.getString(2) );
51                     json.put("confirm", rSet.getString(3));
52                     json.put("suspect",rSet.getString(4));
53                     json.put("heal", rSet.getString(5));
54                     json.put("dead",rSet.getString(6));
55                     json.put("severe", rSet.getString(7));
56                     json.put("idcode", rSet.getString(8));
57                     json.put("lastupdatetime", rSet.getString(9));
58                     jsonArray.add(json);
59                 }
60                 return jsonArray.toString();
61             } catch (Exception e) {
62                 // TODO: handle exception
63                 return null;
64             }
65             
66         }
67 //        public static void main(String[] args) {
68 //            search("2020-02-12");
69 //        }
70 
71 }

结果展示:

爬取的2020-03-11的疫情数据

 

 最后是本次实验的PSP表格:

 

 

 

 

posted @ 2020-03-14 16:04  小赵不吃溜溜梅  阅读(1707)  评论(0编辑  收藏  举报