【爬虫+数据分析+数据可视化】python数据分析全流程《胡润百富榜》榜单数据!

一、爬虫

大家好,我是@马哥python说,一名10年程序猿。

1.1 爬取目标

本次爬取的目标是,2021年胡润百富榜的榜单数据:胡润百富 - 榜单

榜单页面

页面上能看到的信息有:
排名、财富值、排名变化、个人信息(姓名、性别、年龄)、企业信息(企业名称、所属行业)
页面结构很整齐,数据也很完整,非常适合爬虫和数据分析使用。

1.2 分析页面

老规矩,打开Chrome浏览器,按F12进入开发者模式,依次点击Network->Fetch/XHR,准备好捕获ajax请求。

重新刷新一下页面,发现一条请求:
开发者模式

在预览界面,看到一共20条(0~19)返回数据,正好对应页面上的20个富豪信息。
所以,后面编写爬虫代码,针对这个地址发送请求就可以了。
另外,关于翻页,我的个人习惯是,选择每页显示最多的数据量,这样能保证少翻页几次,少发送几次请求,防止被对端服务器反爬。

所以,每页选择200条数据:
翻页

再刷新一下页面,进行几次翻页,观察请求地址的变化规律:
url变化

以翻到第3页为例,url中的offset(偏移量)为400,limit(每页的条数)为200,所以,可得出规律:

offset = (page - 1) * 200
limit = 200

下面开始编写爬虫代码。

1.3 爬虫代码

首先,导入需要用到的库:

import requests  # 发送请求
import pandas as pd  # 存入excel数据
from time import sleep  # 等待间隔,防止反爬
import random  # 随机等待

根据1.2章节分析得出的结论,编写逻辑代码,向页面发送请求:

# 循环请求1-15页
for page in range(1, 16):
    # 胡润百富榜地址
    sleep_seconds = random.uniform(1, 2)
    print('开始等待{}秒'.format(sleep_seconds))
    sleep(sleep_seconds)
    print('开始爬取第{}页'.format(page))
    offset = (page - 1) * 200
    url = 'https://www.hurun.net/zh-CN/Rank/HsRankDetailsList?num=YUBAO34E&search=&offset={}&limit=200'.format(offset)
    # 构造请求头
    headers = {
        'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Mobile Safari/537.36',
        'accept': 'application/json, text/javascript, */*; q=0.01',
        'accept-language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7',
        'accept-encoding': 'gzip, deflate, br',
        'content-type': 'application/json',
        'referer': 'https://www.hurun.net/zh-CN/Rank/HsRankDetails?pagetype=rich'
    }
    # 发送请求
    r = requests.get(url, headers=headers)

用json格式解析返回的请求数据:(一行代码即可完成接收)

json_data = r.json()

由于解析的字段较多,这里不再赘述详细过程,字段信息包含:

Fullname_Cn_list = []  # 全名_中文
Fullname_En_list = []  # 全名_英文
Age_list = []  # 年龄
BirthPlace_Cn_list = []  # 出生地_中文
BirthPlace_En_list = []  # 出生地_英文
Gender_list = []  # 性别
Photo_list = []  # 照片
ComName_Cn_list = []  # 公司名称_中文
ComName_En_list = []  # 公司名称_英文
ComHeadquarters_Cn_list = []  # 公司总部地_中文
ComHeadquarters_En_list = []  # 公司总部地_英文
Industry_Cn_list = []  # 所在行业_中文
Industry_En_list = []  # 所在行业_英文
Ranking_list = []  # 排名
Ranking_Change_list = []  # 排名变化
Relations_list = []  # 组织结构
Wealth_list = []  # 财富值_人民币_亿
Wealth_Change_list = []  # 财富值变化
Wealth_USD_list = []  # 财富值_美元
Year_list = []  # 年份

最后,依然采用我最习惯的保存数据的方法,先拼装DataFrame数据:

df = pd.DataFrame(  # 拼装爬取到的数据为DataFrame
        {
            '排名': Ranking_list,
            '排名变化': Ranking_Change_list,
            '全名_中文': Fullname_Cn_list,
            '全名_英文': Fullname_En_list,
            '年龄': Age_list,
            '出生地_中文': BirthPlace_Cn_list,
            '出生地_英文': BirthPlace_En_list,
            '性别': Gender_list,
            '照片': Photo_list,
            '公司名称_中文': ComName_Cn_list,
            '公司名称_英文': ComName_En_list,
            '公司总部地_中文': ComHeadquarters_Cn_list,
            '公司总部地_英文': ComHeadquarters_En_list,
            '所在行业_中文': Industry_Cn_list,
            '所在行业_英文': Industry_En_list,
            '组织结构': Relations_list,
            '财富值_人民币_亿': Wealth_list,
            '财富值变化': Wealth_Change_list,
            '财富值_美元': Wealth_USD_list,
            '年份': Year_list
        }
                )

再用pandas的to_csv方法保存:

# 保存结果数据
df.to_csv('2021胡润百富榜.csv', mode='a+', index=False, header=header, encoding='utf_8_sig')

注意,加上这个编码格式选项(utf_8_sig),否则产生乱码哦。
爬虫开发完成,下面展示结果数据。

1.4 结果数据

看一下榜单上TOP20的数据吧:
top20数据

数据一共2916条,19个字段信息,含:

排名、排名变化、全名中文、全名英文、年龄、出生地中文、出生地英文、性别、公司名称中文、公司名称英文、公司总部地中文、公司总部地英文、所在行业中文、所在行业英文、组织结构、财富值人民币亿、财富值变化、 财富值_美元、年份。

数据信息还是很丰富的,希望能够挖掘出一些有价值的结论!

二、数据分析

2.1 导入库

首先,导入用于数据分析的库:

import pandas as pd  # 读取csv文件
import matplotlib.pyplot as plt  # 画图
from wordcloud import WordCloud  # 词云图

增加一个配置项,用于解决matplotlib中文乱码的问题:

# 解决中文显示问题
plt.rcParams['font.sans-serif'] = ['SimHei']  # 显示中文标签  # 指定默认字体
plt.rcParams['axes.unicode_minus'] = False  # 解决保存图像是负号'-'显示为方块的问题

读取csv数据:

# 读取csv数据
df = pd.read_csv('2021胡润百富榜.csv')

2.2 数据概况

查看数据形状:
几行几列

查看前3名富豪:
前3名

查看最后3名富豪:
后3名

描述性统计:
描述性统计

从描述性统计,可以得出结论:
从最大值3900亿、最小值20亿、方差242来看,分布很零散,各位富豪掌握的财富差距很大,马太效应明显。

2.3 可视化分析

2.3.1 财富分布

代码:

df_Wealth = df['财富值_人民币_亿']
# 绘图
df_Wealth.plot.hist(figsize=(18, 6), grid=True, title='财富分布-直方图')
# 保存图片
plt.savefig('财富分布-直方图.png')

可视化图:
财富分布-直方图

结论:大部分的富豪的财富集中在20亿~400亿之间,个别顶级富豪的财富在3000亿以上。

2.3.2 年龄分布

代码:

# 剔除未知
df_Age = df[df.年龄 != '未知']
# 数据切割,8个分段
df_Age_cut = pd.cut(df_Age.年龄.astype(float), bins=[20, 30, 40, 50, 60, 70, 80, 90, 100])
# 画柱形图
df_Age_cut.value_counts().plot.bar(figsize=(16, 6), title='年龄分布-柱形图')
# 保存图片
plt.savefig('年龄分布-柱形图.png')

可视化图:
年龄分布-柱形图

结论:大部分富豪的年龄在50-60岁,其次是60-70和40-50岁。极少数富豪在20-30岁(年轻有为👍)

2.3.3 公司总部分布

代码:

df_ComHeadquarters = df['公司总部地_中文'].value_counts()
# 绘图
df_ComHeadquarters.nlargest(n=30).plot.bar(
    figsize=(16, 6),  # 图片大小
    grid=False,  # 显示网格
    title='公司总部分布TOP30-柱形图'  # 图片标题
)
# 保存图片
plt.savefig('公司总部分布TOP30-柱形图.png')

