Django+Ercharts+Python爬虫 绘制中国疫情地图

 

 

1、获取数据

地址:https://voice.baidu.com/act/newpneumonia/newpneumonia

 通过python来获取数据

import requests
from lxml import etree
import json
import openpyxl

#爬虫
url = 'https://voice.baidu.com/act/newpneumonia/newpneumonia'
headers = {
    "User-Agent": "自己的user-agent"
}

response = requests.get(url=url,headers=headers).text
#在使用xpath的时候要用树形态
html = etree.HTML(response)
#用xpath来获取之前找到的页面json数据 
json_text = html.xpath('//script[@type="application/json"]/text()')
json_text = json_text[0]
# print(json_text)

解析json数据:

#用python本地自带的库转换一下json数据
result = json.loads(json_text)
# print(result)

#通过打印出转换的对象我们可以看到我们要的数据都要key为component对应的值之下  
所以现在我们将值拿出来
result = result["component"]
# 再次打印看看结果
# print(result)

# 获取国内当前数据
result = result[0]['caseList']
# print(result)

将获取到的数据保存到excel中

# 创建工作簿
wb = openpyxl.Workbook()
# 创建工作表
ws = wb.active
# 设置表的标题
ws.title = "国内疫情"
# 写入表头
ws.append(["省份","累计确诊","死亡","治愈"])
#获取各省份的数据并写入
for line in result:
    line_name = [line["area"],line["confirmed"],line["died"],line["crued"]]
    for ele in line_name:
        if ele == '':
            ele = 0
    ws.append(line_name)
#保存到excel中
wb.save('./china.xlsx')

查看获取到的数据

 2、数据可视化

在django里面创建app--->demo

在demo.views.py里面编写视图函数,将数据传到前端

def map(request):
    # 设置列对齐
    pd.set_option('display.unicode.ambiguous_as_wide', True)
    pd.set_option('display.unicode.east_asian_width', True)
    # 打开文件
    df = pd.read_excel('./china.xlsx')
    # 对省份进行统计
    data2 = df['省份']
    data2_list = list(data2)
    data3 = df['累计确诊']
    data3_list = list(data3)
    data4 = df['死亡']
    data4_list = list(data4)
    data5 = df['治愈']
    data5_list = list(data5)
    lists = [list (a) for a in zip(data2,data3)]
    print(lists)
    keys = ['name','value']
    list_joson = [dict(zip(keys,item)) for item in lists]
    str_json = json.dumps(list_joson,indent=2,ensure_ascii=False)
    print(str_json)
    context = {"datas":str_json}
    return render(request, 'test2.html', context)

配置urls

    url(r'^demo/test2',demo.views.map),

编写html,用ercharts绘制中国疫情地图

并设置,点击某个省份的小图标,则可跳转到具体的省份地图,双击则退回全国地图。

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=EDGE">
<title>HTML5 Canvas实现中国地图DEMO演示</title>

<style>
#china-map {
  width: 1000px;
  height: 1000px;
  margin: auto;
}
#box{
	display:none;
	background-color: goldenrod;
	width: 180px;
	height: 30px;
}
#box-title{
	display:block;
}
</style>

<script type="text/javascript" src="/static/js/jquery.min.js"></script>
<script type="text/javascript" src="/static/js/echarts.min.js"></script>
<script type="text/javascript" src="/static/js/map/china.js"></script>

</head>
<body>
<div style="text-align:center;clear:both;">
<script src="/gg_bd_ad_720x90.js" type="text/javascript"></script>
<script src="/follow.js" type="text/javascript"></script>
</div>
<button id="back">返回全国</button>
<div id="china-map"></div>

