查詢全球疫情app


設計思想:首先需要在網站上爬取全球的的疫情信息,需要運用Python語言並且使用pycharm來連接MySQL數據庫,講爬取到的疫情信息存到數據庫中去,代碼如下:

 1 import pymysql
 2 import requests
 3 import json
 4 # 放入要爬的url
 5 url = "https://view.inews.qq.com/g2/getOnsInfo?name=disease_h5"
 6 # 設置header做一個防爬機制
 7 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"}
 8 # 獲取response的json
 9 response = requests.get(url, headers=header)
10 # 取得數據詞典
11 data = json.loads(response.content.decode())
12 data_str = data['data']
13 data_json = json.loads(data_str)
14 # 連接數據庫
15 db = pymysql.connect(host = 'localhost', port=3306, user='root', password='20183602', db='yiqing', charset='utf8')
16 #使用cursor方法生成一個游標
17 cursor = db.cursor()
18 confirmed_total = 0
19 suspected_total = 0
20 dead_total = 0
21 healed_total = 0
22 # 更新時間
23 lastUpdateTime = data_json['lastUpdateTime']
24 # 取出各個國家的數據
25 for worldData in data_json['areaTree']:
26     countryName = worldData['name']
27     confirmed = worldData['total']['confirm']
28     confirmed_total += confirmed
29     suspected = worldData['total']['suspect']
30     suspected_total += suspected
31     dead = worldData['total']['dead']
32     dead_total += dead
33     healed = worldData['total']['heal']
34     healed_total += healed
35     sql = "insert into worlddata(id,countryname,confirmed,suspected,dead,healed,lastupdateTime) values({},'{}','{}','{}','{}', '{}','{}')".format(0, countryName, confirmed, suspected, dead, healed, lastUpdateTime)
36     cursor.execute(sql)
37     db.commit()
38 sql_total = "insert into worlddata(id,countryname,confirmed,suspected,dead,healed,lastupdateTime) values({},'{}','{}','{}','{}', '{}','{}')".format(0, 0, confirmed_total, suspected_total, dead_total, healed_total, lastUpdateTime)
39 cursor.execute(sql_total)
40 db.commit()

數據庫截圖:

 

 

然后是使用Android studio軟件來制作一個APP,設置app界面的代碼如下:

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     xmlns:app="http://schemas.android.com/apk/res-auto"
 4     xmlns:tools="http://schemas.android.com/tools"
 5     android:orientation="vertical"
 6     android:layout_width="match_parent"
 7     android:layout_height="match_parent"
 8     tools:context=".MainActivity">
 9 
10     <Spinner
11         android:id="@+id/condition"
12         android:layout_width="wrap_content"
13         android:layout_height="wrap_content"
14         />
15     <EditText
16         android:id="@+id/et_content"
17         android:layout_width="180dp"
18         android:layout_height="40dp"
19         android:layout_toRightOf="@+id/condition"
20         />
21     <Button
22         android:id="@+id/bt_send"
23         android:layout_width="match_parent"
24         android:layout_height="wrap_content"
25         android:text="查詢"
26         android:layout_toRightOf="@+id/et_content"
27         />
28 
29     <ListView
30         android:id="@+id/lv"
31         android:layout_width="match_parent"
32         android:layout_height="match_parent"
33         android:layout_marginTop="50dp"
34         />
35 
36 </RelativeLayout>

然后根據數據庫中的數據格式建立一個存放全球數據信息的data文件,代碼如下:

 1  1 package com.example.yiqing;
 2  2 
 3  3 public class WorldData {
 4  4     private int id;
 5  5     private String countryname;
 6  6     private String confirmed;
 7  7     private String suspected;
 8  8     private String dead;
 9  9     private String healed;
10 10     private String lastUpdateTime;
11 11 
12 12 
13 13     public int getId() {
14 14         return id;
15 15     }
16 16 
17 17     public void setId(int id) {
18 18         this.id = id;
19 19     }
20 20 
21 21     public String getCountryname() {
22 22         return countryname;
23 23     }
24 24 
25 25     public void setCountryname(String countryname) {
26 26         this.countryname = countryname;
27 27     }
28 28 
29 29     public String getConfirmed() {
30 30         return confirmed;
31 31     }
32 32 
33 33     public void setConfirmed(String confirmed) {
34 34         this.confirmed = confirmed;
35 35     }
36 36 
37 37     public String getSuspected() {
38 38         return suspected;
39 39     }
40 40 
41 41     public void setSuspected(String suspected) {
42 42         this.suspected = suspected;
43 43     }
44 44 
45 45     public String getDead() {
46 46         return dead;
47 47     }
48 48 
49 49     public void setDead(String dead) {
50 50         this.dead = dead;
51 51     }
52 52 
53 53     public String getHealed() {
54 54         return healed;
55 55     }
56 56 
57 57     public void setHealed(String healed) {
58 58         this.healed = healed;
59 59     }
60 60 
61 61     public String getLastUpdateTime() {
62 62         return lastUpdateTime;
63 63     }
64 64 
65 65     public void setLastUpdateTime(String lastUpdateTime) {
66 66         this.lastUpdateTime = lastUpdateTime;
67 67     }
68 68 }

