python爬各国疫情数据,存储并进行数据可视化

实验内容:

编写程序采用爬虫技术爬取各国疫情数据,进行存储并进行数据可视化,要求可以看到各国今日新增确诊数、累计确诊数。

实验方法:

爬取数据

通过以下的步骤,获取到了各国和我国今日的新增确诊数、累计确诊数、各国的历史患病数据。

选取腾讯新闻网的肺炎板块作为数据源,如图1所示。

python爬各国疫情数据,存储并进行数据可视化_第1张图片 图1 腾讯新闻肺炎板块

 

 通过谷歌浏览器的开发者工具查看该页面的数据,筛选network中的数据源类型为XHR,发现需要的各国疫情数据存放在ranklist中,其中的数据如图2所示。

python爬各国疫情数据,存储并进行数据可视化_第2张图片 图2 ranklist数据内容

 

可以看出ranklist是以json类型存放数据,其中data中的每一项都对应着一个国家今日的疫情数据,其中confirm字段存放的是今日该国家确诊总人数,confirmAdd是今日该国家新增确诊人数,name中存放的是该国家的国家名称。

通过查看ranklist的头部信息,如图3所示。可以看到数据所在的路径是:

https://api.inews.qq.com/newsqa/v1/automation/foreign/country/ranklist

获取数据采用的方式是post。

python爬各国疫情数据,存储并进行数据可视化_第3张图片 图3 ranklist头部信息

 

 

通过如下代码,将国家名称、累计确诊、新增和当前确诊的数据保存到country、confirm、cinfirmAdd、nowConfirm这四个列表中,读取json节点数据用的是jsonpath包,需要pip安装。再获取各国历史数据存储到excel表。

url = 'https://api.inews.qq.com/newsqa/v1/automation/foreign/country/ranklist'  

# 获取到各个国家疫情数据  

resp = requests.post(url)  

# 提取数据,先把json类型转成字典  

data = json.loads(resp.text)  

country = jsonpath.jsonpath(data, "$..name")  # 国家名称  

confirm = jsonpath.jsonpath(data, "$..confirm")  # 累计确诊  

confirmAdd = jsonpath.jsonpath(data, "$..confirmAdd")  # 新增  

nowConfirm = jsonpath.jsonpath(data, "$..nowConfirm")  # 当前确诊 

# 但是其中没有我国的数据,采用和上面相似的方法获取中国数据,加入到上面列表中。

china_url = 'https://view.inews.qq.com/g2/getOnsInfo?name=disease_h5'  

json_text = requests.get(china_url).json()  

data = json.loads(json_text['data'])  

china_confirm = data['chinaTotal']['confirm']  

country.append('中国')  

confirm.append(china_confirm)  

# 接下来获取各国的历史疫情数据,以字典的方式存放到all_data中。

all_data = {}  

