全球疫情统计APP图表展示:

将该任务分解成三部分来逐个实现:

①爬取全球的疫情数据存储到云服务器的MySQL上

②在web项目里添加一个servlet,通过参数的传递得到对应的json数据

③设计AndroidAPP,通过时间和地名来访问服务器上的对应的servlet来获取json数据,然后将它与图表联系

第一步:由前面的web项目的积累,爬取全球的数据就很容易,利用Python爬虫爬取丁香医生上的数据,存储到服务器上的MySQL

  1. from os import path
  2. import requests
  3. from bs4 import BeautifulSoup
  4. import json
  5. import pymysql
  6. import numpy as np
  7. import time
  8.  
  9. url = 'https://ncov.dxy.cn/ncovh5/view/pneumonia?from=timeline&isappinstalled=0'  #请求地址
  10. 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'}#创建头部信息
  11. response =  requests.get(url,headers = headers)  #发送网络请求
  12. #print(response.content.decode('utf-8'))#以字节流形式打印网页源码
  13. content = response.content.decode('utf-8')
  14.  
  15. soup = BeautifulSoup(content, 'html.parser')
  16. listB = soup.find_all(name='script',attrs={"id":"getListByCountryTypeService2true"})
  17. world_messages = str(listB)[95:-21]
  18. world_messages_json = json.loads(world_messages)
  19. # print(listB)
  20. # print(world_messages)
  21. worldList = []
  22. for k in range(len(world_messages_json)):
  23.     worldvalue = (world_messages_json[k].get('id'),time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())),
  24.              world_messages_json[k].get('continents'),world_messages_json[k].get('provinceName'),
  25.              world_messages_json[k].get('cityName'),world_messages_json[k].get('currentConfirmedCount'),
  26.              world_messages_json[k].get('suspectedCount'),world_messages_json[k].get('curedCount'),world_messages_json[k].get('deadCount'),world_messages_json[k].get('locationId'),
  27.              world_messages_json[k].get('countryShortCode'),)
  28.     worldList.append(worldvalue)
  29. db = pymysql.connect("139.129.221.11", "root", "fengge666", "yiqing", charset='utf8')
  30. cursor = db.cursor()
  31. #sql_clean_world = "TRUNCATE TABLE world_map"
  32. sql_world = "INSERT INTO world_map values (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)"
  33. worldTuple = tuple(worldList)
  34.  
  35. #
  36. # try:
  37. #     cursor.execute(sql_clean_world)
  38. #     db.commit()
  39. # except:
  40. #     print('执行失败,进入回调1')
  41. #     db.rollback()
  42.  
  43. try:
  44.     cursor.executemany(sql_world,worldTuple)
  45.     db.commit()
  46. except:
  47.     print('执行失败,进入回调3')
  48.     db.rollback()
  49.  
  50. db.close()
  51.  

第二步:在之前的web项目里增加一个worldServlet来通过传递过来的参数(时间,地名)来获取服务器里数据库的信息,然后以json的数据格式返回。

  1.  
  2.  
  3.  
  4.  
  5. package servlet;
  6.  
  7. import java.io.IOException;
  8.  
  9. import javax.servlet.ServletException;
  10. import javax.servlet.annotation.WebServlet;
  11. import javax.servlet.http.HttpServlet;
  12. import javax.servlet.http.HttpServletRequest;
  13. import javax.servlet.http.HttpServletResponse;
  14. import com.google.gson.Gson;
  15.  
  16. import Bean.World;
  17. import Dao.predao;
  18.  
  19. /**
  20. * Servlet implementation class worldServlet
  21. */
  22. @WebServlet("/worldServlet")
  23. public class worldServlet extends HttpServlet {
  24. private static final long serialVersionUID = 1L;
  25.  
  26. /**
  27. * @see HttpServlet#HttpServlet()
  28. */
  29. public worldServlet() {
  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. request.setCharacterEncoding("utf-8");
  40. response.setContentType("text/html;charset=utf-8");
  41. response.setCharacterEncoding("utf-8");
  42. String date=request.getParameter("date");
  43. String name=request.getParameter("name");
  44. //System.out.println("666:"+date+" "+name);
  45. predao dao=new predao();
  46. World bean=dao.findworld(date,name);
  47. //if(bean==null)
  48. // System.out.println("world为空");
  49. Gson gson = new Gson();
  50. String json = gson.toJson(bean);
  51. response.getWriter().write(json);
  52. //System.out.println(json);
  53. }
  54.  
  55. /**
  56. * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
  57. */
  58. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  59. // TODO Auto-generated method stub
  60. doGet(request, response);
  61. }
  62.  
  63. }
  64.  
  65.  

