- 在线时间
- 514 小时
- 最后登录
- 2023-12-1
- 注册时间
- 2018-7-17
- 听众数
- 15
- 收听数
- 0
- 能力
- 0 分
- 体力
- 40330 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 12810
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1419
- 主题
- 1178
- 精华
- 0
- 分享
- 0
- 好友
- 15
TA的每日心情 | 开心 2023-7-31 10:17 |
|---|
签到天数: 198 天 [LV.7]常住居民III
- 自我介绍
- 数学中国浅夏
 |
目录+ N6 `+ I6 `- S' w6 P; @
# ?/ W: Z, k+ F
文章目录
1 q* e7 m, c$ M8 v/ z" x
$ \3 X+ Z* G2 {0 k& V前言
# R: [ p8 L1 S6 H/ e
9 B4 p' Y& N8 t; O. W s: w一、数据爬取
/ a9 M& {0 `5 T$ z. M
; u! F; Q/ x! x4 n' g, i二、数据预处理6 j% P Y9 L8 Z% w1 H
: U& w. }1 b5 r6 S" E5 ^; p, Z# @
前言
9 Y) E4 P- r" D- o本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。% v- b; h$ Q& |- ~
1 g% w+ Y* h7 c7 \+ H* L, ?! u1 k2 l L& d
一、数据爬取
/ U' ~. D1 [# k# M' z5 Nimport requests
6 k9 b% H0 }" W- G0 [: \! Wimport pandas as pd* _/ F+ H, d4 n+ E! T" H
from pprint import pprint: u/ M$ w* x) R0 M) H" P$ ]0 D
导入相关库/ G1 U1 o( t" A. r) G6 N( ~
6 w7 I1 E1 Y: F. Z3 c3 T# w% m4 c
requests库用于发起网页请求,获取网页中的源代码;/ l' |& q% v5 F$ ?+ l
8 l) Q4 Y& M% z7 z# {( ^7 T6 \3 l+ ypandas库用于存储和读取获取到的信息;
0 L' w# z( Q6 s2 n0 V, _2 d/ \, G3 Q" c l5 e5 s- J
pprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;
; p. B) t' l5 C- I1 Z$ X: c a0 O) H3 t, p& ?4 d5 }
url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'
0 s0 a2 \. f4 V4 X) qdata1 = requests.get(url).json()
" Z9 h- d" j7 G# pprint(data1)' k$ J7 k; K5 {7 U: F
- ~7 p7 w6 _2 o5 R这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。
5 Y0 V& Y! @) Z; P. @" ldf1 = pd.DataFrame()- w2 T1 I. X, B
for info in data1['body']['allMedalData']:
4 m7 B( b1 {( H) q# y% p! T/ p- _ name = info['countryName']7 G- f* k# n3 C$ t6 z, r5 X
name_id = info['countryId']
7 w @0 G9 p8 q9 a1 N rank = info['rank']
) U* q+ \/ m, V: a: v! X5 k gold = info['goldMedalNum']2 a/ Y" o$ P. ^8 l$ \* N
silver = info['silverMedalNum']
- r% v9 Y/ `5 } bronze = info['bronzeMedalNum']' Y3 k0 A4 k: P4 e# s
total = info['totalMedalNum']2 k4 K& b: k; l7 @+ |) \
# 组织数据" z- x) O( r* D! T* I0 X' D
orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]
) d5 L) {) Y3 k$ R1 U # 然后追加df7 @) V. q5 u( f) @
df1 = df1.append(orangized_data), U+ B" C( t- Q
df1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数']
$ F9 m) p+ }5 f0 @) vdf1
" |4 }2 u+ N3 f3 A: J8 q
2 I, w- \% Q1 f2 g' y1 q6 Y 1 x& n9 c6 F: V; M/ k/ x9 v6 H
这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。6 u0 K5 f1 J% V, w: F5 X
url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609'
+ [3 U# S; {2 y3 U5 }, A8 Gdata2 = requests.get(url).json()4 G7 B6 C3 u# e
#pprint(data2)
' p- s% d. ~' F& r
, r/ H, f m5 ldf2 = pd.DataFrame(): [: w. h! j! P4 m1 T& X: n `
for info in data2['body']['medalTableDetail']:
& H& L7 V' I! c" z* Q4 Q' a+ r english_name = info['countryName']
& u9 p0 D- d3 y name_id = info['countryId']
" _# d% d8 e1 V award_time = info['awardTime']) |( d( N/ D5 c% q. ?, e1 ~+ z( Z
item_name = info['bigItemName']
2 q- O0 M5 n0 G6 U' p+ t sports_name = info['sportsName']8 ~# R5 q2 I1 D6 |! n0 ^0 ^
medal_type = info['medalType']
Y, D S0 f; P9 y* f# `& w2 D # 组织数据
" n/ }- t3 E* M' } S! G% ]8 v( C7 o y orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]! {2 M0 Z) u# `
# 然后追加df
$ ?' R, F" V) r! \8 W df2 = df2.append(orangized_data) V8 j) b3 H o3 z: K
df2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']# @, u- e% O* d6 `) o9 Z) p" Q
df2![]()
( N: }5 X4 A; i
. G, E* M: {1 G9 I% m L6 N对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。 9 c. a+ y* X V( u/ V/ \
' [. t, s: i7 s. \, @$ W* J) _7 e, L. ?6 E. t
二、数据预处理0 i A8 Z/ a; W) h
由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。5 y1 H# @1 S& a2 ]8 w1 D) i
0 T: S6 p6 q W$ G3 ~
with open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:
' }. r# A% u1 a0 u1 ] x = f.read()
* p: G) D- n' ^2 ~% d6 i8 Q. i1 U. |
- X/ Z M. D4 ?, V# S7 i0 X8 Y' qdf3 = pd.DataFrame()" \! x3 v# R( G5 w" u
for i in x.split("\n"):
9 t3 @( I, n+ d# H! Y& P' K x = i.split(":")[0].strip()4 r3 G' ]7 K- Y. i8 ]. ^4 O
y = i.split(":")[1].strip()
! V5 P& G# a2 J' e+ x orangined_data = [[x,y]]
' F( c( n7 F4 N5 O! u1 @# W df3 = df3.append(orangined_data)+ W. A( T0 s/ v8 c9 P4 b
df3.columns = ["名称","英文名称"]
% D4 m+ ^9 f+ S2 Q$ K( x Adf3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None)
" E* d5 e$ n3 |7 i! S) g3 C表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。
5 T3 X+ @0 z: `) W1 y8 f% @
3 ^5 W/ \9 y: [% Z7 @% fdf4 = pd.merge(df1,df3,on="名称",how="left")
, m1 k, {9 ]; xdf4.head(10)9 O' S, ^% m6 ^, B: ^( C
) B1 ?8 ^6 x2 n. e1 t / U% ~4 L4 j7 k/ H* L
表格df5表示运动项目获奖详情。 - . b7 Q" I5 I. Z0 y6 @0 F
+ k; X2 s: [( S/ _+ m8 X
* k; l4 @6 ]: C8 C7 ]) f + e0 r" Y# R( i/ a
: q" C: `+ _: F1 x0 r/ S
|
zan
|