- 在线时间
- 514 小时
- 最后登录
- 2023-12-1
- 注册时间
- 2018-7-17
- 听众数
- 15
- 收听数
- 0
- 能力
- 0 分
- 体力
- 40279 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 12795
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1419
- 主题
- 1178
- 精华
- 0
- 分享
- 0
- 好友
- 15
TA的每日心情 | 开心 2023-7-31 10:17 |
|---|
签到天数: 198 天 [LV.7]常住居民III
- 自我介绍
- 数学中国浅夏
 |
目录) i8 z+ k. t% o
6 r5 N/ [6 {+ B; g% p$ w6 e1 z
文章目录$ J& W9 s8 {. C2 U8 J. @2 F/ \# b
' ?& \( s, x2 \+ S. p1 [8 y6 f, T0 ?) L
前言
% A2 ?" U) N4 x6 }' ^ R* e0 \9 L4 A' ?
一、数据爬取- Z' g# W7 n% N3 f' F8 D7 s
! s5 A: M6 \7 a2 H5 K6 ? ^二、数据预处理
6 a! K: ~8 v) h) j/ ? `. o* G9 k ?1 i7 i& F8 }0 k+ v, N
前言
+ C/ Q$ g; c! F5 D本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。' _/ F: H3 p9 c
$ }2 x/ O9 ?4 J4 @: L
. ?; x# E. L' {8 `一、数据爬取
/ y0 Q! R# z+ F( L: a& b- |0 Uimport requests: z6 q; L+ U+ P0 \/ v! v2 N
import pandas as pd
2 b3 [: l( r8 t8 bfrom pprint import pprint7 ]$ H& h1 p7 Z( m' p1 K8 x" f
导入相关库* W8 U# G$ [) G0 V( K: {
1 b: x3 p; L. W' ?. M
requests库用于发起网页请求,获取网页中的源代码;
; Y9 D2 N) A5 p2 `& B( C5 }- G {- W- a3 _4 h) ?& j/ k/ f5 ~
pandas库用于存储和读取获取到的信息;
$ u0 ]/ K( z4 Q6 W$ k* c2 G' g+ p) A, q+ x3 |" K
pprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;
2 t3 P% I. \' k" ~2 U6 o2 Z6 m% d$ ~, s# ?
url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'2 `1 i; @$ z0 t7 n9 V7 n3 B
data1 = requests.get(url).json()! A" h# D: L4 j* ?
# pprint(data1). Z7 J" N. l: K* g
6 l* R" P; c4 q c% @这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。
! w! p3 a1 m, a. mdf1 = pd.DataFrame()2 y; V. ?: n- ^4 r$ e) A2 L/ z; d
for info in data1['body']['allMedalData']:
2 q. c( S+ _3 o+ h name = info['countryName']
- z3 a! {+ _1 I5 T/ j% M a name_id = info['countryId']& P: [; X! P! h, R, N: v+ a
rank = info['rank']
+ _* K9 ]: o4 X' S* w) q gold = info['goldMedalNum']
) I8 |/ X( d$ L( d4 ~7 f7 d* n silver = info['silverMedalNum']
) R' g& r' n4 `- g9 d$ l+ }9 N bronze = info['bronzeMedalNum']4 o9 t* q6 K% v6 D9 x1 S5 i
total = info['totalMedalNum']
8 x/ @/ x4 r8 U9 N # 组织数据
0 _3 e/ Q, s1 [6 R. G7 F; b, C orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]
' e8 T3 u/ a; N( _& g& S # 然后追加df3 E% W# w- K5 A! k9 }
df1 = df1.append(orangized_data)
* i' q) b5 |, w+ X9 ]0 `df1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数']: N1 Z/ E* g' x+ i) ?. u4 Y' X
df17 p3 {7 `" H3 M
2 U! S" O" r3 c9 h7 Z" {
. N4 m# W& Q0 F; W% j8 u
这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。! i9 l4 ~' ^8 y9 T; \9 F2 f
url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609'% d q" S( L+ ]1 \; J
data2 = requests.get(url).json()
, ?( @0 n( r% T: w/ y#pprint(data2)
c, f3 c+ d$ U. E& R: @
3 A) }: g. G }& S$ Ndf2 = pd.DataFrame()
" ^" N( k2 y1 c- }; efor info in data2['body']['medalTableDetail']:
0 g. C# {8 {; S% @6 V+ T english_name = info['countryName']/ G+ K) H6 r: F; [4 c
name_id = info['countryId']. l* Z8 J3 D& b" l
award_time = info['awardTime']
7 g$ ?& a! {$ |# P2 ^9 U+ ] item_name = info['bigItemName']
; g$ R. Z& }3 k$ M1 `$ S sports_name = info['sportsName']
5 l `4 X/ D4 e medal_type = info['medalType']% r. N8 l: S) w7 H. D4 n
# 组织数据
) d, w v# e( v- s3 e orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]
i8 h1 A" ?+ Y. v3 v$ o # 然后追加df4 M8 w8 [/ t4 W" Y
df2 = df2.append(orangized_data)
0 q+ f$ ]$ E- Kdf2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']
) Z& ]. u' d& q' j) Edf2![]()
/ Q" Y0 e0 b% f* T: m$ D* R7 q: v) k( l5 f$ X
对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。
" c+ y( v4 X5 b4 X; i I$ t
. w+ P$ }) w, ]( W. ?, Y5 x& L' s9 Y
二、数据预处理
. |9 z5 C4 c: `8 e G由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。
6 f" l8 T1 a' M
6 o( g5 j* w+ V% i" j; J0 j. }4 N* pwith open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:
5 O) b1 k- S1 k! a' X% C x = f.read()$ b" h$ ]. _3 b3 D
, f6 H. K- }: e) p r) Q' Hdf3 = pd.DataFrame()( A& G, y/ ?: E
for i in x.split("\n"):
! j. l; i6 h1 m. S& ] x = i.split(":")[0].strip()2 j& A! L3 h4 |) b; @, |+ t, [
y = i.split(":")[1].strip()
# t! Q9 `1 p2 F" B# g orangined_data = [[x,y]]
' z) K0 W7 X* ?% s+ C df3 = df3.append(orangined_data) N7 h; T$ g4 s" e# s
df3.columns = ["名称","英文名称"]
5 Y7 o1 p; x$ O) W* w8 hdf3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None)/ f1 Z9 b$ h4 [2 k; K5 C7 o& m2 |
表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。
0 v$ P% l6 Z5 `& Y2 t3 j8 p4 S c+ [- `- k% P* Z, d8 E# V0 V2 j( }
df4 = pd.merge(df1,df3,on="名称",how="left"). ]1 p: g* w/ j2 [ n4 C
df4.head(10)
* v0 ]0 ~. X: {; ~9 _3 O
3 X" [. o' \+ w6 n# t![]()
: `4 ~: _0 _' D |( U/ i表格df5表示运动项目获奖详情。
: P+ J+ S3 A* t+ M' D
, V) v% J) B+ V) Z" F, l* @7 q0 k0 V! D: a
/ P7 A& F8 s) z! M6 C" g
- |% k: _& R) h( X+ v/ M/ K0 T |
zan
|