7 q. H9 T) M: g) S文章目录 ! f9 E1 ]6 a0 c i ( V* `7 z( L! G* _' N5 o- N前言 7 ?% \8 S' k- y! b( \8 V- z+ b 9 `4 D; |$ F Z4 s6 G: x+ I1 j' J一、数据爬取3 J- T$ h: G) ], `; ~ G6 o
% O( c9 N# d5 }3 ^7 R5 Z7 w v" ^二、数据预处理- C4 c5 S2 @6 o5 b0 x& t
$ o c4 Y1 p; v+ g0 z
前言 / H2 h3 @: Y- }. o# z' X2 C9 g本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。 / `$ Z- c& }4 K ? 8 C/ O j3 J1 F# S* X0 a 7 N' |) L, K. m) `一、数据爬取3 c4 i) I, E5 Z7 l; R# D5 `
import requests # s3 v9 f4 ], Z5 L! }import pandas as pd 6 y+ j7 L+ R: G. ufrom pprint import pprint& V/ N# ^( m% p. F9 a2 c! [! _* c
导入相关库- g4 p; i' i2 K0 {
& Q) u+ h5 ?. @* J: s# M
requests库用于发起网页请求,获取网页中的源代码;8 I9 i/ ?3 u, u) ]7 Y/ _
; U1 F. @. n c. [5 U6 m X! d3 n* bpandas库用于存储和读取获取到的信息; $ h' C1 a+ L0 \/ C1 h( J6 Z% ?, _ 1 t3 F& v2 |' g4 @& S8 Vpprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;0 x3 I. w h. T* C9 t, i
& m; f E9 {. |& q5 D) R4 `1 i9 Durl = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609' " y, E v5 `, \0 \data1 = requests.get(url).json() - J3 l6 t! M3 i+ |0 A, e D6 l' Q# pprint(data1)8 z: P* E* X, s- i" G
" Q7 S2 n1 }) m7 d: ]
这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。 % g3 y$ \' N. j) I X5 X9 ~7 hdf1 = pd.DataFrame() / N- }0 k4 m f$ F9 x3 kfor info in data1['body']['allMedalData']:2 m' T( `1 h) Q
name = info['countryName']% _7 q/ w" r4 l: j
name_id = info['countryId'] $ _& D) e' [( v1 \1 ~ rank = info['rank'] / @- ~2 g X' p- h. o/ E gold = info['goldMedalNum'] , V; h9 i0 F8 s2 i silver = info['silverMedalNum'] ) S( K+ r" n0 T# b bronze = info['bronzeMedalNum'] & w/ m% z- \% _% \ v# P total = info['totalMedalNum']# d( Z: j' N4 Z0 X( @+ b- x0 O1 W9 ~' ]% y
# 组织数据 : F9 Z" A* H' F+ A+ |4 n2 C orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]; Z% ~ V( E' L# @% ~6 r
# 然后追加df ; u2 V& L- O& z df1 = df1.append(orangized_data) / G8 s' S2 Q4 I3 W, D8 h2 r, |4 wdf1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数']! |0 z$ Z2 V/ g$ J8 R
df1& Q4 b- `" o K" T1 R
6 Y% L/ t: \& {8 L m ( s6 [) Q3 A( O! F6 p这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。8 a# c7 r2 V- k$ A/ H% N
url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609' . I! ~- `9 x, [; J$ f9 ?" Odata2 = requests.get(url).json()+ V5 z' o* d4 ~6 O3 ]
#pprint(data2) " L$ M% i$ |. F: F& c6 Z: f. K. C8 |
df2 = pd.DataFrame()& a6 L$ v) I* S; L1 r% X ?/ L
for info in data2['body']['medalTableDetail']:( K' s' U; v; u
english_name = info['countryName']; t' I+ ?& L/ |' r8 W+ v+ j
name_id = info['countryId']: G7 E* Y- z6 R8 f0 i. l+ C
award_time = info['awardTime'] , u1 s; ^+ f @6 ^5 }& { item_name = info['bigItemName'] j. p' `# T8 l* l# e# k sports_name = info['sportsName']% {( P! K# D8 C6 E' A0 n0 d
medal_type = info['medalType'] 7 a# ]; p4 Z3 k # 组织数据" v: ^* K' l- o
orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]0 V1 J; E# F4 e
# 然后追加df3 M3 O, k B5 `; ?- I9 e9 I
df2 = df2.append(orangized_data)7 _! y0 A: |' t1 p: {: W1 c
df2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']+ b3 Q) d U4 Q9 ]$ h( L- k
df2( o% L+ `- e7 _
9 a/ H) O3 d2 z! @/ @对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。 * {. `# {% k% c' c" v
; u% \+ h% l& B: L' V# q! K# i" W9 o+ m, ~
二、数据预处理" i$ h5 A9 j# T6 r$ q0 K
由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。 % O. |( {- r+ u" N5 K# d$ l! } - V( U0 R$ {9 D8 `& _: [with open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:+ m% n5 @0 ^. o
x = f.read() 3 L6 W _: ^: x0 Y( R 8 {6 _7 ?+ z! |df3 = pd.DataFrame() , u" k* r3 l8 a" gfor i in x.split("\n"): & Y: }. R4 o5 j, O& D* \. n$ j" f x = i.split(":")[0].strip() 8 r. ~( `+ f: `% ^/ s y = i.split(":")[1].strip() , p& z/ r0 \4 z" T0 _, G) v orangined_data = [[x,y]]- s$ l- ?2 O+ m& \+ F! f1 s
df3 = df3.append(orangined_data)$ [* j6 A2 h! e4 j* w: h) u
df3.columns = ["名称","英文名称"]/ _+ W/ n8 a# I7 s
df3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None)' S. V: q% x" I/ w1 _" r
表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。# W$ L$ L$ ~ [6 C0 ]) O5 ?