????????利用网络爬虫获取了最新的世界以及中国的疫情数据,实现新冠病毒疫情数据可视化地图。
1.库的准备
? ? ? ? 在这里先将pycharm编辑器配置好Anaconda,这样就可以满足大部分的库的使用了。
?但是我们将用到的pyecharts库还是需要自己下载的。
在准备用爬虫进行最新疫情数据的呈现后,了解了pyecharts,matplotlib、seaborn、plotly这几个绘图工具,决定使用pyecharts。
Echarts是一个由百度开源的数据可视化工具,凭借着良好的交互性,精巧的图表设计,得到了众多开发者的认可。而python是一门富有表达力的语言,很适合用于数据处理。当数据分析遇上了数据可视化时,pyecharts诞生了。
pyecharts的下载?
?2.获取数据
????????打开Chrome在网页右击选择“检查”,点开network,刷新页面,点击各个请求,找到数据所在url,并复制,再进过#post方式请求语句response =requests.post(url=url)。得到的就是直接获得requests的post请求的数据。
????????其中URL是Internet上描述信息资源的字符串,主要用在各种WWW客户程序和服务器程序上。采用URL可以用一种统一的格式来描述各种信息资源,包括文件、服务器的地址和目录等。url:统一资源定位符。主要作用:用来定位互联网上的任意资源的位置。
????????
?????????可以看到效果,获取到了我们想要的首页数据,如果我们查看这个网页的源码,就可以更加清楚的认知见图7,可以看到此时不同国家的数据内容,我们获取的内容和网页源码的联系,其实就是网页源码的内容。
现在得到了内容,下一步就是准备对数据的处理,筛选出我们需要的内容。
3.代码块的解释
向url发送请求爬虫代码块1
这是两种方法的使得到的post请求变成json格式。
?地图语句代码块2
?在两个代码中实现地图绘制的语句。这一步虽说是制作地图,其实不然,地图的制作早就被pyecharts的开发人员给做好了,我只需要调用它即可,然后再给它附上数据,这就成为了这功能独有的地图。
?存储数据代码块3
?数据处理部分,zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。要使用list解包print(list(data_list)),储存数据。
?视觉映射配置项代码块4
?都是用visualmap_opts进行视觉映射配置项,包括指定 visualMapPiecewise 组件的最小值,是否显示视觉映射配置,内边距等等作用。
关于Echarts中visualMap组件详解:
视觉映射组件,用于进行『视觉编码』,也就是将数据映射到视觉元素。视觉元素可以是:symbol: 图元的图形类别。symbolSize: 图元的大小。color: 图元的颜色。
4.运行效果
?
会出现下图这样的网页
?点开这个网页如下图在右上角选择适当的浏览器打开,就会得到爬虫的地图。
?
截止我写这篇文章是爬虫的时间为最新的数据(左上角表明爬取数据的时间为2022.10.27)
鼠标滑到任意一个省份会有该省份的确诊数据。
5.总结(大家写报告的时候可以自取)
????????在进行疫情的可视化处理中,一开始在网上看相关的资料还是觉得一头雾水,通过老师的细致讲解以及老师给我们的学习资料的学习,我受益匪浅。
????????Python是一款强大的编程语言,它包含很多第三方库,只要你自己掌握了python的基本语法规则,了解了一些特定的算法,你也可以制作出属于自己的第三方库供自己和别人使用。熟练运用第三方库会给你的编程带来极大的便利。Python应用广泛,例如数据分析与展示、网络爬虫与信息提取、机器学习应用、科学计算三维可视化、云端系统开发与游戏开发等等,这次的上机我们学习的就是基于python语言的数据分析与展示。
????????我首先了解了Python、Pycharm、Anaconda 三者之间的关系,进而学习了Anaconda和pycharm的安装和使用。Anaconda指的是一个开源的Python发行版本,其包含了conda、Python等180多个科学包及其依赖项,是一款强大的python编程工具,而PyCharm是一种常用的Python IDE,带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具,比如调试、语法高亮、Project管理、代码跳转、智能提示、自动完成、单元测试、版本控制。使用起来十分的方便快捷。
????????脱离课本开始自己写代码,才真正深有感触:学如逆水行舟,不进则退。学习编程不能停留在眼过,更要与脑过和手过相结合,多敲多思考。在这数据可视化学习过程中,发现了许多问题,在敲代码时不够细心,有很多细节上的错误,比如对齐有问题,字母拼写错误,符号的错误等等,都是源自我的不细心以及不熟练。在这个方法的学习中我更加了解了地图绘制的原理,从地图的形状,区域的颜色,地图的大小,以及数据如何读取每一步都有了清楚的认识。对python的可视化也有了更深得认识的认识,尤其的python中第三方库的使用。
????????在爬虫的学习上也是花费了较长的时间,学习了爬虫的原理以及基本步骤。
????????首先便是理解URL概念,它是Uniform Resource Locator的缩写,译为“统一资源定位符”。通俗地说,URL是Internet上描述信息资源的字符串,主要用在各种WWW客户程序和服务器程序上。采用URL可以用一种统一的格式来描述各种信息资源,包括文件、服务器的地址和目录等。url:统一资源定位符。主要作用:用来定位互联网上的任意资源的位置。
????????而数据的抓取过程可以简单的理解为平时使用IE浏览器浏览网页的道理是一样的。比如在浏览器的地址栏中输www.baidu.com这个地址。打开网页的过程其实就是浏览器作为一个浏览的“客户端”,向服务器端发送了一次请求,把服务器端的文件“抓”到本地,再进行解释、展现。HTML是一种标记语言,用标签标记内容并加以解析和区分。浏览器的功能是将获取到的HTML代码进行解析,然后将原始的代码转变成我们直接看到的网站页面。
????????我们感兴趣的信息分为不同的类型:如果只是做搜索引擎,那么感兴趣的信息就是互联网中尽可能多的高质量网页;如果要获取某一垂直领域的数据或者有明确的检索需求,那么感兴趣的信息就是根据我们的检索和需求所定位的这些信息,此时,需要过滤掉一些无用信息。前者我们称为通用网络爬虫,后者我们称为聚焦网络爬虫。
????????在图形的绘制工具的选择上我使用的是pyecharts,在两个代码中实现地图绘制的语句。制作地图在制作地图这一步上与方法一相比简单,地图的制作早就被pyecharts的开发人员给做好了,我只需要调用它即可,然后再给它附上数据,这就成为了这功能独有的地图。
????????数据可视化是将数据用图形化的方式来表示,可以帮助人们迅速明白某些数据的重要性、理解数据的背后含义。数据可视化通常是理解和交流分析的第一步,因为当数据以图形方式而非数字方式呈现时,人们更善于理解数据。比如这次报告中的通过疫情可视化绘制出地图,获得到到更加直观以及快速得到以及想要的内容。数据的收集以及可视化通过交互式(可点击)数据可视化,向下钻取以探索细节,识别模式和异常值,是对数据进行可视化处理,以使得能够明确地、有效地传递信息。我感觉到对数据进行可视化是一件很有意义的事情,借助计算机获得直观的有效的快速的展现,将会给人类的各行各业带来极大的便利。
6.源代码
from pyecharts import options as opts
from pyecharts.charts import Map
from pyecharts.faker import Faker
import requests
from datetime import date
import json
from pyecharts.globals import ThemeType
update_date = date.today()
# 1.疫情接口
url = "https://lab.isaaclin.cn/nCoV/api/area"
# 2.向url发请求,并将获取到的数据转换成json格式
resultJson = requests.get(url).json()
# 3.定义一个列表存储最终结果
province_data = []
# 4.只取国内数据
for item in resultJson['results']:
if item['countryName'] == "中国":
province_data.append(
[
item['provinceShortName'],
item['confirmedCount']
]
)
c = (
Map(init_opts=opts.InitOpts(theme=ThemeType.LIGHT))
.add("全国确诊人数", province_data, "china", is_map_symbol_show=False)
.set_global_opts(
title_opts=opts.TitleOpts(
title="新冠状病毒全国疫情地图",
subtitle="更新日期:{}".format(update_date),
),
# 视觉映射配置项
visualmap_opts=opts.VisualMapOpts(
is_show=True, # 是否显示
min_=0, # 左下角刻度最小值
max_=2000
)
)
.render("全国疫情可视化.html")
)
import requests
import json
import jsonpath
from pyecharts.charts import Map
from pyecharts import options as opts
from datetime import date
#请求得url
url = "https://api.inews.qq.com/newsqa/v1/automation/modules/list?modules=FAutoCountryConfirmAdd,WomWorld,WomAboard"
#post方式请求
response =requests.post(url=url)
#将json格式转化为字典
data = json.loads(response.text)
#名称
name = jsonpath.jsonpath(data,"$..name")
#人数
confirm = jsonpath.jsonpath(data,"$..confirm")
#数据处理
#zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。
data_list = zip(name,confirm)
#要使用list解包
#print(list(data_list))
#国家名称表中英文的映射
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': '日本',
'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': '津巴布韦'
}
#自定义的每一段的范围
pieces = [
{"min":1000000},
{"min": 100000, "max":999999},
{"min": 10000, "max": 99999},
{"min": 1000, "max": 9999},
{"min": 100, "max": 999},
{"min":0,"max":99},
]
#width:宽度,height:高度,page_title:标题
#data_pair:数据项,maptype:地图类型,name_map:自定义读取的名称的映射,is_map_symbol_show:是否显示标记图形
map = Map(opts.InitOpts(width='1300px',height='600px')).add(series_name="世界疫情分布",
data_pair=list(data_list),
maptype="world",
name_map=nameMap,
is_map_symbol_show=False,
)
#label_opts:标签配置项设置,is_show:是否显示视觉映射配置
map.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
#is_piecewise:是否为分段型,pieces:自定义的每一段的范围
#max_:指定 visualMapPiecewise 组件的最大值,TitleOpts:标题配置
map.set_global_opts(
title_opts=opts.TitleOpts(title="世界地图"),
visualmap_opts=opts.VisualMapOpts
(max_=1000000,
is_piecewise=True,
pieces=pieces))
map.render("世界疫情分布情况.html")
大家可以收藏一下,以后找的时候方便
大家觉得好的话能给我点点赞吗
完结撒花!
?
|