- 在线时间
- 514 小时
- 最后登录
- 2023-12-1
- 注册时间
- 2018-7-17
- 听众数
- 15
- 收听数
- 0
- 能力
- 0 分
- 体力
- 40304 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 12802
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1419
- 主题
- 1178
- 精华
- 0
- 分享
- 0
- 好友
- 15
TA的每日心情 | 开心 2023-7-31 10:17 |
|---|
签到天数: 198 天 [LV.7]常住居民III
- 自我介绍
- 数学中国浅夏
 |
目录
8 Q7 p8 o/ Z }
$ s7 ]2 @1 ?. T) g文章目录* W, @) G* h' I" b) o! h
" l3 ^( f! K0 n, K- b前言
+ |- ?0 j0 C# T2 v0 f7 b8 \8 P1 \3 O' e# `" }9 K: q: p* i2 Q
一、数据爬取0 }1 {$ A9 \5 R% t! q4 c
8 d- M" \# b% L' j
二、数据预处理( h7 F7 `( a" q
( W( {# y6 G# b P前言, q( }; y5 [1 U! Q8 g' Z3 m4 e
本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。
0 K4 F0 R+ h$ ]' T+ j, W! c
6 U1 x& U9 J7 a5 h1 d) K+ ?6 G+ d$ H; v; K" Z; [* A/ V$ W
一、数据爬取
7 d8 S9 A" |! ?2 |0 B* Bimport requests
/ c7 i* M* T; timport pandas as pd4 v0 [/ u* Z$ D( \
from pprint import pprint3 C' h4 I+ C& E7 T
导入相关库
7 S- x! E/ `5 S0 X2 {2 Z
$ G1 e: O4 ^& @$ |, M& c4 G {requests库用于发起网页请求,获取网页中的源代码;7 b4 q, J( |' u) W7 c7 T' K
) E, k* K# ~" a# O
pandas库用于存储和读取获取到的信息;* E5 M2 j+ ]6 k% c E+ j# y
9 B& W' w$ O, e# j. f& }' f' Mpprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;" ]# y9 v* J# l
5 p) ]4 @' P& Z% W% s
url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'
/ @+ u) x9 d( ^( ]6 edata1 = requests.get(url).json()
4 ?( h& c: r& G j! a- o! f# pprint(data1)+ U: \4 W1 c7 K, u) y) g
3 E, Y, a0 j; p0 K这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。
+ m, m* S0 V, }; y) t0 v' Rdf1 = pd.DataFrame()4 h0 }/ O$ v3 I% F7 K/ q: m- d
for info in data1['body']['allMedalData']:
3 V6 k3 ]" w7 H2 ^7 v name = info['countryName']& J4 L& M. H9 o
name_id = info['countryId']0 s; O; n3 T( D& M
rank = info['rank']0 h7 u9 A- ^, q* V* r
gold = info['goldMedalNum']' A2 ~" ?0 M, B7 K
silver = info['silverMedalNum'] C$ F0 r8 V+ q6 a1 E
bronze = info['bronzeMedalNum']0 Q. W7 q; }' D" H3 }
total = info['totalMedalNum']: |9 ~5 V) {2 O6 ~
# 组织数据
% D- w. _- P0 ?; n7 q' [ orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]
$ ]: H' m' ?* G9 M2 Z # 然后追加df
' F! t- F5 P9 s/ T; W# @ df1 = df1.append(orangized_data), }# c" l' R3 N/ ?! Z
df1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数']" `2 i7 O2 w3 H( K1 ?8 L( S: s
df1
5 k2 m' Q$ P y C
1 e4 ?: w3 K2 l( I5 D![]()
2 O0 k$ c' D' }0 ?1 T0 l这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。; p* I, m7 U& ?. D: t* ], H: W6 v. `
url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609'$ B$ [! a' z5 R# [' f6 Q' d
data2 = requests.get(url).json()
' P" p1 F3 c* v9 |* b#pprint(data2)5 Z- u, Q/ K! n
5 O& [: z7 e9 G) r+ V0 z5 c9 ndf2 = pd.DataFrame()
5 E/ U$ n1 ?4 n( p# D L& `% Y2 Jfor info in data2['body']['medalTableDetail']:/ B/ \) }, T! Y' S0 P
english_name = info['countryName']3 T, p6 n+ g# Z7 n9 u7 E
name_id = info['countryId']
f/ W ^/ `) ~5 W; u award_time = info['awardTime']" p! M' y |1 }. I, W( {# v
item_name = info['bigItemName']; k, p+ {/ r% N0 G
sports_name = info['sportsName']
; a! |: \0 `0 G) I medal_type = info['medalType']
1 `' L* x9 K; Y! a # 组织数据1 \ {9 z( }% G, @$ @
orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]1 @% h) \$ B4 L6 n
# 然后追加df* @2 l! i- L+ m. r* r8 l( x: h& D. u
df2 = df2.append(orangized_data)9 Y. e8 U! J5 o! u! x. A, T5 G
df2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']# b8 F# \% @1 t
df2![]()
. _: m; W$ ~$ g% L6 _1 z* b. @5 T- u3 ~& f
对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。
! @ h7 p8 V# m8 I4 O0 \* z" |8 ]- _7 C* c% a2 m
+ J7 y9 r* }. q, ?# ?: B. x- G二、数据预处理, \2 d% x, k& P3 J$ h) @
由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。$ B4 {/ [3 h. V1 s6 |) r' O/ N
. m* ?3 ]: W, B( h" y$ @$ d
with open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:. {' r3 P) _# S% V9 b
x = f.read()
: W, I ~3 E R
! ~ y1 Q4 ^$ h* W2 ]df3 = pd.DataFrame()( W3 v. _4 x8 b9 J$ [
for i in x.split("\n"):; E- E2 o5 X: v- k" t
x = i.split(":")[0].strip()
# h" q, X' p1 V C# t y = i.split(":")[1].strip()
9 ?& K% D! W; Q" Z orangined_data = [[x,y]]4 l4 e: g3 Y0 f" j* |$ K
df3 = df3.append(orangined_data); }5 S* F% {# l# B, {
df3.columns = ["名称","英文名称"]( ?. {" J) U" f" N" E
df3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None)4 x# T# d. I3 E: g) U* C7 h" X
表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。
3 u2 } V% u7 [1 I" a1 N4 B4 X( }
( e4 r! j, M7 s) Edf4 = pd.merge(df1,df3,on="名称",how="left")3 _! F' R# ?; U" r: L9 L1 ]- U. S1 l: ]0 A
df4.head(10)
" w8 B* i; V6 g; T4 x- k, S
( z0 _5 v. l6 E/ d2 S. v) m $ p h' B$ x7 j4 J* m3 i5 \2 {/ T
表格df5表示运动项目获奖详情。
- M4 K E9 K9 `1 A0 x! u8 X9 U4 A, ~1 c! e$ n6 T* F3 R
, ?3 `) q9 w7 C& A; T( W1 o
( W8 w) A2 I- N9 R2 a9 j
. N0 R# I! ]% K$ W9 @6 A C' }6 P |
zan
|