爬虫+数据分析,制作一个世界疫情人数增长动态柱状竞赛图
世界疫情的數據很多網站都有,這里我還是使用手機網易的疫情數據接口。
首先,切換ua,換成手機模式。百度搜索“網易 疫情”,
第一個就是。
?打開這個網址,點開開發者工具,刷新一下。就可以看到有這么幾個,第一個請求,就是數據
但是這里我們要用的是世界疫情。所以,還得往下多看幾眼。
這第一個請求里,會給你今天的世界疫情數據。但是我們想繪制的是隨著時間變化,增長的數據競賽柱狀圖。只有一天是不行的。
但是,這里有一個游泳的數據是,areaTree下面,每一個國家的id都有了。
后面用數據的請求接口,需要用到這個id。這里我就選7個國家,每個單獨記下來就行,也沒必要用request提取。
當然了,這里我也是用的python。畢竟第一次也不知道這幾個國家的id。
import numpy as np import pandas as pd import matplotlib.pyplot as plt import re import os import time import requestsplt.rcParams["font.family"] = "SimHei"wk_dir = "數據分析" data_dir = "數據分析/data"headers = {'User-Agent': 'Mozilla/5.0 (Linux; Android 11) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.120 Mobile Safari/537.36','Accept': '*/*','Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2','Origin': 'https://wp.m.163.com','Connection': 'keep-alive','Referer': 'https://wp.m.163.com/','Sec-Fetch-Dest': 'empty','Sec-Fetch-Mode': 'cors','Sec-Fetch-Site': 'same-site','TE': 'trailers', }params = (('t', '326632088930'), )response = requests.get('https://c.m.163.com/ug/api/wuhan/app/data/list-total', headers=headers, params=params)#NB. Original query string below. It seems impossible to parse and #reproduce query strings 100% accurately so the one below is given #in case the reproduced version is not "correct". # response = requests.get('https://c.m.163.com/ug/api/wuhan/app/data/list-total?t=326632088930', headers=headers)rj = response.json() rj.keys() data = rj['data'] data.keys()areaTree = data['areaTree']countryCode = [ x['id'] for x in areaTree] countryName = [ x['name'] for x in areaTree]dct_country_id = dict(zip(countryName, countryCode))dct_country_id['美國']?這里的代碼,params,里面只有一個t, 這個t剛開始我以為是時間,但是也不知道這個是怎么構造的。反正就用這個,后面請求歷史數據的時候,這個t也不需要改,沒啥影響。
返回json格式的,我就依次提取 json數據里的 data→areaTree→各國的id
做成一個字典,這樣通過字典就可以查詢“美國”返回7,中國是0.
?然后點擊“世界疫情”
?出現,各個國家的數據。
美國后面有“詳情”,點擊一下,看看這個請求時什么結構,
第二個請求,他的數據就是美國的數據,
?
我們看請求頭。
?
?數據最后一行是今天的美國人數。
?
?這個請求頭,是這個url
https://c.m.163.com/ug/api/wuhan/app/data/list-by-area-code?areaCode=7&t=1633273396571
?直接復制這個網址,到瀏覽器,可以看出,它就能返回給我們美國的數據。
?所以規律就是,替換掉 areaCode的數字,我們分別用幾個國家的id,替換,輪番請求。就可以得到一個世界各國的疫情歷史數據。
need_countries = ['中國', '美國', '英國', '伊朗', '西班牙', '韓國', '德國', '意大利', '印度']need_countriesdct_allData = {}for country in need_countries:country_id = dct_country_id[country]print(country, "*"*20, country_id)url = f"https://c.m.163.com/ug/api/wuhan/app/data/list-by-area-code?areaCode={country_id}&t=1633160447810"print(url)try:response = requests.get(url, headers = headers)time.sleep(3)rj = response.json()dct_allData[country] = rj['data']print("success")except:print("failed")country_idurldct_allDatadct_allData.keys()?這樣就得到了9個國家的數據了。
?比如,美國的,都在字典 allData里
usa = dct_allData['美國'] usa['list'] list = usa['list'] len(list)?先保存一下數據。
pd.to_pickle(dct_allData, os.path.join(data_dir, "allData疫情數據"))后面在操作這個數據就可以了。
不需要爬蟲了。
這里我們只需要兩個數據就可以了。
就是
?date和confirm
其他都不需要。
dct_confirm = {}for c in dct_allData.keys():confirm = [ x['total']['confirm'] for x in dct_allData[c]['list'] ]dct_confirm[c] = confirmdct_confirm.keys()len(dct_confirm['美國']) len(dct_confirm['印度'])每一個國家的數據,都可以做成一個dataframe
china_list = china['list'] china_date = [ x['date'] for x in china_list] china_confirm = [ x['total']['confirm'] for x in china_list]df_china = pd.DataFrame({'date':china_date,'confirm':china_confirm }) df_china這里要注意的是,不同國家,有的時間沒有數據。date不是同樣的。數據也不等長。
f_china.shapeusa_list = usa['list'] usa_date = [ x['date'] for x in usa_list] usa_confirm = [ x['total']['confirm'] for x in usa_list]df_usa = pd.DataFrame({'date':usa_date,'confirm':usa_confirm })df_usa.shape?可以看出,中國有604個date有數據,美國只有589個。
這樣在合并成一個大表的時候,就需要注意日期,有的是缺失值。
def get_data(key):len_key = len(df[key]['list'])print(len_key)data = []date = []for i in range(len_key):d = df[key]['list'][i]['total']['confirm']data.append(d)dt = df[key]['list'][i]['date']date.append(dt)return dict(zip(date, data))dct_data = {}for key in df.keys():dct_data[key] = get_data(key)dct_data.keys() pd.DataFrame(dct_data)這里我們定義一個提取date和confirm的兩個數據的函數,對每個國家執行這個函數,得到dct_data是一個大的字典。
直接用pandas生成這一個字典。
就可以得到一個大表。
?
?pandas還是很智能,會自動按照各個國家的date排序,把沒有數值的弄成NAN,只保留一個date作為index
df_test = pd.DataFrame(dct_data) df_test.shape df_test.index?
df_test2 = df_test.sort_index(ascending=True) df_test2 df_test2.keys()df_test2.columns = ['china', 'usa','uk', 'iran', 'spain', 'korea', 'germey', 'italian', 'india'] df_test2把index按照時間順序排序,把國家名字改成英文。
?
總結
以上是生活随笔為你收集整理的爬虫+数据分析,制作一个世界疫情人数增长动态柱状竞赛图的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基金净值越高越好吗 主要关注这一点就可
- 下一篇: 微粒贷是微众银行的吗