|
目录
一、爬虫
1.1 爬取目标
本次爬取的目标是,2021年胡润百富榜的榜单数据:胡润百富 - 榜单
页面上能看到的信息有:
排名、财富值、排名变化、个人信息(姓名、性别、年龄)、企业信息(企业名称、所属行业)
页面结构很整齐,数据也很完整,非常适合爬虫和数据分析使用。
1.2 分析页面
老规矩,打开Chrome浏览器,按F12进入开发者模式,依次点击Network->Fetch/XHR,准备好捕获ajax请求。
重新刷新一下页面,发现一条请求:
在预览界面,看到一共20条(0~19)返回数据,正好对应页面上的20个富豪信息。
所以,后面编写爬虫代码,针对这个地址发送请求就可以了。
另外,关于翻页,我的个人习惯是,选择每页显示最多的数据量,这样能保证少翻页几次,少发送几次请求,防止被对端服务器反爬。
所以,每页选择200条数据:
再刷新一下页面,进行几次翻页,观察请求地址的变化规律:
以翻到第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格式解析返回的请求数据:(一行代码即可完成接收)
由于解析的字段较多,这里不再赘述详细过程,字段信息包含:
- 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的数据吧:
数据一共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名富豪:
描述性统计:
从描述性统计,可以得出结论:
从最大值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')
复制代码 可视化图:
结论:<strong>大部分富豪的年龄在50-60岁,其次是60-70和40-50岁。极少数富豪在20-30岁(年轻有为
来源:https://www.cnblogs.com/mashukui/p/17012244.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作! |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|