用 Python 分析全球最美Top100女神

Python中文社区

共 8164字,需浏览 17分钟

 · 2021-02-04

一、前言

前一段时间,国外媒体 TOP BEAUTY WORLD 评选了全球最帅男性和最美女性Top100,肖战成为了该排行榜历届以来首位登顶的亚洲人。这一消息立刻成为了流量的热点。

想看一下榜单中的最美小姐姐的信息。可是现在还没有最美小姐姐的文字榜单信息。但网站里有上一届的全球最美女性前一百名的榜单数据,包含了姓名、地区和职业等信息。

全球最美 Top100 女神榜单数据,怎能不获取下来好好探究一波?下面我们利用 Python 爬虫将榜单数据获取下来,并进行数据可视化。

二、爬取数据

首先,我们想要获取到的数据,包括小姐姐的姓名、地区、职业等信息。检查发现网页属于静态网页,因此可以直接分析网页源代码,提取出我们想要的数据。

Python代码如下:

# -*- coding: UTF-8 -*-
"""
@File    :spider.py
@Author  :叶庭云
@CSDN    :https://yetingyun.blog.csdn.net/
"""

import requests
from lxml import etree
import logging
from fake_useragent import UserAgent
import openpyxl

wb = openpyxl.Workbook()
sheet = wb.active
sheet.append(['ranking''name''country''occupation''up_score''down_score'])
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s: %(message)s')
# 随机产生请求头
ua = UserAgent(verify_ssl=False, path='fake_useragent.json')

headers = {
    "accept-encoding""gzip",
    "upgrade-insecure-requests""1",
    "user-agent": ua.random,
}

url = "https://kingchoice.me/topic-the-100-most-beautiful-women-in-the-world-2020-close-jan-29-2021-1255.html?option=40924"
response = requests.get(url, headers=headers)
# print(response.status_code)
# print(response.text)
html = etree.HTML(response.text)
lis = html.xpath('//div[@class="channel-box3-body box3-body"]/ul/li')
logging.info(len(lis))   # 100条信息