<script>
	var myChart = echarts.init(document.getElementById('china-map'));
    var oBack = document.getElementById("back");

    var provinces = ['shanghai', 'hebei', 'shanxi', 'neimenggu', 'liaoning', 'jilin', 'heilongjiang', 'jiangsu', 'zhejiang', 'anhui', 'fujian', 'jiangxi', 'shandong', 'henan', 'hubei', 'hunan', 'guangdong', 'guangxi', 'hainan', 'sichuan', 'guizhou', 'yunnan', 'xizang', 'shanxi1', 'gansu', 'qinghai', 'ningxia', 'xinjiang', 'beijing', 'tianjin', 'chongqing', 'xianggang', 'aomen'];

    var provincesText = ['上海', '河北', '山西', '内蒙古', '辽宁', '吉林', '黑龙江', '江苏', '浙江', '安徽', '福建', '江西', '山东', '河南', '湖北', '湖南', '广东', '广西', '海南', '四川', '贵州', '云南', '西藏', '陕西', '甘肃', '青海', '宁夏', '新疆', '北京', '天津', '重庆', '香港', '澳门'];
    var lists = {{ datas|safe }};
    var seriesData = lists;
    var convertData = function (data) {
    var res = [];
    for (var i = 0; i < data.length; i++) {
        var geoCoord = geoCoordMap[data[i].name];
        if (geoCoord) {
            res.push({
                name: data[i].name,
                value: geoCoord.concat(data[i].value)
            });
        }
    }
    return res;
};

    oBack.onclick = function () {
      initEcharts("china", "中国");
    };

    initEcharts("china", "中国");

    // 初始化echarts
    function initEcharts(pName, Chinese_) {
      var tmpSeriesData = pName === "china" ? seriesData : [];


      var option = {
        title: {
          text: Chinese_ || pName,
          left: 'center'
        },

          tooltip: {
              trigger: 'item',
              formatter: '{b}<br/>{c} 人次'
          },

           visualMap: {
                type: 'piecewise',
                   pieces: [
                       {min: 1000, max: 1000000, label: '累计确诊大于等于1000人', color: '#372a28'},
                       {min: 500, max: 999, label: '累计确诊500-999人', color: '#4e160f'},
                       {min: 100, max: 499, label: '累计确诊100-499人', color: '#974236'},
                       {min: 10, max: 99, label: '累计确诊10-99人', color: '#ee7263'},
                       {min: 1, max: 9, label: '累计确诊1-9人', color: '#f5bba7'},
                   ],
                   color: ['#E0022B', '#E09107', '#A3E00B'],
               left:"10%",                              //组件离容器左侧的距离,'left', 'center', 'right','20%'
               top:"auto",                                   //组件离容器上侧的距离,'top', 'middle', 'bottom','20%'
               right:"20%",                               //组件离容器右侧的距离,'20%'
               bottom:"35%",                              //组件离容器下侧的距离,'20%'
               orient:"vertical",                        //图例排列方向
               padding:5,
               },
          toolbox: {
            show: true,
              orient: 'vertical',
              left: 'right',
              top: 'center',
              feature: {
                mark: { show: true },
                  dataView: { show: true, readOnly: false },
                  restore: { show: true },
                  saveAsImage: { show: true }
        }
      },
          roamController: {
            show: true,
              left: 'left',
              mapTypeControl: {
                'china': true
        }
      },
        series: [
          {
            name: Chinese_ || pName,
            type: 'map',
            mapType: pName,
            roam: false,//是否开启鼠标缩放和平移漫游
            data: tmpSeriesData,
            top: "3%",//组件距离容器的距离
              zoom:1.1,
              selectedMode : 'single',

              label: {
                  normal: {
                      show: true,//显示省份标签
                      textStyle:{color:"#fbfdfe"}//省份标签字体颜色
                  },
                  emphasis: {//对应的鼠标悬浮效果
                      show: true,
                      textStyle:{color:"#323232"}
                  }
              },


              itemStyle: {
                  normal: {
                      borderWidth: .5,//区域边框宽度
                      borderColor:'#4ea397' ,//区域边框颜色
                      areaColor:'skyblue',//区域颜色

                  },

                  emphasis: {
                      borderWidth: .5,
                      borderColor: '#4b0082',
                      areaColor:"#ece39e",
                  }
              },
          }
        ]

           };

      myChart.setOption(option);

      myChart.off("click");

      if (pName === "china") { // 全国时,添加click 进入省级
        myChart.on('click', function (param) {
          console.log(param.name);
          // 遍历取到provincesText 中的下标  去拿到对应的省js
          for (var i = 0; i < provincesText.length; i++) {
            if (param.name === provincesText[i]) {
              //显示对应省份的方法
              showProvince(provinces[i], provincesText[i]);
              break;
            }
          }
            if (param.componentType === 'series') {
                var provinceName =param.name;
                $('#box').css('display','block');
                $("#box-title").html(provinceName);

            }
        });
      } else { // 省份,添加双击 回退到全国
        myChart.on("dblclick", function () {
          initEcharts("china", "中国");
        });
      }
    }

     // 展示对应的省
    function showProvince(pName, Chinese_) {
        if(Chinese_){
           //这写省份的js都是通过在线构建工具生成的,保存在本地,需要时加载使用即可,最好不要一开始全部直接引入。
      loadBdScript('$' + pName + 'JS', '/static/js/map/province/' + pName + '.js', function () {
        initEcharts(Chinese_);
      });
    }

    // 加载对应的JS
    function loadBdScript(scriptId, url, callback) {
      var script = document.createElement("script");
      script.type = "text/javascript";
      if (script.readyState) {  //IE
        script.onreadystatechange = function () {
          if (script.readyState === "loaded" || script.readyState === "complete") {
            script.onreadystatechange = null;
            callback();
          }
        };
      } else {  // Others
        script.onload = function () {
          callback();
        };
      }
      script.src = url;
      script.id = scriptId;
      document.getElementsByTagName("head")[0].appendChild(script);
    };
</script>

</body>
</html>
  • 27
    点赞
  • 161
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
解锁网络数据的宝藏:Python爬虫工具与教程集合 一、探索网络信息的无限宝藏 在互联网的海洋中,蕴藏着海量的有价值信息。如何合法、高效地获取这些信息?Python爬虫工具与教程为您揭开这一神秘面纱。通过这些资源,您可以轻松地爬取网站信息,提取所需内容,为各种应用场景提供强大的数据支持。 二、资源亮点 工具齐全:提供一系列功能强大的Python爬虫工具,满足您不同场景下的需求。 教程详尽:配套的Python爬虫教程,从基础到进阶,让您逐步掌握爬虫的核心技术。 合法合规:严格遵守法律法规和网站使用协议,确保采集行为合法,尊重网站权益。 实战项目:结合实际案例,让您在实践中掌握Python爬虫的运用,真正到学以致用。 三、适用人群 无论您是数据分析师、网络开发者还是对Python爬虫感兴趣的爱好者,这些资源都将为您的学习和实践提供有力的支持。 四、使用建议 按需选择工具与教程:根据实际需求选择合适的工具和教程,确保学习与实践的有效性。 遵守法律法规与协议:在使用这些资源进行爬取活动时,务必遵守相关法律法规和网站的使用协议。 持续学习与更新:随着网络技术的不断进步,Python爬虫技术也在不断发展。建议您持续关注相关动态,提升自己的技能水平。 五、安全与责任 尊重网站权益:避免对目标网站的正常运行造成干扰或损害,合理使用资源。 隐私保护:在采集数据时,严格遵守隐私保护法规,不泄露或滥用用户个人信息。 风险防范:了解并应对潜在的网络威胁,采取相应措施降低风险。 感谢您选择我们的Python爬虫工具与教程集合!让我们一起挖掘网络信息的宝藏,为您的工作和研究注入新的活力!请务必遵守法律法规和网站使用协议,共同维护网络数据的合法采集与利用。
### 回答1: MySQL是一种关系型数据库管理系统,是许多Web应用程序的基础。它可以用来存储和管理数据,特别是当应用程序需要支持大量用户和数据时。 Django是一个高效的Web框架,它使用Python语言编写。它可以帮助开发人员创建功能齐全的Web应用程序,包括处理数据库信息。Django提供了对MySQL的良好支持,可以让开发人员轻松地将应用程序与MySQL集成。 Python是一种高级编程语言,其简洁的语法使它成为开发人员的首选语言之一。Python支持许多数据库管理系统,包括MySQL。由于Python语言的易学性和广泛应用性,许多开发人员选择使用Python来构建音乐应用程序。 音乐应用程序需要处理大量的数据和复杂的关系,例如艺术家、歌曲、专辑和播放列表之间的关系。使用MySQL和Django,开发人员可以快速创建并管理这些数据。同时,Python的丰富的数据分析工具和可视化库可以帮助开发人员以更直观的方式展示音乐数据。 总之,MySQL、DjangoPython可以组合成一种强大的技术堆栈,用于构建高效、高性能和易于使用的音乐应用程序。它们提供了一个强大的工具集,可以处理大量音乐数据并分析和展示这些数据,同时保持应用程序的稳定性和可靠性。 ### 回答2: MySQL是一种关系型数据库管理系统,可以用于存储音乐数据,比如专辑、歌曲、歌词等信息。Django是一种基于Python语言的Web应用程序框架,可以用于开发音乐网站,利用MySQL存储音乐数据,并展示页面。 Python语言在音乐领域也有广泛的应用,可以通过Python编写音乐处理代码、生成音乐、数据分析等。比如,Python中的music21库可以进行音符、和弦、键等音乐元素的处理,而MIDIUtil库可以生成MIDI文件。 综上,MySQL、DjangoPython可以联合使用来创建一个完整的音乐网站。在网站上,用户可以上传自己的音乐作品,浏览他人的音乐,搜索他们感兴趣的音乐并进行购买。开发者可以通过Python来对音乐数据进行处理和分析,以提升网站的用户体验和推荐系统的准确性。 ### 回答3: MySQL是一个流行的开放源代码的关系型数据库管理系统,用于存储和管理数据。Django是一个高级Python Web框架,它使用了很多原生Python的功能,并提供了一个简单的API来连接MySQL。Python是一种高级编程语言,可以方便地处理各种数据,包括音乐数据。因此,我们可以使用MySQL和Django框架来创建一个功能强大的音乐数据库,然后使用Python来管理和处理音乐数据。 使用MySQL和Django框架创建一个音乐数据库可以包括以下步骤:首先,我们可以创建一个包含所有歌曲和艺术家信息的数据库表,例如:歌曲名称、专辑名称、艺术家名称、发行日期、音乐类型等。接着,我们可以在Django框架中创建模型类来映射数据库表,例如:Song、Album、Artist等类。通过使用Django提供的数据库API,我们可以从MySQL数据库中查询、插入、更新和删除数据。最后,我们可以使用Python来处理音乐数据,例如:创建播放列表、搜索歌曲、音乐推荐等操作。 总之,MySQL、DjangoPython都是非常强大和灵活的工具,它们可以帮助我们创建一个高效和易于管理的音乐数据库。通过合理地组合和使用这些工具,我们可以实现更多更复杂的音乐应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值