然后需要把數據庫中的疫情信息讀取出來,所以要創建一個連接數據庫的Java文件並可以通過IP地址訪問,該文件中還要實現對數據庫里面的數據的調用與查詢,代碼如下:

 1 package com.example.yiqing;
 2 
 3 
 4 import java.sql.Connection;
 5 import java.sql.DriverManager;
 6 import java.sql.PreparedStatement;
 7 import java.sql.ResultSet;
 8 import java.sql.SQLException;
 9 import java.util.ArrayList;
10 import java.util.HashMap;
11 import java.util.List;
12 
13 public class DBOpenHelper {
14     private static String driver = "com.mysql.jdbc.Driver";
15     private static String url = "jdbc:mysql://192.168.0.123:3306/yiqing?characterEncoding=utf-8";
16     private static String user = "root";//用戶名
17     private static String password = "20183602";//密碼
18 
19     public static Connection getConn(){
20         Connection conn = null;
21         try {
22             Class.forName(driver);
23             conn = (Connection) DriverManager.getConnection(url,user,password);//獲取連接
24         } catch (ClassNotFoundException e) {
25             e.printStackTrace();
26         } catch (SQLException e) {
27             e.printStackTrace();
28         }
29         return conn;
30     }
31     public static List<WorldData>  searchDataByCountry(String condition,String country_name){
32         List<WorldData> list = new ArrayList<>();
33         Connection connection = getConn();
34         String sql = "";
35         //System.out.println(condition);
36         if(condition.equals("國家")){
37             sql = "select * from worlddata where countryname like ?";
38         }
39         if(condition.equals("時間")){
40             sql = "select * from worlddata where lastUpdateTime like ?";
41         }
42         System.out.println(country_name);
43         if(connection !=null){
44             try {
45                 PreparedStatement ps = connection.prepareStatement(sql);
46                 if(ps!=null){
47                     ps.setString(1,"%"+country_name+"%");
48                     ResultSet rs = ps.executeQuery();
49                     if(rs!=null){
50                         while(rs.next()){
51                             WorldData worldData = new WorldData();
52                             worldData.setId(rs.getInt("id"));
53                             worldData.setCountryname(rs.getString("countryname"));
54                             worldData.setConfirmed(rs.getString("confirmed"));
55                             worldData.setSuspected(rs.getString("suspected"));
56                             worldData.setDead(rs.getString("dead"));
57                             worldData.setHealed(rs.getString("healed"));
58                             worldData.setLastUpdateTime(rs.getString("lastUpdateTime"));
59                             list.add(worldData);
60                         }
61                         connection.close();
62                         ps.close();
63                         return list;
64                     }else{
65                         return null;
66                     }
67                 }else{
68                     return null;
69                 }
70             } catch (SQLException e) {
71                 e.printStackTrace();
72                 return null;
73             }
74         }else{
75             return null;
76         }
77 
78     }
79 }