for index_, li in enumerate(lis, start=1):
    src = li.xpath('.//div[@class="avatar"]/img/@src')[0]     # 图片
    name = li.xpath('.//div[@class="info"]/a/h3/text()')[0]   # 姓名
    country, occupation = li.xpath('.//div[@class="info"]/span/text()')[0].split(' '1)  # 地区 职业
    up_score = li.xpath('.//div[@class="des"]/div[1]/ul/li[1]/span/text()')[0]    # up分数
    down_score = li.xpath('.//div[@class="des"]/div[1]/ul/li[2]/span/text()')[0]  # down分数
    img = requests.get(src, headers=headers).content
    with open(r'.\Top100_beauty_img\{}.jpg'.format(name), 'wb'as f:
        f.write(img)
    sheet.append([index_, name, country, occupation, up_score, down_score])
    logging.info([index_, name, country, occupation, up_score, down_score])
    logging.info('已保存{}的信息'.format(name))

wb.save(filename='datas.xlsx')

结果如下:

三、数据可视化

先来看看全球最美 Top100 女神得分情况

# -*- coding: UTF-8 -*-
"""
@File    :得分.py
@Author  :叶庭云
@CSDN    :https://yetingyun.blog.csdn.net/
"""

import pandas as pd
import pyecharts.options as opts
from pyecharts.charts import Line
from pyecharts.datasets import register_files
from pyecharts.globals import CurrentConfig

# 导入自定义的主题 可自己定制  也可以就用pyecharts官方的几种
register_files({"myTheme": ["themes/myTheme""js"]})
CurrentConfig.ONLINE_HOST = 'D:/python/pyecharts-assets-master/assets/'

df = pd.read_excel('datas.xlsx')
up_score = list(df['up_score'])
down_score = list(df['down_score'])
x_data = [i for i in range(1101)]

c = (
    Line(init_opts=opts.InitOpts(theme='myTheme'))
    .add_xaxis(xaxis_data=x_data)
    .set_colors(['#7FFF00''red'])     # 设置两条折线图的颜色
    .add_yaxis('up_score', y_axis=up_score,
               label_opts=opts.LabelOpts(is_show=False)
               )
    .add_yaxis('down_socre', y_axis=down_score,
                label_opts=opts.LabelOpts(is_show=False)
               )
    .set_global_opts(     # 设置x轴 y轴标签
        xaxis_opts=opts.AxisOpts(name='排名'),
        yaxis_opts=opts.AxisOpts(name='得分'),
        title_opts=opts.TitleOpts('得分情况')

    )
    .render('得分.html')
)

结果如下:排第一、第二的 Lalisa Manoban 和 Taylor Swift 得分远远高于之后的美女。

Top100 美女地区分布

榜单上美女来自全球各地,分析那些地区上榜美女人数最多,取Top10。注意,有些美女是混血,比如上面的 "English-American",我们将其统计两次,即既是英国人也是美国人。
# -*- coding: UTF-8 -*-
"""
@File    :女神地区.py
@Author  :叶庭云
@CSDN    :https://yetingyun.blog.csdn.net/
"""

import pandas as pd
from collections import Counter
from pyecharts import options as opts
from pyecharts.charts import Bar
from pyecharts.globals import ThemeType, CurrentConfig
import random

CurrentConfig.ONLINE_HOST = 'D:/python/pyecharts-assets-master/assets/'

df = pd.read_excel('datas.xlsx')
areas = df['country']
area_list = []
for item in areas:
 if '-' in item:
  item = item.split('-')
  for i in item:
   area_list.append(i)
 else:
  area_list.append(item)

area_count = Counter(area_list).most_common(10)
print(area_count)
area = [x[0for x in area_count]
nums = [y[1for y in area_count]
# 使用风格
bar = Bar(init_opts=opts.InitOpts(theme=ThemeType.MACARONS))
colors = ['red''#0000CD''#000000''#008000''#FF1493''#FFD700''#FF4500''#00FA9A''#191970''#9932CC']
random.shuffle(colors)
# 配置y轴数据  Baritem
y = []
for i in range(10):
 y.append(
  opts.BarItem(
   name=area[i],
   value=nums[i],
   itemstyle_opts=opts.ItemStyleOpts(color=colors[i])   # 设置每根柱子的颜色
  )
 )
bar.add_xaxis(xaxis_data=area)
bar.add_yaxis("上榜美女数", y)
bar.set_global_opts(xaxis_opts=opts.AxisOpts(
         name='国家',
         axislabel_opts=opts.LabelOpts(rotate=45)
         ),
     yaxis_opts=opts.AxisOpts(
         name='上榜美女数', min_=0, max_=55,     # y轴刻度的最小值 最大值
     ),
     title_opts=opts.TitleOpts(
      title="各地区上榜美女数",
      title_textstyle_opts=opts.TextStyleOpts(
       font_family="KaiTi", font_size=25, color="black"
      )
     ))
# 标记最大值  最小值  平均值   标记平均线
bar.set_series_opts(label_opts=opts.LabelOpts(is_show=False),
     markpoint_opts=opts.MarkPointOpts(
     data=[
      opts.MarkPointItem(type_="max", name="最大值"),
      opts.MarkPointItem(type_="min", name="最小值"),
      opts.MarkPointItem(type_="average", name="平均值")]),
     markline_opts=opts.MarkLineOpts(
     data=[
      opts.MarkLineItem(type_="average", name="平均值")]))
bar.render("女神地区分布.html")

结果如下:可以看到,英美地区的美女上榜人数最多,占了一半多,其次是韩国、中国的美女。

import pandas as pd
    
df = pd.read_excel('datas.xlsx')
data = df[df['country'].str.contains('Chinese')]
data.to_excel('test.xlsx', index=False)

发现国内上榜的美女,职业均是演员。

import pandas as pd

df = pd.read_excel('datas.xlsx')
data = df['occupation'].value_counts()
print(data)
结果如下:
Actress       69
Singer        18
Model         10
Atress         1
model          1
TV Actress     1
Name: occupation, dtype: int64

Process finished with exit code 0

最后看看美女们的职业

再检查了网站里数据发现,有个别数据美女职业是模特,其他都是Model,就这一个写为model,还有某一个Actress拼写错误,弄成了Atress。还有一个的职业是 TV Actress,也将她归入演员 Actress 内。数据量少,我们直接在表格中找到,将其更改。

# -*- coding: UTF-8 -*-
"""
@File    :职业分布.py
@Author  :叶庭云
@CSDN    :https://yetingyun.blog.csdn.net/
"""

import pandas as pd
from collections import Counter
from pyecharts.charts import Pie
from pyecharts import options as opts
from pyecharts.globals import ThemeType, CurrentConfig

# 引用本地js资源渲染
CurrentConfig.ONLINE_HOST = 'D:/python/pyecharts-assets-master/assets/'

df = pd.read_excel('datas.xlsx')
data = list(df['occupation'])
job_count = Counter(data).most_common()

pie = Pie(init_opts=opts.InitOpts(theme=ThemeType.MACARONS))
# 富文本效果  环图
pie.add('职业', data_pair=job_count, radius=["40%""55%"],
        label_opts=opts.LabelOpts(
            position="outside",
            formatter="{a|{a}}{abg|}\n{hr|}\n {b|{b}: }{c}  {per|{d}%}  ",
            background_color="#eee",
            border_color="#aaa",
            border_width=1,
            border_radius=4,
            rich={
                "a": {"color""#999""lineHeight"22"align""center"},
                "abg": {
                    "backgroundColor""#e3e3e3",
                    "width""100%",
                    "align""right",
                    "height"22,
                    "borderRadius": [4400],
                },
                "hr": {
                    "borderColor""#aaa",
                    "width""100%",
                    "borderWidth"0.5,
                    "height"0,
                },
                "b": {"fontSize"16"lineHeight"33},
                "per": {
                    "color""#eee",
                    "backgroundColor""#334455",
                    "padding": [24],
                    "borderRadius"2,
                },
            },
        ),)
pie.set_global_opts(title_opts=opts.TitleOpts(title='职业占比'))
pie.set_colors(['red''orange''purple'])   # 设置颜色
pie.render('美女职业分布.html')

榜单中美女们的职业,主要有三种:演员、模特、歌手。这些职业都对各方面都有一定要求,才能发展得好。职业的占比中,可以看到演员的占比是最高的,因为颜值是一个演员重要的名片,特别是如今这样一个看颜值的时代,也是打分成绩中占比最高的一项,因此在榜单中,演员占比最高也就不足为奇了。

作者:叶庭云
CSDN:https://yetingyun.blog.csdn.net/

热爱可抵岁月漫长,发现求知的乐趣,在不断总结和学习中进步,与诸君共勉。


更多阅读



2020 年最佳流行 Python 库 Top 10


2020 Python中文社区热门文章 Top 10


5分钟快速掌握 Python 定时任务框架

特别推荐





点击下方阅读原文加入社区会员

浏览 45
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报