- 在线时间
- 514 小时
- 最后登录
- 2023-12-1
- 注册时间
- 2018-7-17
- 听众数
- 15
- 收听数
- 0
- 能力
- 0 分
- 体力
- 40343 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 12814
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1419
- 主题
- 1178
- 精华
- 0
- 分享
- 0
- 好友
- 15
TA的每日心情 | 开心 2023-7-31 10:17 |
|---|
签到天数: 198 天 [LV.7]常住居民III
- 自我介绍
- 数学中国浅夏
 |
目录- P" b! o* v4 y! _/ i
( w: b- ^: u4 s/ u$ M8 s文章目录
/ i# i- D' @7 f1 q* u$ s( y& a
/ j- x; w* W$ H前言
' d$ [* R! r5 z: v6 I% p4 i' j7 m4 M) X
一、数据爬取
: k" ]3 O3 z1 N8 w5 i; ~2 N' m* t6 K1 G# x u/ R V: L, ^
二、数据预处理; ^1 j) J0 |. K
q# y2 q( q) K0 I( }% e
前言
, [* ?: \: Y& s" T6 \- ~, t" S, [本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。! M8 v+ t# l2 m) \( T
9 j' h! a" W# }" n$ y$ H6 z; H
0 V. D) Y b8 M* l& R一、数据爬取
& T% I, O% R8 J" ^ i5 O9 Mimport requests
9 U7 K5 d7 E3 G f* C9 k: ]4 Gimport pandas as pd
# y6 F' ]& f3 Nfrom pprint import pprint
/ N5 x: ~$ r4 O7 x2 X3 f% S导入相关库& z" ~1 U+ x& ~7 u
& x/ c, y6 j0 [/ k p+ {requests库用于发起网页请求,获取网页中的源代码;
$ u, q$ M t, b! h F( p3 l( d# ~6 j: F! ?; V( T
pandas库用于存储和读取获取到的信息;8 D) h+ L# F5 n( _+ ~' h1 q6 \% t& Q
# ?+ ~; U$ I6 C4 n6 j
pprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;. m$ m$ u/ @; H2 u$ x) H
0 R8 l4 h, Q) g% G& O2 n
url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'
% M1 h7 K- W+ G2 q, Pdata1 = requests.get(url).json()
3 n5 `1 J5 [9 {/ J# pprint(data1): }9 C- b9 Y$ x* R5 H5 H1 [* _- ^0 G: \
% I; W% X" h7 Z$ W/ ~/ G
这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。* X( c; Y: F# z- Z4 O4 R" M
df1 = pd.DataFrame()* |6 I" g4 M) M/ I8 u
for info in data1['body']['allMedalData']:# @. h. J$ W8 Z" }
name = info['countryName']
, w+ P( u: A. k name_id = info['countryId']- [# i* L l1 o! b- I( j# y4 Y
rank = info['rank']% k; @6 ~1 l* c6 x( @7 M
gold = info['goldMedalNum']
: G- ?# i$ @9 p1 \$ r, K( u silver = info['silverMedalNum']+ J4 i% T" D$ E: R! y' S" @
bronze = info['bronzeMedalNum']- y( l. ?2 z6 S
total = info['totalMedalNum']
~) G) B# K2 V4 x # 组织数据
; h4 Z- h; ?/ u% g5 ]( |% f$ f orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]; O2 K/ I8 M- ^( O$ g8 G
# 然后追加df) d( E9 L) m$ A
df1 = df1.append(orangized_data)
' I- a/ g4 J( w# S/ {% Ndf1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数']
) M l& K6 o" l/ t8 ~df1
& F. U3 _$ M" u+ ~/ {% W4 k" ]9 H( Q1 [. f
![]()
; G! u+ \! j0 A9 h9 W- \2 A这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。
) }- v4 n/ u' n9 y$ Gurl = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609'$ a% g5 x- K B( N, P5 ]5 l! A4 z
data2 = requests.get(url).json(): n" }1 D$ {# T. k# m
#pprint(data2)
2 H: `8 j7 T$ b6 W
" k% r7 v, E3 F- Ydf2 = pd.DataFrame()
8 \) R i- \1 D; V6 Zfor info in data2['body']['medalTableDetail']:
8 H! y4 Y9 ^6 |: x: F, a english_name = info['countryName']
# ?6 }! \% E" d! c. V name_id = info['countryId']0 R$ c7 Z3 \4 j% L+ n! A! k
award_time = info['awardTime']
" p- h+ {# M* s2 c, [3 F2 y) y0 Z' w2 U item_name = info['bigItemName']6 ?( Y( v" i* ~- G3 z% U0 O
sports_name = info['sportsName']
- e) Z7 c# G8 ?# r9 `2 K. S3 C medal_type = info['medalType']0 B- o* ^0 e, r" |$ @
# 组织数据3 B2 X* ?6 w4 ~" S
orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]
0 d0 ~! D) u# i0 C. n7 q # 然后追加df9 Z# F$ R+ k; J5 {
df2 = df2.append(orangized_data)
R% S4 P* C: xdf2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']
: ]2 _) s! ]- v3 Q! gdf2 " T+ u$ L; v+ }' @ {+ {' H
+ m1 {+ q3 q2 p对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。
& ]. J% Z7 o8 [# @. q2 t. Z3 V# K N0 b1 }
: n$ F% `- n, C& W9 w2 }二、数据预处理4 }% i' a- |1 |6 k
由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。
! c" v3 [% m' W1 z9 I! i4 ] J7 y9 ?3 b5 s3 o/ p$ ?
with open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:
& V& ^" V; U: s7 p: k- G8 [5 Y x = f.read()
9 t( x! ]6 s2 k& [, }9 J
) j9 w4 d) u: r6 S" g# Pdf3 = pd.DataFrame()8 r h# {( W: P" v
for i in x.split("\n"):
" e* t4 z4 W6 ~ x = i.split(":")[0].strip()
3 y9 G- L# a( X y = i.split(":")[1].strip()* c) n$ j" o1 \5 h- k
orangined_data = [[x,y]]
: e0 @3 [5 h3 P% S df3 = df3.append(orangined_data)
6 ~' R+ t- T9 G& ndf3.columns = ["名称","英文名称"]
5 V) L9 K' P6 Q/ G" h! A" `/ `% Idf3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None)
, z- d$ S; {$ ?( P1 y, n& G5 P表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。
2 g0 H# k5 L1 R7 p" c8 S9 g% I* `
df4 = pd.merge(df1,df3,on="名称",how="left")
( B7 t/ `& K7 @2 ddf4.head(10)3 P4 |/ E. z+ e1 F: Y
/ J3 Y' j2 x: G3 O 6 K$ v a( t' h! e, | G- j; u
表格df5表示运动项目获奖详情。
' z8 q9 A* k, U* F
% Y! t3 Z/ k9 ^7 b* M# L" y1 ?' o, S4 q1 ~) l! l$ A, P& a" I
" ?# K, W3 u7 M( y' @/ k0 F. |2 o0 X: k- s5 l
|
zan
|