- 在线时间
- 514 小时
- 最后登录
- 2023-12-1
- 注册时间
- 2018-7-17
- 听众数
- 15
- 收听数
- 0
- 能力
- 0 分
- 体力
- 39951 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 12696
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1419
- 主题
- 1178
- 精华
- 0
- 分享
- 0
- 好友
- 15
TA的每日心情 | 开心 2023-7-31 10:17 |
---|
签到天数: 198 天 [LV.7]常住居民III
- 自我介绍
- 数学中国浅夏
 |
目录8 l% j: L- d( B! J1 @- I* Y6 `
9 @# \! O& F& Z) a/ N. N( H0 b3 Y文章目录* R$ f$ F1 \! c& ` i! g- Z
% U1 V7 C2 k( Q& H前言7 M3 i( ~# O; {3 A
/ o9 ^' m( Y- f; d
一、数据爬取
F% Q% s- Y2 P( `2 t' {" v% Q0 I! f ^( p0 {9 e+ n2 Y: k
二、数据预处理
& S7 U5 F3 D7 C) A' z- I7 ~, R% c9 x# p
前言
# O6 S& X2 {6 b本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。: ]1 M Z& x$ \( v
$ l1 ^% Q# i3 h
' M) |8 ]- D3 p s一、数据爬取, ~6 D! l- B1 G( k7 U; R! H
import requests- T0 L3 w$ w* P% j( c# |! C1 m3 }
import pandas as pd
8 ]1 i3 x# ^4 A% y! o- }: xfrom pprint import pprint* ?1 a: K. ]& ~1 z: X- Q! ~
导入相关库
1 O( X! m$ W6 p. X6 k( n3 H- N
& I. C: Z& r P# s, C4 i1 V, yrequests库用于发起网页请求,获取网页中的源代码;# R- B9 y4 V7 B- l" \
5 C8 n: {& M. n, ], Z% I8 Ppandas库用于存储和读取获取到的信息;4 d, C N7 b8 D+ B8 z3 T
( d7 r( L2 r+ A8 {% c
pprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;# Y: [8 X' y/ |. v6 b
9 G' G( K, S, Y: r$ p( R
url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'' g6 p( M9 \1 K7 T/ ^2 ^- a
data1 = requests.get(url).json()
/ C4 K3 K) e/ G3 l1 n# pprint(data1)0 ~9 \3 B( D/ O& R' a( C& S5 C0 ~( s
2 u# T& [9 s/ P4 l5 u; C这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。
3 C5 O1 f; N: y% y$ o1 d9 m5 vdf1 = pd.DataFrame(): b8 a H+ C! w6 ?+ b7 F
for info in data1['body']['allMedalData']:6 k# A# ]9 e6 u0 o) u
name = info['countryName']: k6 {+ B' D* |- z- x
name_id = info['countryId']
$ c3 L( y" V- g rank = info['rank']
: N+ O: ?2 z2 w9 X0 R gold = info['goldMedalNum']7 i% E, M% r( ^ j) q y' z- G0 A) I# C
silver = info['silverMedalNum']7 |( S+ l" ~3 s( B7 w: u- h9 ?& K
bronze = info['bronzeMedalNum']! f; m: }# f7 ^: h2 g2 K3 p
total = info['totalMedalNum']
- U& r4 b$ \' w+ j! J+ z# f # 组织数据
1 ~2 G- _" J4 b# j! C orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]
: O+ K3 g- N! r) o2 I # 然后追加df
! A$ B2 O" i9 r& i' r df1 = df1.append(orangized_data)
# T6 s4 u( c5 O) {/ Tdf1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数']
4 d" i8 [5 D4 P/ e( B- rdf1
) U* l$ z" T6 f# N- L p& S3 o4 P" Q! q n- Y
1 v0 ?9 y$ D1 |& q9 x7 A6 A3 k
这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。
9 r' g: r* c. L7 a8 i: murl = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609'0 d1 G4 G) q0 K- g4 g
data2 = requests.get(url).json()
. R8 G- ]( @+ L2 ^8 l' Z5 [; x#pprint(data2): f0 N3 c; x3 a7 g4 G7 |
5 [3 F" e( H6 m* y7 odf2 = pd.DataFrame()& @; d, Y; }! ~
for info in data2['body']['medalTableDetail']:) f9 _$ y7 `+ \/ y0 }
english_name = info['countryName']6 Y+ I# @8 C$ z
name_id = info['countryId']5 D; C& a* t3 Z4 T, c
award_time = info['awardTime']
0 F$ o8 B0 i+ A" R item_name = info['bigItemName']
, c$ _6 N$ _; [# x+ A- }; k: Y8 Q sports_name = info['sportsName']9 n2 _ f: V8 X* q/ i) @" h
medal_type = info['medalType']! F5 O N: ?( H& D j: V
# 组织数据
3 z: S% @: R4 z1 n5 r4 W) ~ orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]( j/ e* } ~4 e! x; j# I
# 然后追加df0 z1 ]5 H" Z A/ N$ D8 f* X
df2 = df2.append(orangized_data) {% h7 b* l# ]/ S- t5 d( I& L
df2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']
# Q5 ]9 ~# H2 L- U' Adf2 ( F7 {9 Y* S# I5 {) U* i$ o, v
6 i$ j6 i! g& ]9 r, c6 ?- d
对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。 ' h8 F2 R6 b5 V& H' n/ B
( |1 N" z6 Q$ _' }0 D' {. O/ x& ]
; T3 c" ? R# p: V0 f, n二、数据预处理
% ~0 Z% e2 z @由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。
" ^) j0 |+ ?6 T S7 G6 D
" Y4 G3 u1 M& ~with open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:- C* W$ L% K2 \7 C
x = f.read()
* E6 v' P( C3 y' h; R& ~8 M6 _5 _) M7 [% g+ g
df3 = pd.DataFrame()) y) N) r4 i0 O) s. C. Y) ^% E1 A/ \
for i in x.split("\n"):
' `5 F4 C$ j+ V3 I: [, o3 A x = i.split(":")[0].strip()
& p, v8 E9 P |; Q5 i y = i.split(":")[1].strip(). @/ n' |* Z( m% D
orangined_data = [[x,y]]2 i9 u0 r. A3 d
df3 = df3.append(orangined_data)
$ @( @% e& o8 D0 _( y adf3.columns = ["名称","英文名称"]
2 g/ m% s) V5 @0 s* udf3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None)( p( D% l8 c6 W5 u! M7 g( N. ~
表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。
7 D- b( R1 s. |4 ]7 |- l4 ~, t3 i" O6 _9 s+ X
df4 = pd.merge(df1,df3,on="名称",how="left")' W0 Y& V/ ]% r/ I
df4.head(10)
. d9 Y7 H/ `+ D6 D8 V8 n, @2 a" F0 k; j/ Y2 z
![]()
+ Y7 m [. U" J/ q8 H4 z/ o表格df5表示运动项目获奖详情。
# n1 G8 Y. m) K
( {$ n, n( v) z9 U; C, ]# G& Y) |/ W# ]( V! Y/ B2 A, M
) \% |5 J( D9 N6 C9 a$ }3 h; X+ X% G( H% M: W, h8 K1 i9 M+ r
|
zan
|