Python爬取疫情数据并生成地图

Python爬取疫情数据并生成地图

这是我学习Python数据爬取的记录,我们可以一起交流哈!多多指教!
在开始之前需要注意的地方:
大家可以参照此链接视频进行学习:视频讲解
疫情数据网站是:数据网址
下图展示了数据和如何查看数据:
如何查看数据点击鼠标右键,然后点击检查,注意这里要使用Chrome浏览器,这个浏览器提供了此功能

在这里插入图片描述
我们来看一下数据:我们点击Network,可能需要加载可以点击Ctrl+R进行加载,然后点击All,我们可以在左侧Name中找到ranklist,从图中可以看到data中的数据是我们要找的数据
数据
接下来我们就要找我们要爬取数据的网址:
从图中选中ranklist之后,点击XHR,然后点击下面的Header之后,我们可以看到Request URL和Request Method,也就是我们代码中的目标网站以及请求资源
数据网址
这里展示一个其他疫情数据的网站:
从图中我们可以看出,Name中没有我们所需要的ranklist,所以我们选择网站也需要选对才可以,不能随意找一个疫情网站
其它网站

1. 运行环境

       pycharm

2. 项目步骤
2.1 导入模块

2.2.1 模块的导入

如果pycharm提示没有此模块,我们可以进行模块的安装,步骤:File->Settings->Project->Project Interpreter->点击加号输入我们要安装的模块进行安装

import requests
import json
import jsonpath
from pyecharts.charts import Map,Geo
from pyecharts import options as opts
from pyecharts.globals import GeoType,RenderType

2.2 数据的获取以及处理

#1.目标网站
url = 'https://api.inews.qq.com/newsqa/v1/automation/foreign/country/ranklist'

#2.请求资源,获取响应内容,要的是数据,通过requests第三方工具发送请求
resp = requests.post(url)

#3.获取数据
# 类型转换 将json字符串转为字典
data=json.loads(resp.text)      # data的类型:class dict
name = jsonpath.jsonpath(data,"$..name")   #$表示根目录 ..是任意位置
#name打印出来的是所有国家的名称,所以相应的我们可以分别获取确诊人数,死亡人数等
confirm=jsonpath.jsonpath(data,"$..confirm")
# confirm打印出来的是所有国家确诊的人数

# 数据处理
data_list=list(zip(name,confirm))
#data_list打印出来是:[('美国', 30853032), ('巴西', 12404414), ('印度', 11908910),.......],即将上面的name和confirm一一对应起来

