目录 - U5 g' U" j. d* W 4 {' w' Y' @$ q. R8 A' c: h% u文章目录. e' C! E) u8 \1 q) f6 V
0 t+ a9 v0 a) H6 L
前言 5 X/ `9 v# c; E' o% _- Z( F2 x, N" l |* J- I3 s8 L: p r
一、数据爬取 # F4 {) t, Q7 G* g : e' q. V* a( U二、数据预处理 0 M9 l, u. b) y , D9 J0 S3 V6 X: g7 V前言 8 X8 l4 s% W; M2 f `本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。, E* z/ x0 B' u! j, j R
- ~: }; y9 `% m$ Z S- H2 Z" ]3 I- L) v$ ^8 K# W) c
一、数据爬取 + e; }0 y) X0 J! \import requests ! x( C( @# K3 d- \: O/ V, @$ limport pandas as pd8 c1 C# z/ j: Y# a4 k& g' a$ y
from pprint import pprint3 Y7 m/ N; ]7 d+ Y9 f
导入相关库3 ~; W2 b; B; V- p" S* ~6 N
% P" U+ }9 u) d, W. r/ y
requests库用于发起网页请求,获取网页中的源代码; b. m4 }& J- G; p- C$ ^* P, }# s8 w. N) ?6 p# l
pandas库用于存储和读取获取到的信息;0 D/ o2 q) c' U# I
2 ~1 C3 x! `2 [* Q4 y* _
pprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析; 2 ^4 p# j! |) K% w. ]( z; \; ] a2 M/ Q! ]; M
url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609' 2 O& Y) j% r8 zdata1 = requests.get(url).json() " `& o$ f( T% l% F8 ?* I! b# pprint(data1) 8 m- R7 ^! U4 }! H/ A0 g& n8 a$ x 0 P9 }& ~: q+ I$ s这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。+ _9 Z6 ^5 [+ Z, I1 [
df1 = pd.DataFrame()" i4 ]+ L7 \8 f( i# ?% \
for info in data1['body']['allMedalData']:; g2 N1 S2 `7 X/ ?2 j; F) B e
name = info['countryName'] : q$ S- z/ M3 h+ E& L name_id = info['countryId']4 |0 r1 X0 V+ e3 E' ] k! O. e
rank = info['rank'] ) a( r1 T& ]* W6 v3 r, t8 ~1 t5 | gold = info['goldMedalNum'] # `" @* O5 {, H. ^ silver = info['silverMedalNum'] . w6 H) K8 W: Z4 `9 c bronze = info['bronzeMedalNum'] 8 @* Y% r3 o' E7 B1 I- l' F$ ? total = info['totalMedalNum']" L# G2 u* n3 r* F0 s [3 a
# 组织数据 2 c/ _" b/ M+ K2 R orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]: x9 `% a$ n' D' T' d0 L0 @" b
# 然后追加df; a% y" ]- m, x, J( G
df1 = df1.append(orangized_data) $ n" o# w# I: C8 x" Kdf1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数'] : y! Z0 ~- t5 \/ B0 ydf1 ; ^1 z; X0 ?5 U5 c$ V " h' _+ u# {' x0 t7 @7 ^ 7 N' H7 x& ^1 [* z# b4 n这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。 0 I9 t. R) | c0 D) Eurl = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609'" a6 t' o2 K7 V
data2 = requests.get(url).json()# L( N1 `/ Z9 h2 g
#pprint(data2) - j% B8 G. i/ i, J |9 w, S' R # h% a$ d h+ y, {$ }& \df2 = pd.DataFrame()+ w% S" o6 |' A- J. Z: W% ^" z
for info in data2['body']['medalTableDetail']: / {$ q9 ]; w# K3 i/ t english_name = info['countryName'] * }2 n: W$ \* m9 k: F$ J name_id = info['countryId'] 0 Z+ y% a2 m% d8 q5 g+ T. q award_time = info['awardTime']4 M: t) s* y% \4 c6 {
item_name = info['bigItemName']. I1 l8 l$ T. N' k
sports_name = info['sportsName'] 8 }9 _; n) ~+ x* X" Q( V medal_type = info['medalType']$ M1 N9 f# n5 L
# 组织数据 $ u% |8 r% o4 ~! P orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]0 {, D( n3 ^6 p Y( k* B) n8 F. a7 Z% k' c
# 然后追加df ; M) O5 l$ ~9 e) |: O9 ]1 W df2 = df2.append(orangized_data) 6 n2 H$ p: T1 s4 q: vdf2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型'] 6 j4 a* | N8 T4 g; kdf2 + E# t" o, A c# C 8 D9 a8 k9 u9 }/ u7 H8 B对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。 - O; G" ~ |3 A! z& a: v
' [; R5 A- ^8 {( H) l4 R
' T1 a6 D8 ^& c9 {+ d6 ~% @. ?) h二、数据预处理 3 \: Z: t9 T. Y' [" U7 e/ e* b G由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。3 I$ Q6 N+ `; C' w
- l7 n' R# ~# V' R5 B; _; k) qwith open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f: 6 r6 ~* g" w( T. I+ }. g" u x = f.read() , h; S" M) w, {" r, K$ O, {4 l( ^8 b
df3 = pd.DataFrame()" a0 r, p. Y( g: e9 f$ e6 u
for i in x.split("\n"): 6 K* [; T9 u: D x = i.split(":")[0].strip()3 }& l a+ X) N; Q3 P% k
y = i.split(":")[1].strip()- h' j3 L ]6 P9 z8 S! I" x
orangined_data = [[x,y]]" M; F+ W. f# O$ k C$ Q6 C9 W
df3 = df3.append(orangined_data) : [! W( {0 @& k% s6 fdf3.columns = ["名称","英文名称"] " _$ N* M1 T# kdf3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None) - I% P( e' _9 U" }* O' g表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。 9 V! w0 n' B, s ; r) W! O g hdf4 = pd.merge(df1,df3,on="名称",how="left")" `2 ^% [6 U4 t& a' w z7 V
df4.head(10) 0 O) n, @: t7 p / d& Q5 b3 d$ b. O; T" L- D e+ c# x5 l1 H5 y7 A6 \% a