python数据可视化之疫情地图爬虫(含完整代码以及具体报告)

        利用网络爬虫获取了最新的世界以及中国的疫情数据,实现新冠病毒疫情数据可视化地图。

1.库的准备

        在这里先将pycharm编辑器配置好Anaconda,这样就可以满足大部分的库的使用了。

python数据可视化之疫情地图爬虫(含完整代码以及具体报告)_第1张图片

 但是我们将用到的pyecharts库还是需要自己下载的。

在准备用爬虫进行最新疫情数据的呈现后,了解了pyecharts,matplotlib、seaborn、plotly这几个绘图工具,决定使用pyecharts。

Echarts是一个由百度开源的数据可视化工具,凭借着良好的交互性,精巧的图表设计,得到了众多开发者的认可。而python是一门富有表达力的语言,很适合用于数据处理。当数据分析遇上了数据可视化时,pyecharts诞生了。

pyecharts的下载 

python数据可视化之疫情地图爬虫(含完整代码以及具体报告)_第2张图片

 2.获取数据

        打开Chrome在网页右击选择“检查”,点开network,刷新页面,点击各个请求,找到数据所在url,并复制,再进过#post方式请求语句response =requests.post(url=url)。得到的就是直接获得requests的post请求的数据。

        其中URL是Internet上描述信息资源的字符串,主要用在各种WWW客户程序和服务器程序上。采用URL可以用一种统一的格式来描述各种信息资源,包括文件、服务器的地址和目录等。url:统一资源定位符。主要作用:用来定位互联网上的任意资源的位置。

        

         可以看到效果,获取到了我们想要的首页数据,如果我们查看这个网页的源码,就可以更加清楚的认知见图7,可以看到此时不同国家的数据内容,我们获取的内容和网页源码的联系,其实就是网页源码的内容。

现在得到了内容,下一步就是准备对数据的处理,筛选出我们需要的内容。

3.代码块的解释

向url发送请求爬虫代码块1

python数据可视化之疫情地图爬虫(含完整代码以及具体报告)_第3张图片

这是两种方法的使得到的post请求变成json格式。

 地图语句代码块2python数据可视化之疫情地图爬虫(含完整代码以及具体报告)_第4张图片

 在两个代码中实现地图绘制的语句。这一步虽说是制作地图,其实不然,地图的制作早就被pyecharts的开发人员给做好了,我只需要调用它即可,然后再给它附上数据,这就成为了这功能独有的地图。

 存储数据代码块3

 数据处理部分,zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。要使用list解包print(list(data_list)),储存数据。

 视觉映射配置项代码块4

python数据可视化之疫情地图爬虫(含完整代码以及具体报告)_第5张图片

 都是用visualmap_opts进行视觉映射配置项,包括指定 visualMapPiecewise 组件的最小值,是否显示视觉映射配置,内边距等等作用。

关于Echarts中visualMap组件详解:

视觉映射组件,用于进行『视觉编码』,也就是将数据映射到视觉元素。视觉元素可以是:symbol: 图元的图形类别。symbolSize: 图元的大小。color: 图元的颜色。

4.运行效果

 

会出现下图这样的网页

 点开这个网页如下图在右上角选择适当的浏览器打开,就会得到爬虫的地图。

python数据可视化之疫情地图爬虫(含完整代码以及具体报告)_第6张图片

 

截止我写这篇文章是爬虫的时间为最新的数据(左上角表明爬取数据的时间为2022.10.27)

鼠标滑到任意一个省份会有该省份的确诊数据。

python数据可视化之疫情地图爬虫(含完整代码以及具体报告)_第7张图片

python数据可视化之疫情地图爬虫(含完整代码以及具体报告)_第8张图片

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")

大家可以收藏一下,以后找的时候方便

大家觉得好的话能给我点点赞吗

完结撒花!

 

你可能感兴趣的:(python,爬虫,开发语言)