可视化图:
公司总部分布TOP30-柱形图

结论:公司分布城市,大多集中在北上广深等一线城市,另外杭州、香港、苏州也位列前茅。

2.3.4 性别分布

代码:

df_Gender = df['性别'].value_counts()
# 绘图
df_Gender.plot.pie(
    figsize=(8, 8),  # 图片大小
    legend=True,  # 显示图例
    autopct='%1.2f%%',  # 百分比格式
    title='性别占比分布-饼图',  # 图片标题
)
# 保存图片
plt.savefig('性别占比分布-饼图.png')

可视化图:
性别占比分布-饼图

结论:男性富豪占据绝大多数,个别女性在列(巾帼不让须眉👍)

2.3.5 行业分布

代码:

df_Industry = df['所在行业_中文'].value_counts()
df_Industry.nlargest(n=20).plot.bar(
    figsize=(18, 6),  # 图片大小
    grid=False,  # 显示网格
    title='行业分布TOP20-柱形图'  # 图片标题
)
# 保存图片
plt.savefig('行业分布TOP20-柱形图.png')

可视化图:
行业分布TOP20-柱形图

结论:百富榜中占比最多的行业分别是:房地产、医药、投资、化工等。

2.3.6 组织结构分布

代码:

df_Relations = df['组织结构'].value_counts()
# 绘图
df_Relations.plot.pie(
    figsize=(8, 8),  # 图片大小
    legend=True,  # 显示图例
    autopct='%1.2f%%',  # 百分比格式
    title='组织结构分布-饼图',  # 图片标题
)
# 保存图片
plt.savefig('组织结构分布-饼图.png')

可视化图:
组织结构分布-饼图

结论:半数以上是未知,企业未对外开放,或榜单没有统计到;家族和夫妇占据前两类。

2.3.7 公司名称词云图

代码:

ComName_list = df['公司名称_中文'].values.tolist()
ComName_str = ' '.join(ComName_list)
stopwords = []  # 停用词
# backgroud_Image = np.array(Image.open('幻灯片2.png'))  # 读取背景图片
wc = WordCloud(
    scale=3,  # 清晰度
    background_color="white",  # 背景颜色
    max_words=1000,#最大字符数
    width=800,  # 图宽
    height=500,  # 图高
    font_path='/System/Library/Fonts/SimHei.ttf',  # 字体文件路径,根据实际情况替换
    stopwords=stopwords,  # 停用词
    #   mask=backgroud_Image,  # 背景图片
)
wc.generate_from_text(ComName_str)  # 生成词云图
wc.to_file('2021胡润百富榜_公司名称_词云图.png')  # 保存图片
wc.to_image()  # 显示图片

可视化图:
公司名称-词云图

结论:阿里系公司占据榜首,其次是海天味业等。

三、整体结论

综上所述,针对2021年胡润百富榜的榜单数据,得出如下结论:

财富分布:大部分的富豪的财富集中在20亿~400亿之间,个别顶级富豪的财富在3000亿以上。
年龄分布:大部分富豪的年龄在50-60岁,其次是60-70和40-50岁。极少数富豪在20-30岁(年轻有为👍)
城市分布:公司分布城市,大多集中在北上广深等一线城市,另外杭州、香港、苏州也位列前茅
性别分布:男性富豪占据绝大多数,个别女性在列(巾帼不让须眉👍)
行业分布:百富榜中占比最多的行业分别是:房地产、医药、投资、化工等
组织结构分布:半数以上是未知,企业未对外开放,或榜单没有统计到;家族和夫妇占据前两类。
公司名称分布:阿里系公司占据榜首,其次是海天味业等。

四、同步视频讲解

4.1 上集(爬虫讲解)

爬虫讲解视频:
https://www.zhihu.com/zvideo/1492523459087896577

4.2 下集(数据分析讲解)

可视化讲解视频:
https://www.zhihu.com/zvideo/1492525821340729344


by 马哥python说

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,524评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,869评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,813评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,210评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,085评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,117评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,533评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,219评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,487评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,582评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,362评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,218评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,589评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,899评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,176评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,503评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,707评论 2 335

推荐阅读更多精彩内容