- 在线时间
- 514 小时
- 最后登录
- 2023-12-1
- 注册时间
- 2018-7-17
- 听众数
- 15
- 收听数
- 0
- 能力
- 0 分
- 体力
- 40270 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 12792
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1419
- 主题
- 1178
- 精华
- 0
- 分享
- 0
- 好友
- 15
TA的每日心情 | 开心 2023-7-31 10:17 |
|---|
签到天数: 198 天 [LV.7]常住居民III
- 自我介绍
- 数学中国浅夏
 |
目录
7 f7 h$ M0 n% W$ k) z6 ~) V+ v: O7 t6 R, w" q( [2 x
文章目录
2 [ }3 a) K; K8 m; |- N
; r' }' G1 z3 a7 [: C) Q8 P1 z' ?: [前言
3 r9 C5 R/ r; f$ _9 }; v" ?# w, I V4 o* U2 N2 d* c0 W. b
一、数据爬取; o. n. x6 Q) }% r( l' C
% f$ F( d' a( S1 O- L- B* E z二、数据预处理# R. N t: V8 u- l+ _/ t% N5 q
( p! g# d7 H5 o: [. K! \# O9 O0 }8 t
前言
; m/ K1 _- U, O* r) K" {8 S& _ Q本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。
. N5 ]9 ~- x! N/ f+ s0 r4 E: Q" `+ \" u+ k0 G2 u$ T7 g K
# f% h' `! H% ?6 ~' v" N
一、数据爬取. K2 q+ l7 u8 J: p
import requests9 c0 g& C/ \- J" R, }
import pandas as pd
+ m* `4 p' w/ Z w) bfrom pprint import pprint
9 g7 _( T+ R' n8 B. Y* P4 r( v- I导入相关库6 ^4 v/ \4 C+ W7 j# J
3 B0 ]! B2 S% {6 t4 u
requests库用于发起网页请求,获取网页中的源代码;
. h7 z1 ^6 E% t: t
/ W( i+ f+ [$ w% Spandas库用于存储和读取获取到的信息;1 x7 D4 I: w4 {; H1 n5 p* _/ g6 ^
; @& J9 p2 R% F5 _2 n$ r! n$ ~pprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;. f8 U; U" }# f9 V9 h
* n& G+ o/ K' Q, ourl = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'
! X- y) |1 ?. A: j& c& `& Tdata1 = requests.get(url).json()
! n# W: T1 }' [* s, G' r( D# pprint(data1)
* c, u1 k% S( K. w3 j% l4 ~) v& w' M& }6 K @% F4 i3 Y- `" y
这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。6 h, i! o5 g. ^+ F3 O0 O
df1 = pd.DataFrame()8 e/ Q& d0 @: A# v4 L1 k1 l
for info in data1['body']['allMedalData']:
. _1 H y& _6 Q name = info['countryName']8 O; ~; g4 [6 D0 {3 `( A
name_id = info['countryId']
& a/ N8 @- O$ p& I Y/ C) m rank = info['rank']
Z6 `% S6 o* d( k* ^) v! E gold = info['goldMedalNum']
4 \4 d6 x( [* \6 w3 z/ }( U silver = info['silverMedalNum']1 {9 w2 m8 K* [. g' P, W+ f0 \- S
bronze = info['bronzeMedalNum']
a( }5 p. F" P" l5 ?. X- Q7 a total = info['totalMedalNum']* \8 Y9 J# j, Q. s' i# @, O0 P
# 组织数据
# C+ s* c, W1 B orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]
9 w' B% x0 e* O7 a" f3 s8 { # 然后追加df
4 R" v4 H2 T$ R8 P) Z* S7 b, _ df1 = df1.append(orangized_data)2 e y _4 \: L V
df1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数']
; ]4 ?7 `5 Q* u& U$ } l9 p, r9 @( P# _df1" D* Y6 a; Y( X6 ]
0 ^! N! ~' A$ J7 `
![]()
$ @2 @0 C4 x' [) q这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。
1 B1 p C& o0 u; Aurl = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609'$ q$ ]! `8 l% {' k
data2 = requests.get(url).json()
: r8 T" W' R. D% _4 D: @#pprint(data2)
Q0 T9 f/ w" `4 N/ ]4 e# Q+ o- |8 K/ h4 F, @7 n, \1 B
df2 = pd.DataFrame(), i' V7 j- w6 s( Z
for info in data2['body']['medalTableDetail']:
8 d- d' l; \/ \6 ^ english_name = info['countryName']
) J% Q+ i& n9 ^, T$ F: w8 I name_id = info['countryId']
) o, v: O7 n3 ~% {4 n award_time = info['awardTime']
4 W2 j4 H# N* c1 I, V/ ]* C item_name = info['bigItemName']" T( N' a: V$ E+ r# k
sports_name = info['sportsName']
; g9 V0 Q- L R. J. \( \; ^$ S medal_type = info['medalType'] E) E8 P$ l% }1 l6 v% J- x
# 组织数据
3 \9 [# }4 @% j( B" c3 v# _ | orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]
6 A; D, _: g9 q( @3 A # 然后追加df
; u! L. g5 e; z df2 = df2.append(orangized_data)
6 ], m$ N' C4 ?5 cdf2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']% W4 p m- L' U" D! p+ f+ V
df2![]()
O: U# Q7 T9 W) T) j5 s6 S0 _0 ~9 b; D( b
对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。
/ R' y3 F3 y i) O2 ?+ E( z1 g5 w" y9 E1 L# X( @
7 w! |. Y) } \( @/ s3 l% u* t2 g二、数据预处理
- R) s/ S. _* |6 m. C2 d7 @由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。+ Y* v7 R \4 C8 |( j1 P* w
$ E% c8 b' b- s% N% s4 G* l6 m, @ g" Gwith open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:' U! ^! n: W, s" v8 A; m5 @4 b R8 z
x = f.read()- P1 j: _6 R7 V" I- I
; E/ I6 A1 A; D' ?/ D. Kdf3 = pd.DataFrame()
7 o* \ x+ f, H; {0 Efor i in x.split("\n"):( e: q9 k! M! \ Z4 E
x = i.split(":")[0].strip()
; r V9 D+ K6 Y$ i2 G; P y = i.split(":")[1].strip()
0 _4 p; q7 z+ ` orangined_data = [[x,y]]
8 F, P! F: H, \; C df3 = df3.append(orangined_data); p' W9 E, K; V' E
df3.columns = ["名称","英文名称"]
" w5 z# m" Z9 w- \ z* Ddf3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None)
( h) h0 T& a2 K- j$ u$ ]表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。
: b; d: f- i( [! v0 z( n% L& K7 m! F
df4 = pd.merge(df1,df3,on="名称",how="left")
3 o i- T" I# i9 x4 ddf4.head(10)" R; r/ v/ u/ n6 V& |% S4 s8 _
3 o/ Q( K6 P2 I% W $ g1 `9 ?% A1 K, } @6 g
表格df5表示运动项目获奖详情。 - ( F) h/ c1 ~0 @
4 m. h4 x5 J5 S& |2 d- _6 R& r% k, }! N0 ^% H
8 s4 V$ H$ ~. W8 G7 j+ |$ }) V8 R$ _$ M6 r- @# @: ?
|
zan
|