- 在线时间
- 514 小时
- 最后登录
- 2023-12-1
- 注册时间
- 2018-7-17
- 听众数
- 15
- 收听数
- 0
- 能力
- 0 分
- 体力
- 40290 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 12798
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1419
- 主题
- 1178
- 精华
- 0
- 分享
- 0
- 好友
- 15
TA的每日心情 | 开心 2023-7-31 10:17 |
|---|
签到天数: 198 天 [LV.7]常住居民III
- 自我介绍
- 数学中国浅夏
 |
目录
; K5 d# i+ m" r
9 |! _! E3 x3 G, c5 h: A( k* u0 M5 R( G3 F文章目录- U# y( U' f$ z+ p
2 Q# J% Z* Q- G) y& z; d* ?& U前言; D H# G) Z& e( ?9 q d/ b( z
3 W) R3 j0 p, X! a# R8 h3 l+ A
一、数据爬取
- o5 R) R6 H4 V/ f. I2 g# d( f% l* v
) g( s+ X- {* u. B' c二、数据预处理7 `. U3 N+ p. q1 o% ?8 D
/ U+ O4 R$ K M' V) f前言/ w. J, s1 J1 Q0 Z
本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。
+ Q I1 u7 V. X( I+ k3 T {" U
( m9 ?4 a. t _7 i' c& X* P" {2 Z" ~2 \
一、数据爬取0 I7 T$ j7 z) d
import requests. ~1 z7 S9 b, I3 |3 g/ e; J& ~
import pandas as pd. ]+ Y5 `: {8 b+ C; l
from pprint import pprint
- k m% B7 o# O* _" }: ^导入相关库
f& h! }: Z; E/ n
# k9 W N' N2 Q6 @requests库用于发起网页请求,获取网页中的源代码;
: [4 v' h! `9 c$ L4 @# g) D0 E3 e1 S3 ?& I
pandas库用于存储和读取获取到的信息;4 R" i7 F9 v6 K$ P
; z7 L: F$ g9 z) O- S; ?; e2 y* spprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;0 } f W* u% D/ h: { ^; J
, g( U. x/ [5 j) Z; |
url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'1 Z9 A/ e. m" S
data1 = requests.get(url).json()
/ ]5 P- P% z9 z+ ?# pprint(data1)$ F! W' l0 C5 R( d2 h$ ~
! B \0 Z" H" D9 J这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。" ^, ?0 m; y6 v" _1 g! M, B5 q
df1 = pd.DataFrame(); ^1 ]8 b" B" p$ n
for info in data1['body']['allMedalData']:% M& e% r) z1 r7 I
name = info['countryName']
+ p( D0 U, _2 L, |# S name_id = info['countryId']- t* L8 I0 T) O( A8 q
rank = info['rank']0 @5 T/ _; n3 M& c
gold = info['goldMedalNum']
) [ u* L! n8 {' b silver = info['silverMedalNum']' r* z+ Z1 h3 ?# M6 c
bronze = info['bronzeMedalNum']
+ Y* y' A0 |# c+ T | total = info['totalMedalNum']" y7 B9 |9 z6 v7 [( p E
# 组织数据+ X# {( D' X$ F; e+ b5 ?
orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]
& H% x; L# N: I # 然后追加df% Q! a7 f% \4 r- ]: G1 e Z' ~% U
df1 = df1.append(orangized_data)7 i) ~# |+ O0 e% e
df1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数']( z9 G. ?, |1 [5 M3 P
df1
5 c4 }% I- Z. t4 J0 H. X3 V# ^! K2 d- e
![]()
5 H; ]/ ~5 s9 v( J这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。
0 U- Z. d; _; _% Z8 g+ S- Yurl = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609'2 L& T3 @& U3 G, d _+ U1 P
data2 = requests.get(url).json()
/ Z/ _: b6 l0 g% c5 B. Q#pprint(data2)
4 U* @: O4 N% M( I, ]' ]" Q1 d( E& F6 y$ ]' _+ f
df2 = pd.DataFrame()
* q L/ g* i4 W0 V4 M ufor info in data2['body']['medalTableDetail']:
" f9 R/ D) b: z7 H' B l1 z2 h english_name = info['countryName']; D N: H7 N* q4 r
name_id = info['countryId'] @( n' f* ?, g+ V7 _
award_time = info['awardTime']. D* q& ?% O( a7 ~9 f! z/ `
item_name = info['bigItemName']% n: N" ?; Y& \" A6 P6 J/ a
sports_name = info['sportsName']
" @2 r# b7 `; v Z! u& h8 i medal_type = info['medalType']' U6 o+ U5 C% r" r4 \* R4 I
# 组织数据( J/ Z+ l* ?: d3 o; R. a6 X; ?
orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]
. m/ I! ~8 x9 G! v # 然后追加df
7 a7 T3 y: Z U- v df2 = df2.append(orangized_data)
) A8 k8 k* X9 K) t4 x# bdf2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型'], @% ^& ^9 b4 t& N
df2 $ |/ ]/ A& ]% R+ f t2 q
% w; d7 K' i- }3 I) S- p
对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。
$ @- n" B, e: B( _ u) q$ J1 ~# k' o# l
8 g2 o- J( X" R5 v! I$ {7 ^
二、数据预处理
/ `( h% S2 N% P4 A由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。5 d" j3 r6 w% p5 @# O# Z
! a n* N# F! x
with open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:* ~5 n* L3 [) x, {
x = f.read()1 I* q1 }% [* S* n* ~
1 t( p4 E% z" z a7 _
df3 = pd.DataFrame()
1 |: C& s! E5 r% `5 mfor i in x.split("\n"):
- r1 L4 y% ^2 |# g2 i x = i.split(":")[0].strip(), l0 M+ M7 D$ a: a, l- k$ \6 F
y = i.split(":")[1].strip()! J2 t) [2 z! o1 B
orangined_data = [[x,y]]
' v2 L7 y6 d8 t { df3 = df3.append(orangined_data)
# [. B6 h$ {3 Z' D4 i4 bdf3.columns = ["名称","英文名称"]4 @1 U" ]! E& @% b" o; o
df3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None)# c# e# F5 x- w3 A
表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。
2 D4 ^) J8 j- T* L. [' J/ {+ h0 p3 C' h6 f* H
df4 = pd.merge(df1,df3,on="名称",how="left") \) C3 \& d& a1 V! X" ?' L5 R
df4.head(10)
8 j; }9 I4 J# ]4 \) t8 Q9 M8 q. A9 Q c7 ^7 k
* A& [' _4 h0 } C1 S
表格df5表示运动项目获奖详情。 - ) `1 O3 X3 q. S1 l; n
6 W# |( V+ q* G2 X$ `
" T- N: D ]+ d q* q0 Z7 O, F+ C3 w
$ q! U7 ^, l" Y) |1 b! K4 Z5 ?2 n8 l- O; v0 o9 x' }$ Z8 j
|
zan
|