第三步:Android端的设计,也要细分成两部分。第一部分设计界面的样式以及图表的展示,第二部分就是实现Android端访问远程服务器里的数据获取对应的信息,然后再配置到Android的图表里。

第一部分实现界面的设计,以及图表。

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <androidx.constraintlayout.widget.ConstraintLayout 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:layout_width="match_parent"
  6.     android:layout_height="match_parent"
  7.     tools:context=".MainActivity">
  8.  
  9.     <TextView
  10.         android:id="@+id/tv_time"
  11.         android:layout_width="wrap_content"
  12.         android:layout_height="wrap_content"
  13.         android:layout_marginStart="16dp"
  14.         android:layout_marginLeft="16dp"
  15.         android:layout_marginTop="16dp"
  16.         android:text="时间"
  17.         android:textSize="25dp"
  18.         app:layout_constraintStart_toStartOf="parent"
  19.         app:layout_constraintTop_toTopOf="parent"/>
  20.  
  21.     <EditText
  22.         android:id="@+id/et_time"
  23.         android:layout_width="250dp"
  24.         android:layout_height="46dp"
  25.         android:layout_marginEnd="100dp"
  26.         android:layout_marginRight="100dp"
  27.         android:gravity="center"
  28.         app:layout_constraintEnd_toEndOf="parent"
  29.         app:layout_constraintTop_toTopOf="@+id/tv_time"/>
  30.  
  31.     <TextView
  32.         android:id="@+id/tv_name"
  33.         android:layout_width="wrap_content"
  34.         android:layout_height="wrap_content"
  35.         android:layout_marginBottom="99dp"
  36.         android:paddingTop="110dp"
  37.         android:text="国家名"
  38.         android:textSize="25dp"
  39.         app:layout_constraintBottom_toTopOf="@+id/chartshow_wb"
  40.         app:layout_constraintStart_toStartOf="parent"
  41.         app:layout_constraintTop_toTopOf="parent"/>
  42.  
  43.     <EditText
  44.         android:id="@+id/et_name"
  45.         android:layout_width="250dp"
  46.         android:layout_height="60dp"
  47.  
  48.         android:gravity="center"
  49.         android:paddingLeft="120dp"
  50.         app:layout_constraintBottom_toBottomOf="@+id/bt_ly"
  51.         app:layout_constraintEnd_toEndOf="parent"
  52.         app:layout_constraintStart_toStartOf="@+id/bt_ly"
  53.         app:layout_constraintTop_toTopOf="@+id/tv_time"/>
  54.  
  55.     <LinearLayout
  56.         android:id="@+id/bt_ly"
  57.         android:layout_width="409dp"
  58.         android:layout_height="209dp"
  59.         android:layout_marginTop="16dp"
  60.         android:gravity="center_horizontal"
  61.         android:paddingTop="150dp"
  62.         app:layout_constraintEnd_toEndOf="parent"
  63.         app:layout_constraintHorizontal_bias="0.0"
  64.         app:layout_constraintStart_toStartOf="parent"
  65.         app:layout_constraintTop_toTopOf="parent">
  66.  
  67.         <Button
  68.             android:id="@+id/linechart_bt"
  69.             style="?android:attr/buttonStyleSmall"
  70.             android:layout_width="match_parent"
  71.             android:layout_height="wrap_content"
  72.             android:layout_weight="1"
  73.             android:text="折线图"/>
  74.  
  75.         <Button
  76.             android:id="@+id/barchart_bt"
  77.             style="?android:attr/buttonStyleSmall"
  78.             android:layout_width="match_parent"
  79.             android:layout_height="wrap_content"
  80.             android:layout_weight="1"
  81.             android:text="柱状图"/>
  82.  
  83.         <Button
  84.             android:id="@+id/piechart_bt"
  85.             style="?android:attr/buttonStyleSmall"
  86.             android:layout_width="match_parent"
  87.             android:layout_height="wrap_content"
  88.             android:layout_weight="1"
  89.             android:text="饼状图"/>
  90.     </LinearLayout>
  91.  
  92.     <WebView
  93.         android:id="@+id/chartshow_wb"
  94.         android:layout_width="408dp"
  95.         android:layout_height="0dp"
  96.         android:layout_gravity="center"
  97.         android:layout_marginBottom="4dp"
  98.         app:layout_constraintBottom_toBottomOf="parent"
  99.         app:layout_constraintEnd_toEndOf="parent"
  100.         app:layout_constraintStart_toStartOf="parent"
  101.         app:layout_constraintTop_toBottomOf="@+id/tv_name">
  102.  
  103.     </WebView>
  104. </androidx.constraintlayout.widget.ConstraintLayout>

界面有三部分组成:其一是时间选择框和地名选择,其二就是三个按钮(折线,柱状,圆饼),其三就是webview来展示我们的图表界面

图表的设计,首先要将echart.min.js放在AndroidStudio里的assets里,然后再放入自己的图表html代码,通过json数据来给图表进行赋值。同样在主页面对webview进行一堆设置,允许运行脚本,设置它的loadURL,然后设计三个按钮的点击方式,同时启动不同的脚本。

  1. <!DOCTYPE html>
  2. <!-- release v4.3.6, copyright 2014 - 2017 Kartik Visweswaran -->
  3. <html lang="en">
  4. <head>
  5.     <meta charset="UTF-8"/>
  6.     <title>Android使用Echarts示例</title>
  7.  
  8. </head>
  9.  
  10. <body>
  11. <div id="main" style="width: 100%; height: 350px;"></div>
  12. <script src="./echarts.min.js"></script>
  13. <script type="text/javascript">
  14. window.addEventListener("resize",function(){
  15.        option.chart.resize();
  16. });
  17.     //初始化路径
  18.     var myChart;
  19.  
  20.     //  通用属性定义
  21.     var options = {
  22.                 title : {
  23.                     text : "Echart测试"
  24.                 },
  25.                 tooltip : {
  26.                     show : false
  27.                 },
  28.                 toolbox : {
  29.                     show : false
  30.                 },
  31.             };
  32.  
  33. function doCreatChart(type,jsondata){
  34.         // 基于准备好的dom,初始化echarts实例
  35.     var myChart = echarts.init(document.getElementById('main'));
  36.     if(type=='line'||type=='bar')
  37.         {
  38.             // 指定图表的配置项和数据
  39.             options = {
  40.                 title: {
  41.                     text: '人数'
  42.                 },
  43.                 tooltip: {},
  44.                 legend: {
  45.                     data:['疫情状况']
  46.                 },
  47.                 xAxis: {
  48.                     data: ["确诊","疑似","治愈","死亡"]
  49.                 },
  50.                 yAxis: {},
  51.                 series: [{
  52.                     name: '患者数',
  53.                     type: type,
  54.                     data: jsondata
  55.                 }]
  56.             };
  57.         }else{
  58.            options = {
  59.             series : [
  60.                 {
  61.                     type:type,
  62.                     radius : '55%',
  63.                     center: ['50%', '60%'],
  64.                     data:[
  65.                         {value:335, name:'确诊'},
  66.                         {value:310, name:'疑似'},
  67.                         {value:234, name:'治愈'},
  68.                         {value:135, name:'死亡'}
  69.                     ]
  70.                 }
  71.             ]
  72.             };
  73.         }
  74.  
  75.         // 使用刚指定的配置项和数据显示图表。
  76.         myChart.setOption(options);
  77.  
  78.         }
  79.     </script>
  80. </body>
  81.  
  82. </html>

第二部分就是通过Android端的http访问来获取服务器端的json数据,在将该数据传到图表的数据格式里。

MainActivity

  1.  

制作中遇到的困难以及解决方案:

①远程数据库的连接无法访问,发现自己的服务器3306端口未开放同时要对服务器里的mysql里的一些东西进行配置:我参考的博客是-->远程连接数据库

②本来想的是进行jdbc访问远程数据库,奈何整了大半天硬是连不上,最终换了一种方式采取http访问服务器里的数据。

③安卓新版本默认不允许使用明文网络传输,

解决办法如下,在AndroidManifest.xml文件的<application标签中,加入一句"android:usesCleartextTraffic="true",允许应用进行明文传输即可。

或者采用:

更改 AndroidManifest 的 application 标签下的配置。

添加 networkSecurityConfig(网络安全配置)。

android:networkSecurityConfig="@xml/network_security_config"

network_security_config 文件内容如下:

  1.  
  2. <?xml version="1.0" encoding="utf-8"?> <network-security-config> <base-config cleartextTrafficPermitted="true" /> </network-security-config>
 

全球疫情爬取APP版的更多相关文章

  1. 微信公众号批量爬取java版

    最近需要爬取微信公众号的文章信息.在网上找了找发现微信公众号爬取的难点在于公众号文章链接在pc端是打不开的,要用微信的自带浏览器(拿到微信客户端补充的参数,才可以在其它平台打开),这就给爬虫程序造成很 ...

  2. Python自动化爬取App数据

    基本环境配置 版本:Python3 系统:Windows 需要安装: 1.JDK - Download JDK,Appium要求用户必须配置JAVA环境, 否则启动Seesion报错. 很多人学习py ...

  3. Python爬取网站上面的数据很简单,但是如何爬取APP上面的数据呢

  4. 用python爬取app照片

    首先下载一个斗鱼(不下载也可以,url都在这了对吧) 通过抓包,抓取到一个json的数据包,得到下面的地址 观察测试可知,通过修改offset值就是相当于app的翻页 访问这个url,返回得到的是一个 ...

  5. python + 爬虫 + fiddler + 夜神模拟器 爬取app(1)

    抓包 抓包是爬虫里面经常用到的一个词,完整的应该叫做抓取数据请求响应包 ,而Fiddler这款工具就是干这个的 普通https抓包设置 打开Fiddler ------> Options .然后 ...

  6. Python疫情爬取输出到txt文件

    在网上搬了一个代码,现在不适用了,改了改 import requestsimport jsondef Down_data(): url = 'https://view.inews.qq.com/g2/ ...

  7. 爬虫再探实战(五)———爬取APP数据——超级课程表【四】——情感分析

    仔细看的话,会发现之前的词频分析并没有什么卵用...文本分析真正的大哥是NLP,不过,这个坑太大,小白不大敢跳...不过还是忍不住在坑边上往下瞅瞅2333. 言归正传,今天刚了解到boson公司有py ...

  8. 通过mitmproxy爬取APP的数据

    安装: https://mitmproxy.org/ 小米安装证书 设置->系统安全->从存储设备安装->选择*.pem文件 模拟器安装证书 (请从C:\Users\John\.mi ...

  9. Python网络爬虫——Appuim+夜神模拟器爬取得到APP课程数据

    一.背景介绍 随着生产力和经济社会的发展,温饱问题基本解决,人们开始追求更高层次的精神文明,开始愿意为知识和内容付费.从2016年开始,内容付费渐渐成为时尚. 罗辑思维创始人罗振宇全力打造" ...

随机推荐

  1. scala 数据结构(三):元组Tuple

    1 元组Tuple-元组的基本使用 基本介绍 元组也是可以理解为一个容器,可以存放各种相同或不同类型的数据. 说的简单点,就是将多个无关的数据封装为一个整体,称为元组, 最多的特点灵活,对数据没有过多 ...

  2. 数据可视化实例(三): 散点图(pandas,matplotlib,numpy)

    关联 (Correlation) 关联图表用于可视化2个或更多变量之间的关系. 也就是说,一个变量如何相对于另一个变化. 散点图(Scatter plot) 散点图是用于研究两个变量之间关系的经典的和 ...

  3. 【IDEA】创建maven项目,webapp没有被标识,无法识别

    问题描述 新建maven项目模块后,webapp目录未被标识,也就是没有小蓝点的图标显示. 解决方法 点击"File"下的"Project Strucure", ...

  4. 一张PDF了解JDK10 GC调优秘籍-附PDF下载

    目录 简介 Java参数类型 Large Pages JIT调优 总结 简介 今天我们讲讲JDK10中的JVM GC调优参数,JDK10中JVM的参数总共有1957个,其中正式的参数有658个. 其实 ...

  5. bzoj3378[Usaco2004 Open]MooFest 狂欢节*

    bzoj3378[Usaco2004 Open]MooFest 狂欢节 题意: n只奶牛,第i只听力为vi,坐标为xi,两只奶牛聊天时音量是max(vi,vj)*abs(xi-xj).求n(n-1)/ ...

  6. bzoj2023[Usaco2005 Nov]Ant Counting 数蚂蚁*&&bzoj1630[Usaco2007 Demo]Ant Counting*

    bzoj2023[Usaco2005 Nov]Ant Counting 数蚂蚁&&bzoj1630[Usaco2007 Demo]Ant Counting 题意: t个族群,每个族群有 ...

  7. OSCP Learning Notes - Information Gathering

    Common Tools Google Exploit-DB/Google Hacking DB WHOIS Netcraft theharvester Example: Google search: ...

  8. C++ 简单介绍线段树

    题目描述 如题,已知一个数列,你需要进行下面两种操作: 将某区间每一个数加上k. 求出某区间每一个数的和. 输入格式 第一行包含两个整数n,m分别表示该数列数字的个数和操作的总个数. 第二行包含n个用 ...

  9. go : 连接数据库并插入数据

      package main import ( "database/sql" "fmt" "log" "net/http" ...

  10. 30个Linux Shell脚本经典案例(上)

    编写Shell过程中注意事项: 开头加解释器:#!/bin/bash 语法缩进,使用四个空格:多加注释说明. 命名建议规则:变量名大写.局部变量小写,函数名小写,名字体现出实际作用. 默认变量是全局的 ...