header = {  

    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36'}  

for c in country:  

   history_url = 'https://api.inews.qq.com/newsqa/v1/automation/foreign/daily/list?country={0}'.format(c)    

resp = requests.post(history_url, headers=header)  

data = json.loads(resp.text)['data']  

all_data[c] = data  


数据清洗与整理

以上各国和我国今日的新增确诊数、累计确诊数数据量较小,计划采用世界地图和柱状图的方式直接绘制,不进行存储。而各国的历史疫情数据多达上万条记录,需要进行存储。使用以下代码将数据按使用的可视化工具的存储格式要求写入excel表中,写入excel表时我先读出第一个国家的数据时把日期打印到第一行,以后的每个国家数据都是在上一个国家数据的下一行一列一列写入的,如果之后的国家某日数据为空,与第一个国家打印出来的日期不对应,就很容易造成写入位置不对,日期和数据的顺序不对应。所以我选取3月25日之后的数据,因为3月25日这些国家已经都出现了病例,不会出现日期和数据不对应的情况。

workbook = xlwt.Workbook(encoding='utf-8')  
worksheet = workbook.add_sheet('My Worksheet')  
for i in all_data.keys():  
    wb = xlrd.open_workbook('外国疫情数据表.xls', )  
    tabsheet = wb.sheets()[0]  
    k = tabsheet.nrows  
    if k == 0:  
        worksheet.write(k+1, 0, i)  
    else:  
        worksheet.write(k, 0, i)  
    save_count = 0  
    for t, j in enumerate(all_data[i]):  
        # 第一个国家按照日期数据生成一行  
        test = sortdate(str(j['date']))  
        if i == '美国' and sortdate(str(j['date'])) 
        >= datetime.date(2020, 3, 25):  
            print('美国输出时间3月25以后')  
            print(sortdate(str(j['date'])))  
            worksheet.write(0, save_count + 1, str(sortdate(str(j['date']))))  
            worksheet.write(1, save_count + 1, j['confirm'])  
            save_count += 1  
        #   其余的国家只填入确诊数量  
        if sortdate(str(j['date'])) >= datetime.date(2020, 3, 25) 
         and i != '美国':  
            worksheet.write(k, save_count + 1, j['confirm'])  
            save_count += 1  
    workbook.save('外国疫情数据表.xls') 

存储得到的外国疫情数据表.xls内容如图4所示。

python爬各国疫情数据,存储并进行数据可视化_第4张图片 标题图4 存储各国历史数据到表格

 

data_list = list(zip(country, confirm))  

# 数据可视化 把今天各国的确诊人数用世界地图的方式展示  

# pyecharts有比较好的动态效果 静态可选用matplotlib  

map = Map(opts.InitOpts(width='1600px', height='900px')).add(  

series_name="世界疫情分布-s1971齐畅",  

data_pair=data_list,  

maptype="world",  

is_map_symbol_show=False,  

name_map=nameMap)  

# 设置默认不显示全部国家名称  

map.set_series_opts(label_opts=opts.LabelOpts(is_show=False))  

# 设置全局配置项  

map.set_global_opts(visualmap_opts=opts.VisualMapOpts(max_=2400000, is_piecewise=True))  

map.render('世界疫情分布情况.html')  

各国的今日新增,采用matplotlib绘制柱状图。

sortAdd = sorted(zip(confirmAdd, country))  

sortAdd.reverse()  

showCountry = list(list(zip(*sortAdd))[1])  

showAdd = list(list(zip(*sortAdd))[0])  

# 绘制柱状图展示各国新增确诊  

plt.figure(figsize=[120, 60])  

plt.rcParams['font.sans-serif'] = ['SimHei']  

plt.rcParams['axes.unicode_minus'] = False  

pl = plt.subplot(221)  

plt.bar(showCountry[:20], showAdd[:20], width=0.5, color='deepskyblue')  

plt.ylabel("今日新增确诊人数", rotation=90)  

today = datetime.datetime.now()  

plt.title(today.strftime("%Y-%m-%d") + "各国新冠肺炎患者新增数")  

plt.xticks(showCountry[:20], rotation=-60)  

x_major = MultipleLocator(1)  

ax = plt.gca()  

ax.xaxis.set_major_locator(x_major)  

for a, b in zip(showCountry[:20], showAdd[:20]):  

 plt.text(a, b, b, ha='center', va='bottom', size=8)  

plt.sca(pl)  

plt.show()  

数据可视化

各国的今日确诊数据,我用pyecharts包中的世界地图做展示,地图绑定数据源的代码如下所示,其中country和confirm是2(1)中保存数据的列表。其中有一个问题是从网站上爬取下来的国家名称是中文,但pyecharts包中国家名称是英文,所以需要一个中英文的名称映射,也就是下面代码中的nameMap,nameMap的具体内容可见后文中的全部源代码。nameMap可以在网上直接找到,但是直接应用时出现了一些国家数据显示不出来的状况,这是因为nameMap映射中的英文名称和pyecharts中的英文名称不对应,或者是nameMap中的中文名称与网站爬下来的数据中的国家中文名称不对应,我已经一一做出修改。

各国的历史数据,采用flourish可视化工具进行可视化。上传保存的外国疫情数据表.xls,修改label和values等属性,再将结果用录屏软件导出成动图和视频。但该工具未成为会员的用户不能显示全部数据变化情况,仅能显示前十名。

python爬各国疫情数据,存储并进行数据可视化_第5张图片 图5 flourish工具

 

 

实验结果

对各国的今日疫情数据,我用pyecharts包中的世界地图做展示,如图6所示,把每个国家累计确诊人数分为如图6中左下图例的颜色区间,默认显示的就是世界地图,各个地区按照确诊人数的不同显示不同颜色。在鼠标触碰到某个国家的地图时会显示该国家的确诊人数。鼠标触碰左下区间时会亮起对应的国家。(这个区间划分不太合理,有个区间空了,但是没改)

python爬各国疫情数据,存储并进行数据可视化_第6张图片 图6 世界疫情地图

 

 

根据各国新增数据,绘制的图像如图7所示。

python爬各国疫情数据,存储并进行数据可视化_第7张图片 图7 各国今日新增确诊柱状图

 

 

根据各国疫情历史数据制作了动态图表如图8所示,可以动态展示3月25日到6月19日的确诊人数前十名疫情变化。用例中表示的是有数据的国家,但是动态图只展示确诊数前十的国家。

 

图8 各国确诊人数变化情况(2020-3-25至2020-6-19)

 

  1. 总结与不足

通过本次的学习,第一次接触了爬虫技术,丰富了以后学习中获取数据的方式,并且熟悉了pyecharts包和flourish等数据可视化工具,但因为时间和精力有限,学习仍然存在着如下的不足:

  1. 对怎样应对网站的反爬却了解的不够多。
  2. 对爬虫时如何获取到想要的数据所在位置仍然没有很多的研究,需要在以后的实践中丰富经验。

爬取到的各国疫情数据实际上是从1月份开始的,但是可视化时为了保存数据格式方便却只用了3月25日以后的数据,如果能将之前的数据加入到可视化中,变化的趋势会更加明了。另外爬取的我国数据只有6月份的,3~4月的数据没有爬取到。

全部源代码

import json  
import requests  
import jsonpath  
import xlrd as xlrd  
import xlwt as xlwt  
from pyecharts.charts import Map, Geo  
from pyecharts import options as opts  
import matplotlib.pyplot as plt  
from matplotlib.pyplot import MultipleLocator  
import datetime  
import xlwt    
url = 'https://api.inews.qq.com/newsqa/v1/automation/foreign/country/ranklist'  
# 获取到各个国家疫情数据  
resp = requests.post(url)  
# 提取数据,先把json类型转成字典  
data = json.loads(resp.text)  
country = jsonpath.jsonpath(data, "$..name")  # 国家名称  
confirm = jsonpath.jsonpath(data, "$..confirm")  # 累计确诊  
confirmAdd = jsonpath.jsonpath(data, "$..confirmAdd")  # 新增  
nowConfirm = jsonpath.jsonpath(data, "$..nowConfirm")  # 当前确诊  
showContent = []  
china_url = 'https://view.inews.qq.com/g2/getOnsInfo?name=disease_h5'  
json_text = requests.get(china_url).json()  
data = json.loads(json_text['data'])  
china_confirm = data['chinaTotal']['confirm']  
country.append('中国')  
confirm.append(china_confirm)  
data_list = list(zip(country, confirm))  
  
# 数据可视化 把今天各国的确诊人数用世界地图的方式展示  
# pyecharts有比较好的动态效果 静态可选用matplotlib  
map = Map(opts.InitOpts(width='1600px', height='900px')).add(  
    series_name="世界疫情分布-s1971齐畅",  
    data_pair=data_list,  
    maptype="world",  
    is_map_symbol_show=False,  
    name_map=nameMap)  
# 设置默认不显示全部国家名称  
map.set_series_opts(label_opts=opts.LabelOpts(is_show=False))  
# 设置全局配置项  
map.set_global_opts(visualmap_opts=opts.VisualMapOpts(max_=2400000, is_piecewise=True))  
map.render('世界疫情分布情况.html')  
  
sortAdd = sorted(zip(confirmAdd, country))  
sortAdd.reverse()  
showCountry = list(list(zip(*sortAdd))[1])  
showAdd = list(list(zip(*sortAdd))[0])  
# 绘制柱状图展示各国新增确诊  
plt.figure(figsize=[120, 60])  
plt.rcParams['font.sans-serif'] = ['SimHei']  
plt.rcParams['axes.unicode_minus'] = False  
pl = plt.subplot(221)  
plt.bar(showCountry[:20], showAdd[:20], width=0.5, color='deepskyblue')  
plt.ylabel("今日新增确诊人数", rotation=90)  
today = datetime.datetime.now()  
plt.title(today.strftime("%Y-%m-%d") + "各国新冠肺炎患者新增数")  
plt.xticks(showCountry[:20], rotation=-60)  
x_major = MultipleLocator(1)  
ax = plt.gca()  
ax.xaxis.set_major_locator(x_major)  
for a, b in zip(showCountry[:20], showAdd[:20]):  
    plt.text(a, b, b, ha='center', va='bottom', size=8)  
plt.sca(pl)  
plt.show()  
  
  
def sortdate(today):  
    list1 = today.split('.')  
    today = datetime.date(2020, int(list1[0].replace('0', '')), int(list1[1]))  
    return today  
  
  
url = 'https://api.inews.qq.com/newsqa/v1/automation/foreign/country/ranklist'  
# 获取到各个国家疫情数据  
resp = requests.post(url)  
# 提取数据,先把json类型转成字典  
data = json.loads(resp.text)  
country = jsonpath.jsonpath(data, "$..name")  # 国家名称  
  
all_data = {}  
header = {  
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36'}  
for c in country:  
    history_url = 'https://api.inews.qq.com/newsqa/v1/automation/foreign/daily/list?country={0}'.format(c)  
    resp = requests.post(history_url, headers=header)  
    data = json.loads(resp.text)['data']  
    all_data[c] = data  
workbook = xlwt.Workbook(encoding='utf-8')  
worksheet = workbook.add_sheet('My Worksheet')  
for i in all_data.keys():  
    wb = xlrd.open_workbook('外国疫情数据表.xls', )  
    tabsheet = wb.sheets()[0]  
    k = tabsheet.nrows  
    if k == 0:  
        worksheet.write(k+1, 0, i)  
    else:  
        worksheet.write(k, 0, i)  
    save_count = 0  
    for t, j in enumerate(all_data[i]):  
        # 第一个国家按照日期数据生成一行  
        test = sortdate(str(j['date']))  
        if i == '美国' and sortdate(str(j['date'])) >= datetime.date(2020, 3, 25):  
            print('美国输出时间3月25以后')  
            print(sortdate(str(j['date'])))  
            worksheet.write(0, save_count + 1, str(sortdate(str(j['date']))))  
            worksheet.write(1, save_count + 1, j['confirm'])  
            save_count += 1  
        #   其余的国家只填入确诊数量  
        if sortdate(str(j['date'])) >= datetime.date(2020, 3, 25) and i != '美国':  
            worksheet.write(k, save_count + 1, j['confirm'])  
            save_count += 1  
    workbook.save('外国疫情数据表.xls')  
nameMap = {  
    'Afghanistan': '阿富汗',  
    'Albania': '阿尔巴尼亚',  
    'Algeria': '阿尔及利亚',  
    'Andorra': '安道尔',  
    'Angola': '安哥拉',  
    'Antarctica': '南极洲',  
    'Antigua and Barbuda': '安提瓜和巴布达',  
    'Argentina': '阿根廷',  
    'Armenia': '亚美尼亚',  
    'Australia': '澳大利亚',  
    'Austria': '奥地利',  
    'Azerbaijan': '阿塞拜疆',  
    'The Bahamas': '巴哈马',  
    'Bahrain': '巴林',  
    'Bangladesh': '孟加拉国',  
    'Barbados': '巴巴多斯',  
    'Belarus': '白俄罗斯',  
    'Belgium': '比利时',  
    'Belize': '伯利兹',  
    'Benin': '贝宁',  
    'Bermuda': '百慕大',  
    'Bhutan': '不丹',  
    'Bolivia': '玻利维亚',  
    'Bosnia and Herzegovina': '波斯尼亚和黑塞哥维那',  
    'Botswana': '博茨瓦纳',  
    'Brazil': '巴西',  
    'Brunei': '文莱',  
    'Bulgaria': '保加利亚',  
    'Burkina Faso': '布基纳法索',  
    'Burundi': '布隆迪',  
    'Cambodia': '柬埔寨',  
    'Cameroon': '喀麦隆',  
    'Canada': '加拿大',  
    'Cape Verde': '佛得角',  
    'Central African Rep.': '中非共和国',  
    'Chad': '乍得',  
    'Chile': '智利',  
    'China': '中国',  
    'Colombia': '哥伦比亚',  
    'Congo': '刚果(布)',  
    'Comoros': '科摩罗',  
    'Republic of the Congo': '刚果共和国',  
    'Costa Rica': '哥斯达黎加',  
    'Croatia': '克罗地亚',  
    'Cuba': '古巴',  
    'Cyprus': '塞浦路斯',  
    'Czech Republic': '捷克共和国',  
    'Denmark': '丹麦',  
    'Dem. Rep. Congo': '刚果(金)',  
    'Dem. Rep. Korea': '朝鲜',  
    'Djibouti': '吉布提',  
    'Dominica': '多米尼加',  
    'Dominican Republic': '多明尼加共和国',  
    'Ecuador': '厄瓜多尔',  
    'Egypt': '埃及',  
    'El Salvador': '萨尔瓦多',  
    'Equatorial Guinea': '赤道几内亚',  
    'Eritrea': '厄立特里亚',  
    'Estonia': '爱沙尼亚',  
    'Ethiopia': '埃塞俄比亚',  
    'Falkland Islands': '福克兰群岛',  
    'Faroe Islands': '法罗群岛',  
    'Fiji': '斐济',  
    'Finland': '芬兰',  
    'France': '法国',  
    'French Guiana': '法属圭亚那',  
    'French Southern and Antarctic Lands': '法属南半球和南极领地',  
    'Gabon': '加蓬',  
    'Gambia': '冈比亚',  
    'Gaza Strip': '加沙',  
    'Georgia': '格鲁吉亚',  
    'Germany': '德国',  
    'Ghana': '加纳',  
    'Greece': '希腊',  
    'Greenland': '格陵兰',  
    'Grenada': '格林纳达',  
    'Guadeloupe': '瓜德罗普',  
    'Guatemala': '危地马拉',  
    'Guinea': '几内亚',  
    'Guinea Bissau': '几内亚比绍',  
    'Guyana': '圭亚那',  
    'Haiti': '海地',  
    'Honduras': '洪都拉斯',  
    'Hong Kong': '香港',  
    'Hungary': '匈牙利',  
    'Iceland': '冰岛',  
    'India': '印度',  
    'Indonesia': '印度尼西亚',  
    'Iran': '伊朗',  
    'Iraq': '伊拉克',  
    'Iraq-Saudi Arabia Neutral Zone': '伊拉克阿拉伯中立区',  
    'Ireland': '爱尔兰',  
    'Isle of Man': '马恩岛',  
    'Israel': '以色列',  
    'Italy': '意大利',  
    'Ivory Coast': '科特迪瓦',  
    'Jamaica': '牙买加',  
    'Jan Mayen': '扬马延岛',  
    'Japan': '日本本土',  
    'Jordan': '约旦',  
    'Kazakhstan': '哈萨克斯坦',  
    'Kenya': '肯尼亚',  
    'Kerguelen': '凯尔盖朗群岛',  
    'Kiribati': '基里巴斯',  
    'North Korea': '北朝鲜',  
    'Korea': '韩国',  
    'Kuwait': '科威特',  
    'Kyrgyzstan': '吉尔吉斯斯坦',  
    'Laos': '老挝',  
    'Latvia': '拉脱维亚',  
    'Lebanon': '黎巴嫩',  
    'Lesotho': '莱索托',  
    'Liberia': '利比里亚',  
    'Libya': '利比亚',  
    'Liechtenstein': '列支敦士登',  
    'Lithuania': '立陶宛',  
    'Luxembourg': '卢森堡',  
    'Macau': '澳门',  
    'Macedonia': '马其顿',  
    'Madagascar': '马达加斯加',  
    'Malawi': '马拉维',  
    'Malaysia': '马来西亚',  
    'Maldives': '马尔代夫',  
    'Mali': '马里',  
    'Malta': '马耳他',  
    'Martinique': '马提尼克',  
    'Mauritania': '毛里塔尼亚',  
    'Mauritius': '毛里求斯',  
    'Mexico': '墨西哥',  
    'Moldova': '摩尔多瓦',  
    'Monaco': '摩纳哥',  
    'Mongolia': '蒙古',  
    'Morocco': '摩洛哥',  
    'Mozambique': '莫桑比克',  
    'Myanmar': '缅甸',  
    'Namibia': '纳米比亚',  
    'Nepal': '尼泊尔',  
    'Netherlands': '荷兰',  
    'New Caledonia': '新喀里多尼亚',  
    'New Zealand': '新西兰',  
    'Nicaragua': '尼加拉瓜',  
    'Niger': '尼日尔',  
    'Nigeria': '尼日利亚',  
    'Northern Mariana Islands': '北马里亚纳群岛',  
    'Norway': '挪威',  
    'Oman': '阿曼',  
    'Pakistan': '巴基斯坦',  
    'Panama': '巴拿马',  
    'Papua New Guinea': '巴布亚新几内亚',  
    'Paraguay': '巴拉圭',  
    'Peru': '秘鲁',  
    'Philippines': '菲律宾',  
    'Poland': '波兰',  
    'Portugal': '葡萄牙',  
    'Puerto Rico': '波多黎各',  
    'Qatar': '卡塔尔',  
    'Reunion': '留尼旺岛',  
    'Romania': '罗马尼亚',  
    'Russia': '俄罗斯',  
    'Rwanda': '卢旺达',  
    'San Marino': '圣马力诺',  
    'Sao Tome and Principe': '圣多美和普林西比',  
    'Saudi Arabia': '沙特阿拉伯',  
    'Senegal': '塞内加尔',  
    'Seychelles': '塞舌尔',  
    'Sierra Leone': '塞拉利昂',  
    'Singapore': '新加坡',  
    'Slovakia': '斯洛伐克',  
    'Slovenia': '斯洛文尼亚',  
    'Solomon Islands': '所罗门群岛',  
    'Somalia': '索马里',  
    'South Africa': '南非',  
    'Spain': '西班牙',  
    'Sri Lanka': '斯里兰卡',  
    'St. Christopher-Nevis': '圣',  
    'St. Lucia': '圣露西亚',  
    'St. Vincent and the Grenadines': '圣文森特和格林纳丁斯',  
    'Sudan': '苏丹',  
    'Suriname': '苏里南',  
    'Svalbard': '斯瓦尔巴特群岛',  
    'Swaziland': '斯威士兰',  
    'Sweden': '瑞典',  
    'Switzerland': '瑞士',  
    'Syria': '叙利亚',  
    'Tanzania': '坦桑尼亚',  
    'Taiwan': '台湾',  
    'Tajikistan': '塔吉克斯坦',  
    'United Republic of Tanzania': '坦桑尼亚',  
    'Thailand': '泰国',  
    'Togo': '多哥',  
    'Tonga': '汤加',  
    'Trinidad and Tobago': '特里尼达和多巴哥',  
    'Tunisia': '突尼斯',  
    'Turkey': '土耳其',  
    'Turkmenistan': '土库曼斯坦',  
    'Turks and Caicos Islands': '特克斯和凯科斯群岛',  
    'Uganda': '乌干达',  
    'Ukraine': '乌克兰',  
    'United Arab Emirates': '阿联酋',  
    'United Kingdom': '英国',  
    'United States': '美国',  
    'Uruguay': '乌拉圭',  
    'Uzbekistan': '乌兹别克斯坦',  
    'Vanuatu': '瓦努阿图',  
    'Venezuela': '委内瑞拉',  
    'Vietnam': '越南',  
    'Western Sahara': '西撒哈拉',  
    'Western Samoa': '西萨摩亚',  
    'Yemen': '也门',  
    'Yugoslavia': '南斯拉夫',  
    'Democratic Republic of the Congo': '刚果民主共和国',  
    'Zambia': '赞比亚',  
    'Zimbabwe': '津巴布韦',  
    'South Sudan': '南苏丹',  
    'Somaliland': '索马里兰',  
    'Montenegro': '黑山',  
    'Kosovo': '科索沃',  
    'Republic of Serbia': '塞尔维亚',  
}  

参考资料

 

[1]【爬取疫情数据 - 陈文彬 - 博客园】https://www.cnblogs.com/syzka/p/12747335.html

 

[2]【利用python爬取疫情最新数据 - 邵文 - 博客园】

 

https://www.cnblogs.com/wendi/p/12550610.html

 

[3]【5分钟python爬虫案例,手把手教爬取国内外最新疫情历史数据_qq_46614154的博客-CSDN博客】

https://blog.csdn.net/qq_46614154/article/details/10563484

你可能感兴趣的:(python,爬虫,大数据)