目录3 I3 x$ A2 V, M
; L% [3 k* k. m0 @8 G$ ^
文章目录4 M% r* u# I l8 Z' P* W) h3 a5 q6 w
& ]3 r! c. \! \$ G2 D- l
前言 1 m# l o5 j g8 k8 g8 I8 B . J; g" E+ L I, j* u一、数据爬取, n% H5 P, N1 p! ~% t6 M/ P
# n( p4 _2 |( \二、数据预处理3 J& q. a- T: H0 @
5 V i! P( D1 p. o! g, S! h
前言 " V- Y( _) E8 O v本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。: {8 i9 E8 x1 ?0 [
6 w/ B/ I# m" k( R* _
4 T! u3 p9 ~) e% C
一、数据爬取$ R7 d/ V: Z" G! m4 Y
import requests ' b% q0 O# B+ k/ s1 Z6 `# \% Iimport pandas as pd; e( h! |, t- L0 b9 p
from pprint import pprint 5 c6 E' x x k: [( L导入相关库) G7 ?; V; G! Z D) X6 l: }
2 r/ y( @5 P' Y$ }0 n% erequests库用于发起网页请求,获取网页中的源代码; - G. P1 t: g6 h( L v& q" A ' G) [/ C: U, k C% Lpandas库用于存储和读取获取到的信息;; e' o: O, m( R: I* t- a8 P8 K
( {/ W5 r( _+ i6 O6 opprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析; 8 w4 ^7 Y& J' m! j. S4 a: M) z; C% O" z- {/ d3 g @0 C! _, K
url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'# E' S" e3 F# m5 p6 n% P9 s F
data1 = requests.get(url).json(); s9 t, M; ]% D# e2 _5 F) @
# pprint(data1)4 |8 _. H o/ x/ y2 A+ C, N: P
4 o* ]. a6 d# |% W这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。 / O8 g9 J% D) j0 Cdf1 = pd.DataFrame()+ ]2 t& P% r; i3 m; r5 T
for info in data1['body']['allMedalData']: 3 E( e! _# V+ a# B8 P name = info['countryName'] 9 l/ s6 X& ?$ G# {$ p; O) q name_id = info['countryId']$ n0 A k( V- f* P/ ]2 `) n
rank = info['rank']$ B4 {" }; x8 S8 A
gold = info['goldMedalNum'] 2 E0 d, ?; }9 p) x. Q silver = info['silverMedalNum'] ' Z2 j' @3 n8 w7 O% X2 V1 C bronze = info['bronzeMedalNum']( v# d6 ^" g6 i4 V
total = info['totalMedalNum']0 W, P4 p3 S' Q! j. G- K
# 组织数据 , j* B0 o& g: L! x% [" B orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]9 [* v4 H6 T1 {2 Q
# 然后追加df, [+ S5 r; N8 x" E: [7 _9 [
df1 = df1.append(orangized_data) / s' q% |* Y! vdf1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数'], ?( N: {8 i" F9 d
df10 u! V. H L) e$ |) P! U% X, C
" q0 c: P4 F1 b1 i% k3 k6 n7 v , I/ {7 B: j' o, b* z" o这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。" p- N2 H' ^ D6 K( Y1 {! {
url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609' * U! L5 O( @9 ?! }, V' @0 |data2 = requests.get(url).json() ! A3 G' e, B- A- B) o, s# Q; ?#pprint(data2) 5 o) l3 @- C8 o6 W' {( f. B" L4 [+ q% S5 e
df2 = pd.DataFrame() . a3 H( A( [" h+ }& D8 mfor info in data2['body']['medalTableDetail']: [* d5 ?+ S: R) O+ v/ ~
english_name = info['countryName'] 6 B& \0 E" h9 ? name_id = info['countryId'] ; h- E1 f6 e; Y0 x: E award_time = info['awardTime'] + [) ^9 ?$ r7 b( C! I9 _4 R item_name = info['bigItemName']3 ?% }, o/ \. R. ]! \# D' q6 i, a! u
sports_name = info['sportsName'] , a8 n% P% b. T; h, }( @: R medal_type = info['medalType']; A2 P% I& a* Y; I( ?0 h0 d* D
# 组织数据6 m5 C8 [# W0 p1 o2 _
orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]. X" I' F* x1 E4 c8 y+ ^: |# n5 O
# 然后追加df/ {. ]4 e8 A }5 B# @& j. p; H
df2 = df2.append(orangized_data) ) j6 r' ]$ W! C# Y: l4 tdf2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']* `2 N [8 H( t4 v4 q
df2& K* @$ b2 N1 [/ x g+ V2 Q
+ V0 U" f5 s4 u) w' s* ] H$ [对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。 - n4 u0 p2 k: P1 N$ H5 F ! E3 S2 ~: _1 z" W& v$ L : C* g! ~- u# w7 E* W0 ]. o二、数据预处理1 Q6 T0 Z# U" I4 S; B
由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。 * k5 w- a2 S+ V* @ ( e0 n- p; R' Q5 ~0 k: awith open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:, r& U' l- S) }; g( h! H- Y+ v3 L" D) c
x = f.read() - L- F" F1 F: w m) D' L ) i# ?4 \8 x4 ?7 w+ Qdf3 = pd.DataFrame() ! z; i8 a. H7 D# O: f1 {9 D Sfor i in x.split("\n"):- L: V+ k" ^# n& F
x = i.split(":")[0].strip()& ]4 z, K+ v' H% {
y = i.split(":")[1].strip()4 ^) i8 y# @7 l; v% f/ a' B
orangined_data = [[x,y]]& d( v( f, [ h) A9 t' G% s$ d$ e
df3 = df3.append(orangined_data)6 m3 e7 H+ q3 |3 x+ u3 g
df3.columns = ["名称","英文名称"]( C r% o8 D" n Q6 Q2 n1 \
df3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None)- d" s4 @* O: U+ t% a8 z6 P
表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。% b) ~0 A: F% l# ]/ t0 Y0 D" I& t. d
4 ]/ G% R0 ? L% r) q$ w3 udf4 = pd.merge(df1,df3,on="名称",how="left") 7 U" V; Z9 p! O; Gdf4.head(10)7 z! ~$ o+ \/ a M" t
/ ~' z d) v- k' @# t * r- s' s6 n" M8 @/ b5 U