# 4.保存数据(可选)
# 可视化  matplotlib 和 pyecharts
# 这里有个问题就是国外的国家名都是英文,所以这里要引入一个国家名中英文对应的字典
nameMap = {
    'Singapore Rep.': '新加坡',
    'Dominican Rep.': '多米尼加',
    'Palestine': '巴勒斯坦',
    'Bahamas': '巴哈马',
    'Timor-Leste': '东帝汶',
    'Afghanistan': '阿富汗',
    'Guinea-Bissau': '几内亚比绍',
    "Côte d'Ivoire": '科特迪瓦',
    'Siachen Glacier': '锡亚琴冰川',
    "Br. Indian Ocean Ter.": '英属印度洋领土',
    'Angola': '安哥拉',
    'Albania': '阿尔巴尼亚',
    'United Arab Emirates': '阿联酋',
    'Argentina': '阿根廷',
    'Armenia': '亚美尼亚',
    'French Southern and Antarctic Lands': '法属南半球和南极领地',
    'Australia': '澳大利亚',
    'Austria': '奥地利',
    'Azerbaijan': '阿塞拜疆',
    'Burundi': '布隆迪',
    'Belgium': '比利时',
    'Benin': '贝宁',
    'Burkina Faso': '布基纳法索',
    'Bangladesh': '孟加拉国',
    'Bulgaria': '保加利亚',
    'The Bahamas': '巴哈马',
    'Bosnia and Herz.': '波斯尼亚和黑塞哥维那',
    'Belarus': '白俄罗斯',
    'Belize': '伯利兹',
    'Bermuda': '百慕大',
    'Bolivia': '玻利维亚',
    'Brazil': '巴西',
    'Brunei': '文莱',
    'Bhutan': '不丹',
    'Botswana': '博茨瓦纳',
    'Central African Rep.': '中非共和国',
    'Canada': '加拿大',
    'Switzerland': '瑞士',
    'Chile': '智利',
    'China': '中国',
    'Ivory Coast': '象牙海岸',
    'Cameroon': '喀麦隆',
    'Dem. Rep. Congo': '刚果(金)',
    'Congo': '刚果(布)',
    'Colombia': '哥伦比亚',
    'Costa Rica': '哥斯达黎加',
    'Cuba': '古巴',
    'N. Cyprus': '北塞浦路斯',
    'Cyprus': '塞浦路斯',
    'Czech Rep.': '捷克',
    'Germany': '德国',
    'Djibouti': '吉布提',
    'Denmark': '丹麦',
    'Algeria': '阿尔及利亚',
    'Ecuador': '厄瓜多尔',
    'Egypt': '埃及',
    'Eritrea': '厄立特里亚',
    'Spain': '西班牙',
    'Estonia': '爱沙尼亚',
    'Ethiopia': '埃塞俄比亚',
    'Finland': '芬兰',
    'Fiji': '斐',
    'Falkland Islands': '福克兰群岛',
    'France': '法国',
    'Gabon': '加蓬',
    'United Kingdom': '英国',
    'Georgia': '格鲁吉亚',
    'Ghana': '加纳',
    'Guinea': '几内亚',
    'Gambia': '冈比亚',
    'Guinea Bissau': '几内亚比绍',
    'Eq. Guinea': '赤道几内亚',
    'Greece': '希腊',
    'Greenland': '格陵兰',
    'Guatemala': '危地马拉',
    'French Guiana': '法属圭亚那',
    'Guyana': '圭亚那',
    'Honduras': '洪都拉斯',
    'Croatia': '克罗地亚',
    'Haiti': '海地',
    'Hungary': '匈牙利',
    'Indonesia': '印度尼西亚',
    'India': '印度',
    'Ireland': '爱尔兰',
    'Iran': '伊朗',
    'Iraq': '伊拉克',
    'Iceland': '冰岛',
    'Israel': '以色列',
    'Italy': '意大利',
    'Jamaica': '牙买加',
    'Jordan': '约旦',
    'Japan': '日本',
    'Japan': '日本本土',
    'Kazakhstan': '哈萨克斯坦',
    'Kenya': '肯尼亚',
    'Kyrgyzstan': '吉尔吉斯斯坦',
    'Cambodia': '柬埔寨',
    'Korea': '韩国',
    'Kosovo': '科索沃',
    'Kuwait': '科威特',
    'Lao PDR': '老挝',
    'Lebanon': '黎巴嫩',
    'Liberia': '利比里亚',
    'Libya': '利比亚',
    'Sri Lanka': '斯里兰卡',
    'Lesotho': '莱索托',
    'Lithuania': '立陶宛',
    'Luxembourg': '卢森堡',
    'Latvia': '拉脱维亚',
    'Morocco': '摩洛哥',
    'Moldova': '摩尔多瓦',
    'Madagascar': '马达加斯加',
    'Mexico': '墨西哥',
    'Macedonia': '马其顿',
    'Mali': '马里',
    'Myanmar': '缅甸',
    'Montenegro': '黑山',
    'Mongolia': '蒙古',
    'Mozambique': '莫桑比克',
    'Mauritania': '毛里塔尼亚',
    'Malawi': '马拉维',
    'Malaysia': '马来西亚',
    'Namibia': '纳米比亚',
    'New Caledonia': '新喀里多尼亚',
    'Niger': '尼日尔',
    'Nigeria': '尼日利亚',
    'Nicaragua': '尼加拉瓜',
    'Netherlands': '荷兰',
    'Norway': '挪威',
    'Nepal': '尼泊尔',
    'New Zealand': '新西兰',
    'Oman': '阿曼',
    'Pakistan': '巴基斯坦',
    'Panama': '巴拿马',
    'Peru': '秘鲁',
    'Philippines': '菲律宾',
    'Papua New Guinea': '巴布亚新几内亚',
    'Poland': '波兰',
    'Puerto Rico': '波多黎各',
    'Dem. Rep. Korea': '朝鲜',
    'Portugal': '葡萄牙',
    'Paraguay': '巴拉圭',
    'Qatar': '卡塔尔',
    'Romania': '罗马尼亚',
    'Russia': '俄罗斯',
    'Rwanda': '卢旺达',
    'W. Sahara': '西撒哈拉',
    'Saudi Arabia': '沙特阿拉伯',
    'Sudan': '苏丹',
    'S. Sudan': '南苏丹',
    'Senegal': '塞内加尔',
    'Solomon Is.': '所罗门群岛',
    'Sierra Leone': '塞拉利昂',
    'El Salvador': '萨尔瓦多',
    'Somaliland': '索马里兰',
    'Somalia': '索马里',
    'Serbia': '塞尔维亚',
    'Suriname': '苏里南',
    'Slovakia': '斯洛伐克',
    'Slovenia': '斯洛文尼亚',
    'Sweden': '瑞典',
    'Swaziland': '斯威士兰',
    'Syria': '叙利亚',
    'Chad': '乍得',
    'Togo': '多哥',
    'Thailand': '泰国',
    'Tajikistan': '塔吉克斯坦',
    'Turkmenistan': '土库曼斯坦',
    'East Timor': '东帝汶',
    'Trinidad and Tobago': '特里尼达和多巴哥',
    'Tunisia': '突尼斯',
    'Turkey': '土耳其',
    'Tanzania': '坦桑尼亚',
    'Uganda': '乌干达',
    'Ukraine': '乌克兰',
    'Uruguay': '乌拉圭',
    'United States': '美国',
    'Uzbekistan': '乌兹别克斯坦',
    'Venezuela': '委内瑞拉',
    'Vietnam': '越南',
    'Vanuatu': '瓦努阿图',
    'West Bank': '西岸',
    'Yemen': '也门',
    'South Africa': '南非',
    'Zambia': '赞比亚',
    'Zimbabwe': '津巴布韦'
}

