- 在线时间
- 514 小时
- 最后登录
- 2023-12-1
- 注册时间
- 2018-7-17
- 听众数
- 15
- 收听数
- 0
- 能力
- 0 分
- 体力
- 40216 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 12776
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1419
- 主题
- 1178
- 精华
- 0
- 分享
- 0
- 好友
- 15
TA的每日心情 | 开心 2023-7-31 10:17 |
|---|
签到天数: 198 天 [LV.7]常住居民III
- 自我介绍
- 数学中国浅夏
 |
目录
' e9 x: I% X# W! N
' ], U5 o; Y0 L: D文章目录; m6 s, y+ N: p. o
& f! c1 W; I0 R& ?, r4 t' I/ k. R前言
) T# t+ I2 N' p) k- @
% q7 H3 E& N- {1 U一、数据爬取6 @6 n6 q/ h- ~, v- e+ _
' v) U$ N0 L% z o( |+ }二、数据预处理9 c# }* C) {" y
0 F( S6 Z0 G$ a: p! C* ~前言
* p5 J0 y$ b1 R/ l! c3 I; L本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。- g/ _2 R- @$ ? N, C; f. A$ Y
6 n' H* D [( g, L A6 T3 ?& I. S9 |$ i% p6 d1 b
一、数据爬取
( n, `2 y9 v3 S, j/ G$ [2 Bimport requests
5 u( T! k2 R/ Mimport pandas as pd
5 Y: @* q: ?- cfrom pprint import pprint
/ l2 W* c7 {# ~: i5 D' ~# S8 _导入相关库" {; e- H3 T+ }$ W! ^
' X4 \# j, K8 U- ~- H3 G
requests库用于发起网页请求,获取网页中的源代码;
# h7 F% ?4 C- b
$ [3 ~7 E0 K4 S8 j, u5 Apandas库用于存储和读取获取到的信息;
% i/ `- d. q Q& ^6 t
! N" x5 e9 \" Ppprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;
) s% A' e4 J3 \5 \6 r4 Z
, Z5 ^+ X/ l/ M- c. Kurl = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'
) k* n) k5 c; I( xdata1 = requests.get(url).json()
+ p8 s7 Z6 |7 Y( }# pprint(data1)' l# e- b, _9 g2 }( C0 m" j( A
/ c7 _" S' {7 m3 p, O6 C/ j6 h! ]8 s) J* W这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。
2 ~+ Y3 Y; q2 g* H' m7 t% t" ^/ Y& Edf1 = pd.DataFrame()+ O* W6 @; q' q+ K s* J# \
for info in data1['body']['allMedalData']:
. n' R$ j' ^3 ^6 | name = info['countryName']. w1 x. |, p( F% f
name_id = info['countryId']5 {/ q, K3 v1 M+ `. M G3 q# |
rank = info['rank']" z- P' ]- ?1 ]4 M
gold = info['goldMedalNum']
8 k3 t- W! u9 I- U v* G/ x silver = info['silverMedalNum']! B1 \0 R" Y6 G. a
bronze = info['bronzeMedalNum']
' g. E; o5 s6 ~& R! k5 m total = info['totalMedalNum']
+ Z }6 F# i% L( E- i; Y # 组织数据
/ I$ m8 P }) G: Z orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]
+ G( L1 p6 M+ f* }! L # 然后追加df' H" V( i" |( t( D0 n
df1 = df1.append(orangized_data)7 t( d# K- c& ?
df1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数']" r) c' j" w8 }- a
df1
7 O( ^7 T! J* O! ?7 I2 ?8 X6 P G& T% Y. `' o/ U7 B% p+ W# ~
; _9 }' l' x: E6 X
这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。
& @& f, m9 C% k2 @) K8 v0 I, Furl = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609'
0 H5 f Q& Y& P3 {/ Ndata2 = requests.get(url).json()6 \8 D0 _6 b( W% q$ ]$ S* Z
#pprint(data2)' c0 J Q3 R5 }: K
, e& v" ?! [5 ~2 e6 S, C% S, @df2 = pd.DataFrame()
# N. b% i5 R9 u8 W mfor info in data2['body']['medalTableDetail']:
6 @+ Q& R% O* `" w' L/ }# k2 J english_name = info['countryName']8 z, x( Q& b1 E( B. X) a! c: ~
name_id = info['countryId']
" `/ }6 P- j" J award_time = info['awardTime']
/ @0 r3 ?2 b& F$ u" w5 ] item_name = info['bigItemName']
3 d) r; \" B7 N; A) k9 t ? sports_name = info['sportsName']
' ?- \; X- s, ]* g" v o, G8 ~$ _ medal_type = info['medalType']
* }0 q# X; A7 g: H # 组织数据. C X! Q9 i$ e$ |4 D& @: X
orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]
' F p; ~( v8 |% V! E" a3 T/ G # 然后追加df
) j1 u; G/ U7 h2 l df2 = df2.append(orangized_data)
$ Y* Y4 x# k: n7 l0 ldf2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']
% k W1 k( m3 z% X+ Q7 A9 X1 S! kdf2 2 S. ]. J! v: P5 ?4 J, @. ~
) ?6 O$ U3 i. l( e' o4 A1 d8 e' E
对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。 1 X; ~/ L3 t( i! @4 N
2 g/ U% E- K& ?2 W
; }- Y8 T0 d) C( A) o: V, u二、数据预处理
. V' @+ L( A8 q+ y, V由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。: \% c0 p( [$ @3 X* J0 Z! i
F0 H7 E3 N3 L- k8 ] R
with open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:
" F8 g3 e8 t5 M" r1 N% o: _ x = f.read()5 J* D! l# V* h0 F
- O! X* k9 _. J
df3 = pd.DataFrame()9 i) w' l F! j; \# r' D8 `
for i in x.split("\n"):
( B( E4 r+ }3 Q! |; Y x = i.split(":")[0].strip()
- a! I: ] q% {' w6 O y = i.split(":")[1].strip()2 L4 c# O7 p( f" ?. K
orangined_data = [[x,y]]/ o$ V" v* I' ]1 T" S: v; J
df3 = df3.append(orangined_data)
. `7 R! T1 ^5 h: e2 ?, gdf3.columns = ["名称","英文名称"]
: ~$ n- l; y: H9 bdf3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None)4 G- H4 V* G$ d# h/ y! ^. c$ h. g
表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。
1 i6 I4 I" Y. t- o3 b. `2 Z) \+ b* I) g
df4 = pd.merge(df1,df3,on="名称",how="left")
( T6 W2 ~2 {6 m3 Adf4.head(10)
4 U9 c7 ^1 _- p6 V
8 U$ o8 L# `3 ?/ N![]()
1 ~1 l' f5 x( L- R- f表格df5表示运动项目获奖详情。
* ^' {4 a q& h1 r2 n/ i
1 J/ f- F; J+ y' c( |3 a. ?( Q% A$ r- z% i
4 V, _0 Y: w# h: ~ n# k( K
4 @+ {( O' u9 `$ z5 v |
zan
|