( N% }# O/ ?# {1 m) u" L9 A- a8 a. Q* q
一、数据爬取2 P! M, ?4 ^7 ~
import requests ; E8 O2 B0 ?1 J2 f3 fimport pandas as pd , ? f7 Z. Q7 h+ C" sfrom pprint import pprint+ U/ F$ Q: x( W# i, y) N
导入相关库 $ k0 B% X$ j6 |# ]. q- r6 r/ D0 J. O0 W: ~# T
requests库用于发起网页请求,获取网页中的源代码; 6 A8 j7 A% k6 n8 Z* W G$ K2 b5 L' j( J7 m+ q
pandas库用于存储和读取获取到的信息; ' e5 \' a. Q2 K* S5 `! r ; [, h* w+ i( d2 b4 Y7 }pprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析; : R) b4 M8 V1 n% M0 M# e 4 n5 c5 P+ T" u5 Y& c6 V) F$ Eurl = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609' $ a6 X7 c1 N9 Fdata1 = requests.get(url).json()" D+ V- ]3 h, ]0 `( _. G" K
# pprint(data1) * G# B6 p% q. S# l/ w( I7 s4 R5 F& ~
这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。, u" b% U7 f# n3 d @6 t. Y% F1 s% ^
df1 = pd.DataFrame(); W3 H* k3 ^; a4 S& s
for info in data1['body']['allMedalData']: 4 B# t7 a7 L% I% ]( l+ p( M name = info['countryName']4 \8 _8 W: o) {3 J2 F4 K9 k7 q& E
name_id = info['countryId']- p# ^5 d4 n3 r
rank = info['rank'] / l( N+ l% E6 ?; v" r; I1 [ gold = info['goldMedalNum']* q: ^1 y. e! t8 y3 Y
silver = info['silverMedalNum'] : d- ^2 l: ~+ I; I5 ]) z) [ bronze = info['bronzeMedalNum']( x) Z9 X0 ^2 S- l$ N/ u+ U+ m
total = info['totalMedalNum']& Z& g% P, s! N6 L. T Z
# 组织数据' t: z- ~5 q% U& _' W
orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]- n" P. A( \& `* z
# 然后追加df! b. R( t; U7 ~" \# C0 ^
df1 = df1.append(orangized_data)7 b2 J4 r2 k, J/ f$ n; b
df1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数'] 9 w; ]+ q; w T. G" R, udf1' d; k6 z) n1 z( Q
) M% Z6 L1 C& b* U n: G" N# K# n+ z( i# M8 r/ j1 u B: ?
这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。" K2 E) x+ r/ \
url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609' + n# l2 L2 T# t0 z; h. i. s% o( p5 |4 ?data2 = requests.get(url).json()0 @, S" B+ u! y, ?) T
#pprint(data2)6 \5 a4 l( r. U9 u, p3 k) N- s2 Z
) r) A: h e8 C ?; j7 H& c
df2 = pd.DataFrame() 0 r' ~& H3 W, }* w1 d0 yfor info in data2['body']['medalTableDetail']: : Q% k; ]7 h& H$ H" V english_name = info['countryName'] 7 n$ O" T5 |3 ]4 O4 h2 k/ } name_id = info['countryId']1 W% {0 U& d. n0 d% l4 f, `
award_time = info['awardTime']6 F. T0 m9 P4 g' {9 `
item_name = info['bigItemName'] - q0 F* a& Q" f9 E% | G4 C/ J sports_name = info['sportsName']! V' ^# p, Z9 Z& h% l
medal_type = info['medalType'] 0 V' j( J) J5 N& ^( w* d # 组织数据) q6 P/ L: m. | `
orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]# z% G9 d! q/ a, r5 c: e# ^4 w
# 然后追加df- l6 q0 C) W$ T
df2 = df2.append(orangized_data)$ u2 M+ K( O* }; G- c# K9 i$ F
df2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型'] + r5 w# |1 t. Xdf2% z: k. R* e5 |, a O. X
" F( z$ P. ^1 H
对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。 / B6 D# l- F X4 S& S# y
6 H' A8 N% n* Q9 H- m; b. E . [8 Q) U, j* g5 n, |- W% L8 l% t二、数据预处理% G* j, B J$ Z0 r& X2 Z
由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。/ {% @2 W/ r/ f4 Z4 Q+ P7 D: y
' U5 w& H6 n4 e9 _with open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f: ( k6 t1 r& _' k# k- I9 Q; T) C- P x = f.read()4 W C k E$ i. _" C
" A2 U$ i8 B6 p: C: N7 Sdf3 = pd.DataFrame() 4 D6 C& X6 s7 x8 C. b$ yfor i in x.split("\n"): 1 m& A- M& X' Y/ k3 A x = i.split(":")[0].strip() 7 Z( }& ~1 ^( k3 _' y7 e1 n y = i.split(":")[1].strip()% R5 ~; x; P4 j* F: k' i/ T: q
orangined_data = [[x,y]]; T7 C$ [4 X+ i1 y' G
df3 = df3.append(orangined_data) & j! I& T7 `/ M1 w3 Q" idf3.columns = ["名称","英文名称"] 9 `3 P( J; z! J' c- `* P; idf3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None)- \7 v2 M( I& V5 H) @/ ?) R
表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。5 h9 i& a- o/ \' F4 k5 A( P# a
; r% S# g8 O# r( [( r0 L5 F
df4 = pd.merge(df1,df3,on="名称",how="left") , ^9 K8 C+ z( S: ~* X& K& w: Adf4.head(10) % d% L: G% {% r! U; B1 I: c9 f' y9 k, r$ X d( P& [# J9 G9 l+ g ( m R: g# N$ U% n3 n1 S$ o