#可以自己设置地图的大小
map=Map(opts.InitOpts(width='1600px',height='900px')).add(series_name= "世界疫情分布",
              data_pair=data_list,  #将处理之后的数据传入
              maptype="world",   #地图的类型是世界地图
              name_map=nameMap,  #国家名的中英文映射
              is_map_symbol_show=False
)

# 设置系统配置项
map.set_series_opts(label_opts= opts.LabelOpts(is_show=False))  #不显示国家名称,因为显示的话生成的地图会使得国家的名字重叠看不清楚

#设置全局配置域,设置的是地图中的确诊人数可以分阶段显示
map.set_global_opts(title_opts= opts.TitleOpts(title="国外疫情情况"),
                    visualmap_opts=opts.VisualMapOpts(max_=1000000,is_piecewise=True))
map.render('世界疫情分布情况.html')  #会生成html,在浏览器打开为地图

最后结果如下:
在图中可以直观地看出一个国家的国家名和确诊人数:
结果

将确诊人数分了不同的阶段,鼠标在哪个阶段上,地图中会相应的显示满足条件的国家:
阶段
结束

好啦,这就是我所学习到的,欢迎大家批评指正,我们一起学习呀!
小白的Python人生,哈哈哈!
同时如果有机器学习或者深度学习方面的问题,我们也可以交流哦!正在被深度学习折磨!

  • 6
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值