然后就是在MainActivity文件中編寫用到的方法並且調用對數據庫的操作的函數,實現把從數據庫中查詢到的數據顯示出來,代碼如下:

  1 package com.example.yiqing;
  2 
  3 import androidx.appcompat.app.AppCompatActivity;
  4 
  5 import androidx.appcompat.app.AppCompatActivity;
  6 
  7 import android.annotation.SuppressLint;
  8 import android.app.Activity;
  9 import android.icu.lang.UCharacter;
 10 import android.os.Bundle;
 11 import android.os.Handler;
 12 import android.os.Message;
 13 import android.text.Editable;
 14 import android.text.TextWatcher;
 15 import android.view.View;
 16 import android.widget.AdapterView;
 17 import android.widget.ArrayAdapter;
 18 import android.widget.Button;
 19 import android.widget.EditText;
 20 import android.widget.ListView;
 21 import android.widget.Spinner;
 22 import android.widget.TextView;
 23 
 24 import java.sql.Connection;
 25 import java.sql.ResultSet;
 26 import java.sql.Statement;
 27 import java.util.ArrayList;
 28 import java.util.List;
 29 
 30 public class MainActivity extends AppCompatActivity {
 31     private Button bt_send;
 32     private EditText et_content;
 33     private static final int TEST_USER_SELECT = 1;
 34     private String content;
 35     private Spinner conditionSpinner;
 36     private String condition;
 37     private ListView lv;
 38     String[] strs = new String[]{};
 39     @SuppressLint("HandlerLeak")
 40     private Handler mHandler = new Handler(){
 41         @Override
 42         public void handleMessage(Message msg){
 43 
 44             switch(msg.what){
 45                 case TEST_USER_SELECT:
 46                     String s = (String)msg.obj;
 47                     //System.out.println("***********");
 48                     // System.out.println("***********");
 49                     //System.out.println("data:"+s);
 50                     strs = s.split("  ");
 51                     lv.setAdapter(new ArrayAdapter<String>(MainActivity.this,R.layout.support_simple_spinner_dropdown_item,strs));
 52                     break;
 53             }
 54         }
 55     };
 56 
 57     @Override
 58     protected void onCreate(Bundle savedInstanceState) {
 59         super.onCreate(savedInstanceState);
 60         setContentView(R.layout.activity_main);
 61         bt_send = findViewById(R.id.bt_send);
 62         et_content = findViewById(R.id.et_content);
 63         et_content.addTextChangedListener(new TextWatcher() {
 64             @Override
 65             public void beforeTextChanged(CharSequence s, int start, int count, int after) {
 66 
 67             }
 68 
 69             @Override
 70             public void onTextChanged(CharSequence s, int start, int before, int count) {
 71 
 72             }
 73 
 74             @Override
 75             public void afterTextChanged(Editable s) {
 76                 content = s.toString();
 77             }
 78         });
 79         conditionSpinner = findViewById(R.id.condition);
 80         final String [] data = {"國家","時間"};
 81         ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,R.layout.support_simple_spinner_dropdown_item,data);
 82         conditionSpinner.setAdapter(adapter);
 83         conditionSpinner.setOnItemSelectedListener(new Spinner.OnItemSelectedListener(){
 84 
 85             @Override
 86             public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
 87                 //取得選中的值
 88                 condition = data[position];
 89                 //設置顯示當前選擇的項
 90                 parent.setVisibility(View.VISIBLE);
 91             }
 92 
 93             @Override
 94             public void onNothingSelected(AdapterView<?> parent) {
 95 
 96             }
 97         });
 98         System.out.println(condition);
 99         lv = findViewById(R.id.lv);
100 
101     }
102     @Override
103     protected void onStart(){
104         super.onStart();
105         bt_send.setOnClickListener(new View.OnClickListener() {
106             @Override
107             public void onClick(View v) {
108                 //執行查詢操作
109                 //連接數據庫進行操作需要在主線程操作
110                 new Thread(new Runnable() {
111                     @Override
112                     public void run() {
113                         //調用數據庫幫助類中的方法取數據
114                         List<WorldData> list = DBOpenHelper.searchDataByCountry(condition,content);
115                         Message message = mHandler.obtainMessage();
116                         String s = "";
117                         for(int i=0;i<list.size();i++){
118                             s += "時間:"+list.get(i).getLastUpdateTime()+"  ";
119                             s += list.get(i).getCountryname()+"確診人數為:  ";
120                             s += list.get(i).getConfirmed()+"  ";
121                         }
122                         message.what = TEST_USER_SELECT;
123                         message.obj = s;
124                         mHandler.sendMessage(message);
125                     }
126                 }).start();
127             }
128         });
129     }
130 }

最后通過選擇地點或時間的方式來查詢疫情信息,結果截圖:

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM