【项目】全国疫情实时追踪——python爬虫+flask+echarts实现(超详细)(一)

简介: 【项目】全国疫情实时追踪——python爬虫+flask+echarts实现(超详细)(一)

首先我们来看看最终成果!!!!

image.png

一. 爬虫爬取数据


①首先我们用python去写一个爬虫脚本去获取一些疫情数据(我用的是腾讯)


首先我们先抓包,找到数据所在的请求链接。

image.png


image.png



我们可以看到这个url就是我们获取数据的链接,我们对这个链接请求然后抓取数据并保存到csv文件中。我们可以看一下代码。


import  requests
import json
import csv
url='https://view.inews.qq.com/g2/getOnsInfo?name=disease_h5&callback=jQuery351007009437517570039_1629632572593&_=1629632572594'
head={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36 Edg/92.0.902.62'
}
response = requests.get(url,headers=head).text
print(response)
dict1 =json.loads(response[42:132060])#这个切片位置是会变化的,需要我们去分析每天变化的位置,然后再去切片
d = json.loads(dict1['data'])#json是转化抓取来的数据格式,json.load是将字符串转化为字典的格式
print(d)
all_dict={}
all_dict['统计时间']=d["lastUpdateTime"]
chinaTotal = d['chinaTotal']
all_dict['累计确诊病例'] = chinaTotal['confirm']
all_dict['现有确诊'] = chinaTotal['nowConfirm']
all_dict['治愈病例'] = chinaTotal['heal']
all_dict['死亡病例'] = chinaTotal['dead']
all_dict['本土昨日新增'] = chinaTotal['suspect']
all_dict['境外输入'] = chinaTotal['importedCase']
all_dict['无症状感染者'] = chinaTotal['noInfect']
print(all_dict)
print(chinaTotal)
with open('yqin.csv','w+',newline='')as f:
    f1= csv.writer(f)
    list1=[]
    f1.writerow(all_dict)
    for i in all_dict:
        list1.append(all_dict[i])
    f1.writerow(list1)
# print(chinaTotal)
area = d['areaTree'][0]
# for i in area:
#     print(area[i])
children = area['children']
with open('yq1.csv','w+',newline = '')as f:
    list1= ['省份','现有病例','昨日新增','累计病例','死亡人数','治愈人数']
    f1 = csv.writer(f)
    f1.writerow(list1)
    for i , index,in enumerate(children):
        cc = children[i]
        dd = []
        dd.append(cc['name'])
        dd.append(cc['total']['nowConfirm'])
        dd.append(cc['today']['confirm'])
        dd.append(cc['total']['confirm'])
        dd.append(cc['total']['dead'])
        dd.append(cc['total']['heal'])
        f1.writerow(dd)
        print(dd)

image.png


image.png


这个数据就是我们但时候需要传到前端的数据,我们每天更新一下就可以!


二.


数据的爬取我们写完了,我们开始先构建html得界面,我在给大家推荐一个前端软件

image.png



这个官网下载就可以,免费使用,写html是比较方便的。

image.png

一共做了九个模块,大家可以看本文章得第一个图,看看是不是九个模块,这些就是涉及到前端的基础知识了,如果有前端不熟的小伙伴可以去先把基础学好,然后在来仔细看这个,也可以找我讨论哦。


标题有了,接下来我们要用css去把这些模块分在不同的位置。


大家需要创建一个css文件哦,然后在html导入。


image.png


接下来我直接在代码里面给大家讲解了。


话不多说,上代码。


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>疫情监控</title>
    <script src='../static/js/jq.js'></script>
  <script type='text/javascript' src='../static/js/echarts.min1.js'></script>
  <script type='text/javascript' src='../static/js/china.js'></script>
    <link href="../static/css/main.css" rel="stylesheet"/>
</head>
<body >
<div id="title">全国疫情实时追踪</div>
<div id="time"  style="color:#5b4c00;">时间</div>
<div id="zuo1">我是标题左一</div>
<div id="zuo2">我是标题左二</div>
<div id="ls">lishi</div>
<div id="z1" style="color: black;" >
    <div class="num" style="color: #FFD700;"><h1>123</h1></div>
    <div class="num" style="color: #008000;"><h1>123</h1></div>
    <div class="num" style="color: #FF0000;"><h1>123</h1></div>
    <div class="num" style="color: #FFFFFF;"><h1>123</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="z2">我是标题中二</div>
<div id="y1">我是标题右一</div>
<div id="y2">我是标题右二</div>
<iframe id="ls" scrolling="no" frameborder="0" allowtransparency="true" src="https://tenapi.cn/lishi/"></iframe>
<iframe id="y1" scrolling="no" frameborder="0" allowtransparency="true" src="http://i.tianqi.com/index.php?c=code&id=36&icon=5&num=5"></iframe>
<!-- <iframe id="y1" scrolling="no" src="https://tianqiapi.com/api.php?style=tt&skin=pitaya" frameborder="0" allowtransparency="true"></iframe> -->
<script type="text/javascript">
  var chartDom = document.getElementById('y2');
  var myChart = echarts.init(chartDom);
  var option;
  var dataAxis = {{data2[0]|tojson}}
  // 这个地方就是传后端的数据给这个图形的数据
  var data = {{data2[1]|tojson}}
  var yMax = 500;
  var dataShadow = [];
  for (var i = 0; i < data.length; i++) {
     dataShadow.push(yMax);
  }
  option = {
  backgroundColor:'#47c6e9',
     title: {
         text: '疫情柱状图',
         subtext: '点击缩放'
     },
     xAxis: {
         data: dataAxis,
         axisLabel: {
             inside: true,
             textStyle: {
                 color: '#fff'
             }
         },
         axisTick: {
             show: false
         },
         axisLine: {
             show: false
         },
         z: 10
     },
     yAxis: {
         axisLine: {
             show: false
         },
         axisTick: {
             show: false
         },
         axisLabel: {
             textStyle: {
                 color: '#999'
             }
         }
     },
     dataZoom: [
         {
             type: 'inside'
         }
     ],
     series: [
         {
             type: 'bar',
             showBackground: true,
             itemStyle: {
                 color: new echarts.graphic.LinearGradient(
                     0, 0, 0, 1,
                     [
                         {offset: 0, color: '#f6f68f'},
                         {offset: 0.5, color: '#f0ea35'},
                         {offset: 1, color: '#edf02e'}
                     ]
                 )
             },
             emphasis: {
                 itemStyle: {
                     color: new echarts.graphic.LinearGradient(
                         0, 0, 0, 1,
                         [
                             {offset: 0, color: '#2378f7'},
                             {offset: 0.7, color: '#2378f7'},
                             {offset: 1, color: '#83bff6'}
                         ]
                     )
                 }
             },
             data: data
         }
     ]
  };
  // Enable data zoom when user click bar.
  var zoomSize = 6;
  myChart.on('click', function (params) {
     console.log(dataAxis[Math.max(params.dataIndex - zoomSize / 2, 0)]);
     myChart.dispatchAction({
         type: 'dataZoom',
         startValue: dataAxis[Math.max(params.dataIndex - zoomSize / 2, 0)],
         endValue: dataAxis[Math.min(params.dataIndex + zoomSize / 2, data.length - 1)]
     });
  });
  option && myChart.setOption(option);
</script>
<script type="text/javascript">
var chartDom = document.getElementById('zuo2');
var myChart = echarts.init(chartDom);
var option;
option = {
    backgroundColor:'#47c6e9',
    title: {
        text: '中国每百人接种疫苗剂数'
    },
    tooltip: {
        trigger: 'axis'
    },
    xAxis: {
        type: 'category',
        data :{{data3[0]|tojson}}
    },
    yAxis: {
        type: 'value'
    },
    series: [{
        data :{{data3[2]|tojson}},
        type: 'line',
        smooth: true
    }]
};
option && myChart.setOption(option);
</script>
<script type="text/jscript">
var chartDom = document.getElementById('zuo1');
var myChart = echarts.init(chartDom);
var option;
option = {
    backgroundColor:'#47c6e9',
    title: {
        text: '中国累计接种疫苗',
        subtext: '数据来自网络'
    },
    tooltip: {
        trigger: 'axis',
        axisPointer: {
            type: 'shadow'
        }
    },
    legend: {
        data: ['2021年']
    },
    grid: {
        left: '3%',
        right: '4%',
        bottom: '3%',
        containLabel: true
    },
    xAxis: {
        type: 'value',
        boundaryGap: [0, 0.01]
    },
    yAxis: {
        type: 'category',
  data : {{data3[0]|tojson}}
    },
    series: [
        {
            name: '2021年',
            type: 'bar',
    data : {{data3[1]|tojson}}
        },
    ]
};
option && myChart.setOption(option);
</script>
<script type="text/javascript" ">
var map = echarts.init(document.getElementById('z2'));//初始化
var COLORS = ["#ffffff", "#faebd2", "#e9a188", "#d56355", "#bb3937", "#772526", "#480f10"];//图例里的颜色
var date =new Date();
var dataList={{data|tojson}};
var option={//配置项(名称)
    tooltip: {//提示框组件
      formatter:function(params,ticket, callback){//提示框浮层内容格式器,支持字符串模板和回调函数两种形式。
        return params.seriesName+'<br />'+params.name+':'+params.value
      }//数据格式化
      },
    backgroundColor:'#47c6e9',//背景色
    visualMap: {//visualMap 是视觉映射组件,用于进行『视觉编码』,也就是将数据映射到视觉元素(视觉通道)。
      type: 'piecewise',//分段型视觉映射组件
      orient: 'horizontal',//方向
      left: 'left',//位置
      top: 'bottom',//位置
      pieces: [{//自定义『分段式视觉映射组件』的每一段的范围,以及每一段的文字,以及每一段的特别的样式。
      value: 0, color: COLORS[0]
      }, {
      min: 1, max: 9, color: COLORS[1]
      }, {
      min: 10, max: 99, color: COLORS[2]
      }, {
      min: 100, max: 499, color: COLORS[3]
      }, {
      min: 500, max: 999, color: COLORS[4]
      }, {
      min: 1000, max: 10000, color: COLORS[5]
      }, {
      min: 10000, color: COLORS[6]
      }],
      inRange: {
      color:COLORS //取值范围的颜色
      },
      show:true//图注
    },
    geo: {//地理坐标系组件用于地图的绘制
      map: 'china',
      roam: false,//不开启缩放和平移
      zoom:1.23,//视角缩放比例
      label: {
      normal: {
        show: true,
        fontSize:'10',
        color: 'rgba(0,0,0,0.7)'
      }
      },
      itemStyle: {
      normal:{
        borderColor: 'rgba(0, 0, 0, 0.2)'
      },
      emphasis:{
        areaColor: '#F3B329',//鼠标选择区域颜色
        shadowOffsetX: 0,
        shadowOffsetY: 0,
        shadowBlur: 20,
        borderWidth: 0,
        shadowColor: 'rgba(0, 0, 0, 0.5)'
      }
      }
    },
    series : [//系列列表。(图表)
      {
      name: '确诊人数',
      type: 'map',//图表类型
      geoIndex: 0,
      data:dataList//图表的数据
      }
    ]
    }
    map.setOption(option);//用配置项配置(动词)echarts
</script>
<script src="../static/js/get_data.js"></script>
<script>#这是ajax调用后端得一个时间函数,等下面有介绍这个时间函数
    function get_time(){
  var date =new Date();
    $.ajax({
    url:'/time',
    timeout:1000,
    success:function(data){
    $('#time').html(data)
    },
    error:function(xhr,type,errorThrown){}
    });
    }
    setInterval(get_time,10000)
  setInterval(get_data,10000)
  setInterval(get_data1,10000)
</script>
</body>
</html>
目录
相关文章
|
20天前
|
数据采集 存储 XML
Python爬虫:深入探索1688关键词接口获取之道
在数字化经济中,数据尤其在电商领域的价值日益凸显。1688作为中国领先的B2B平台,其关键词接口对商家至关重要。本文介绍如何通过Python爬虫技术,合法合规地获取1688关键词接口,助力商家洞察市场趋势,优化营销策略。
|
1月前
|
数据采集 Web App开发 监控
高效爬取B站评论:Python爬虫的最佳实践
高效爬取B站评论:Python爬虫的最佳实践
|
1月前
|
数据采集 缓存 定位技术
网络延迟对Python爬虫速度的影响分析
网络延迟对Python爬虫速度的影响分析
|
5天前
|
数据采集 JSON API
如何利用Python爬虫淘宝商品详情高级版(item_get_pro)API接口及返回值解析说明
本文介绍了如何利用Python爬虫技术调用淘宝商品详情高级版API接口(item_get_pro),获取商品的详细信息,包括标题、价格、销量等。文章涵盖了环境准备、API权限申请、请求构建和返回值解析等内容,强调了数据获取的合规性和安全性。
|
10天前
|
数据采集 存储 API
利用Python爬虫获取1688关键词接口全攻略
本文介绍如何使用Python爬虫技术合法合规地获取1688关键词接口数据,包括环境准备、注册1688开发者账号、获取Access Token、构建请求URL、发送API请求、解析HTML及数据处理存储等步骤,强调遵守法律法规和合理使用爬虫技术的重要性。
|
17天前
|
数据采集 JSON 开发者
Python爬虫京东商品详情数据接口
京东商品详情数据接口(JD.item_get)提供商品标题、价格、品牌、规格、图片等详细信息,适用于电商数据分析、竞品分析等。开发者需先注册账号、创建应用并申请接口权限,使用时需遵循相关规则,注意数据更新频率和错误处理。示例代码展示了如何通过 Python 调用此接口并处理返回的 JSON 数据。
|
22天前
|
XML 数据采集 数据格式
Python 爬虫必备杀器,xpath 解析 HTML
【11月更文挑战第17天】XPath 是一种用于在 XML 和 HTML 文档中定位节点的语言,通过路径表达式选取节点或节点集。它不仅适用于 XML,也广泛应用于 HTML 解析。基本语法包括标签名、属性、层级关系等的选择,如 `//p` 选择所有段落标签,`//a[@href=&#39;example.com&#39;]` 选择特定链接。在 Python 中,常用 lxml 库结合 XPath 进行网页数据抓取,支持高效解析与复杂信息提取。高级技巧涵盖轴的使用和函数应用,如 `contains()` 用于模糊匹配。
|
24天前
|
数据采集 XML 存储
构建高效的Python网络爬虫:从入门到实践
本文旨在通过深入浅出的方式,引导读者从零开始构建一个高效的Python网络爬虫。我们将探索爬虫的基本原理、核心组件以及如何利用Python的强大库进行数据抓取和处理。文章不仅提供理论指导,还结合实战案例,让读者能够快速掌握爬虫技术,并应用于实际项目中。无论你是编程新手还是有一定基础的开发者,都能在这篇文章中找到有价值的内容。
|
23天前
|
数据采集 JavaScript 前端开发
Python爬虫能处理动态加载的内容吗?
Python爬虫可处理动态加载内容,主要方法包括:使用Selenium模拟浏览器行为;分析网络请求,直接请求API获取数据;利用Pyppeteer控制无头Chrome。这些方法各有优势,适用于不同场景。
|
26天前
|
存储 数据可视化 数据挖掘
Python数据分析项目:抖音短视频达人粉丝增长趋势
Python数据分析项目:抖音短视频达人粉丝增长趋势
下一篇
DataWorks