一、先看结果

1.1创造营2020撑腰榜前三甲

创造营2020撑腰榜前三名分别是 希林娜依·高、陈卓璇 、郑乃馨

>>>df1[df1['排名']<=3 ][['排名','姓名','身高','体重','生日','出生地']]
    排名      姓名     身高    体重           生日 出生地
0  1.0  希林娜依·高    NaN   NaN  1998年07月31日  新疆
1  2.0     陈卓璇  168.0  42.0  1997年08月13日  贵州
2  3.0     郑乃馨    NaN   NaN  1997年06月25日  泰国

撑腰榜前三甲

1.2青春有你2当前官方榜前三甲

青春有你2官方榜(35进20)前三名分别是 刘雨昕、虞书欣、喻言

>>>df2[df2['排名']<=3 ][['排名','姓名','身高','体重','生日','出生地']]
      排名   姓名     身高    体重           生日 出生地
107  1.0  刘雨昕  168.0  48.0  1997年04月20日  贵阳
117  2.0  虞书欣  169.0  50.0  1995年12月18日  上海
118  3.0   喻言  172.0  50.0  1997年05月26日  北京

青春有你2当前官方前三甲

1.3Face++男女视角颜值最高

1.3.1女性视角颜值第一名

得分95.23,来自《创造营2020》的黄若元(已经告别舞台)

>>>df.sort_values(by = 'face++女性眼中颜值',ascending = False).head(1)[['face++女性眼中颜值','姓名','来源','身高','体重','生日','出生地']]
    face++女性眼中颜值   姓名       来源  身高  体重         生日  出生地
95         95.23  黄若元  创造营2020 NaN NaN 1996-03-01  NaN

face++女性视角评分第一

1.3.2男性视角颜值第一名

得分93.773,来自《创造营2020》的孙珍妮(目前位列撑腰榜第19)

>>>df.sort_values(by = 'face++男性眼中颜值',ascending = False).head(1)[['face++男性眼中颜值','姓名','来源','身高','体重','生日','出生地']]
    face++男性眼中颜值   姓名       来源     身高  体重         生日 出生地
18        93.773  孙珍妮  创造营2020  165.0 NaN 2000-05-05  上海

Face++男性视角评分第一

1.4小姐姐们籍贯分布(pyecharts作图)

创造营2020的小姐姐有籍贯记录的41位中,来自四川的有7位,江西、浙江、湖南和湖北的各3位

小姐姐省市分布

青春有你2小姐姐来自最多的省市分别是北京、台湾 各9名,重庆、成都各6名

小姐姐城市分布

二、再看下统计分析

以下是整体数据部分截图(Spyder变量查看器)

小姐姐详情数据

因为整合的信息较多,共17个字段,我们在做分 数据指标 统分的时候只需要用到部分即可。
在做统计分析时,这里核心就是一个 分组统计 (df.groupby())。

>>>df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 210 entries, 0 to 209
Data columns (total 17 columns):
 #   Column        Non-Null Count  Dtype  
---  ------        --------------  -----  
 0   排名            136 non-null    float64
 1   编号            210 non-null    int64  
 2   姓名            210 non-null    object 
 3   照片            210 non-null    object 
 4   状态            210 non-null    object 
 5   粉丝数           101 non-null    object 
 6   星座            168 non-null    object 
 7   身高            137 non-null    float64
 8   体重            120 non-null    float64
 9   出生地           149 non-null    object 
 10  生日            160 non-null    object 
 11  AI预测年龄        210 non-null    int64  
 12  AI颜值评分        210 non-null    int64  
 13  face++AI预测年龄  210 non-null    int64  
 14  face++女性眼中颜值  210 non-null    float64
 15  face++男性眼中颜值  210 non-null    float64
 16  来源            210 non-null    object 
dtypes: float64(5), int64(4), object(8)
memory usage: 28.0+ KB

2.1小姐姐出生地分布

《创造营2020》小姐姐官方信息数据中,出生地只有41/101个,且多以省为标尺,我们统计结果如下:

>>>pro = df1.groupby('出生地')['编号'].count().to_frame('count').sort_values(by = 'count',ascending = False).reset_index()
>>>pro.head() 
   出生地  count
0   四川   7
1   江西   3
2   浙江   3
3   湖南   3
4   湖北   3

《青春有你2》小姐姐官方数据比较全,出生地有108/109,且多以市为标尺,我们统计结果如下:

>>>city = df2.groupby('出生地')['编号'].count().to_frame('count').sort_values(by = 'count',ascending = False).reset_index()
>>>city.head()
   出生地  count
0   北京   9
1   台湾   9
2   重庆   6
3   成都   6
4   上海   5

2.2小姐姐的出生年份分布

出生年份我们合并数据做统一处理吧,一共有160/210份数据,我们统计结果如下:

>>>year = df.groupby('year')['编号'].count().to_frame('count').sort_values(by = 'count',ascending = False).reset_index()
>>>year.head() 
     year  count
0  1997.0     27
1  1995.0     25
2  1996.0     24
3  1998.0     20
4  1999.0     19

2.3小姐姐星座分布

星座分布我们合并数据做统一处理吧,一共有168/210份数据,我们统计结果如下:

>>>conste = df.groupby('星座')['编号'].count().to_frame('count').sort_values(by = 'count',ascending = False).reset_index()
>>>conste
     星座  count
0   狮子座     23
1   天秤座     19
2   摩羯座     19
3   白羊座     16
4   双子座     14
5   射手座     13
6   金牛座     13
7   双鱼座     11
8   天蝎座     11
9   巨蟹座     11
10  水瓶座     10
11  处女座      8

2.4小姐姐身高分布

身高分布我们合并数据做统一处理吧,一共有137/210份数据,我们统计结果如下:

>>>height = df.groupby('身高')['编号'].count().to_frame('count').sort_values(by = 'count',ascending = False).reset_index()
>>>height
       身高  count
0   168.0     27
1   170.0     11
2   165.0     11
3   166.0     11
4   163.0     10
5   167.0      9

身高这种属性,咱们还可以做简单的描述统计分析如下:

(可以看到,最高175cm,最低158cm,平均167.12cm,中位数168cm)

>>>df['身高'].describe()
count    137.000000
mean     167.124088
std        4.080883
min      158.000000
25%      165.000000
50%      168.000000
75%      170.000000
max      175.000000
Name: 身高, dtype: float64

2.5小姐姐体重分布

体重分布我们合并数据做统一处理吧,一共有120/210份数据,我们统计结果如下:

>>>weight = df.groupby('体重')['编号'].count().to_frame('count').sort_values(by = 'count',ascending = False).reset_index()
>>>weight.head() 
     体重  count
0  48.0     20
1  46.0     15
2  50.0     13
3  47.0     13
4  49.0     12

身高这种属性,咱们还可以做简单的描述统计分析如下:
(可以看到,最高87kg???,最低40kg,平均48kg,中位数48kg)

>>>df['体重'].describe()
count    120.000000
mean      48.012500
std        5.081877
min       40.000000
25%       46.000000
50%       48.000000
75%       50.000000
max       87.000000
Name: 体重, dtype: float64

赶快查一下这个87KG的妹子是谁,看了下照片,感觉是官网数据填错了吧,应该47kg或者87斤?才对吧,算了不改了~

>>>df[df['体重']==87][['编号','姓名','来源']] 
            编号   姓名     来源
170  540476547  孙美楠  青春有你2

87KG小姐姐

2.6小姐姐颜值分布

因为腾讯云ai评分,过百的就有40来个,咱们还是用Face++吧

颜值评分这个因为是精确到了小数点后3位,所以咱们在做统分的时候,更适合先进行分箱操作

2.6.1女性角度颜值评分

先看描述统计分析结果:

(可以看到,最高95.23,最低65.596,平均83.742,中位数84.837)

>>>df['face++女性眼中颜值'].describe() 
count    210.000000
mean      83.742038
std        5.340208
min       65.596000
25%       81.028000
50%       84.837500
75%       87.449750
max       95.230000
Name: face++女性眼中颜值, dtype: float64

颜值按照60-100每10分一个档位,我们统计结果如下:

90分以上颜值居然高达16位~

>>>beauty_bins = [60,70,80,90,100] 
>>>beauty_labels = ['60-70', '70-80', '80-90', '90-100']
>>>df['face++女-颜值区间'] = pd.cut(df['face++女性眼中颜值'], bins=beauty_bins, labels=beauty_labels)
>>>df['face++女-颜值区间'].value_counts() 
80-90     155
70-80      34
90-100     16
60-70       5
Name: face++女-颜值区间, dtype: int64

2.6.2男性角度颜值评分

先看描述统计分析结果:

(可以看到,最高93.77,最低66.404,平均82.606,中位数83.482)

>>>df['face++男性眼中颜值'].describe() 
count    210.000000
mean      82.605929
std        5.055116
min       66.404000
25%       79.699250
50%       83.482500
75%       86.409000
max       93.773000
Name: face++男性眼中颜值, dtype: float64

颜值按照60-100每10分一个档位,我们统计结果如下:

90分以上颜值居然只有6位~【难道男性对颜值的要求更高???】

>>>df['face++男-颜值区间'].value_counts() 
80-90     147
70-80      52
90-100      6
60-70       5
Name: face++男-颜值区间, dtype: int64

三、载入需要的库

import requests
from fake_useragent import UserAgent
import pandas as pd
import json
from lxml import etree

3.1使用requests+json获取小姐姐列表

通过F12在开发者界面Network—>XHR中我们可以发现真实数据请求地址(见Headers里的General),以及请求响应的数据格式 是 json。

F12开发者模式查看源地址

参数可以在Headers里的Query String Parameters 里找到

于是我们可以编写以下代码进行数据爬取

def get_Girllist():    
    url = 'https://zbaccess.video.qq.com/fcgi/getVoteActityRankList?'    
    headers = {"User-Agent": UserAgent(verify_ssl=False).random}    
    params = {'raw': 1,
               'vappid': 51902973,
               'vsecret': '14816bd3d3bb7c03d6fd123b47541a77d0c7ff859fb85f21',
               'actityId': 107015,
               'pageSize': 101,
               'vplatform': 3,
               'listFlag': 0,
               'pageContext':'' ,
               'ver': 1,
               #以下两个时间戳参数可以省略
               '_t': 1590324974706,
               '_': 1590324974708
        }
    #请求数据
    re = requests.get(url,headers = headers,params = params) 
    #用json解析json数据成字典   
    data = json.loads(re.text)
    
    Li_list = data['data']['itemList']
    
    rank = 0
    data_list = []
    
    #获取每个选手的基础信息
    for li in Li_list:
        rank += 1
        item = {}
        #获取基础信息
        item['当前排名'] = rank
        item['选手编号'] = li['itemInfo']['id']
        item['选手姓名'] = li['itemInfo']['name']
        item['选手照片'] = li['itemInfo']['mapData']['poster_pic']
        item['选手状态'] = li['statusInfo']['voteBtnTxt']
        
        #获取选手doki页,需要传递选手编号id信息用于循环请求
        #根据选手编号id到选手doki页面获取粉丝数、星座、身高、生日等基础个人信息
        #简单的静态页面,这里用到xpath做解析
        id_ = item['选手编号']
        #调用获取选手doki页数据的函数,具体见get_Girlinfo函数
        html = get_Girlinfo(id_)
        item['粉丝数'] = html.xpath('.//div[@class="followers_count"]/text()')[0]
        info = html.xpath('.//div[@class="wiki_info_1"]//span[@class="content"]/text()')
        item['星座'] = info[-5]
        item['身高'] = info[-3]
        item['体重'] = info[-2]
        item['出生地'] = info[-1]
        info2 = html.xpath('.//div[@class="wiki_info_2"]//span[@class="content"]/text()')
        item['生日'] = info2[0]

        url_ai = item['选手照片']
        #获取腾讯云AI颜值评分
        age,beauty = txfaceScore(url_ai) 
        item['AI预测年龄'] = age
        item['AI颜值评分'] = beauty
        #获取face++颜值评分
        faceage,beauty_w,beauty_m  = ksfaceScore(url_ai) 
        item['face++AI预测年龄'] = faceage
        item['face++女性眼中颜值'] = beauty_w
        item['face++男性眼中颜值'] = beauty_m   
        data_list.append(item)
        
    return data_list

3.2使用requests+xpath获取小姐姐基础信息

def get_Girlinfo(id_):
    url_ = f'https://v.qq.com/x/star/{id_}?tabid=2'
    headers = {"User-Agent": UserAgent(verify_ssl=False).random} 
    re_ = requests.get(url_,headers = headers)
    #直接获取的数据中中文是乱码,我们转化一下编码格式即可
    re_.encoding='utf-8'
    #因本次爬虫我们解析网站源码用到的是xpath,所以需要处理一下
    html = etree.HTML(re_.text)
    #返回处理后的网站数据源码,在小姐姐列表中我们再行处理
    return html

四、使用requests调用api接口获取小姐姐颜值评分

一开始我用的是腾讯云的人脸识别,跑完数据发现101个创造营小姐姐里有21个颜值得了满分,而我喜欢的一个小姐姐朱主爱居然得分最低,那怎么行。所以,本次我们新增了旷视的FACE++人脸识别做颜值评分对比。

4.1腾讯云人脸识别

腾讯云人脸识别需要使用到第三方库tencentcloud-sdk-python

pip install tencentcloud-sdk-python

在进行调用的时候,需要先加载有关包

from tencentcloud.common import credential
from tencentcloud.common.profile.client_profile import ClientProfile
from tencentcloud.common.profile.http_profile import HttpProfile
from tencentcloud.common.exception.tencent_cloud_sdk_exception import TencentCloudSDKException 
from tencentcloud.iai.v20180301 import iai_client, models

#腾讯云人脸检测与分析
#检测给定图片中的人脸(Face)的位置、相应的面部属性和人脸质量信息
#位置包括 (x,y,w,h)
#面部属性包括性别(gender)、年龄(age)、表情(expression)、魅力(beauty)、眼镜(glass)、发型(hair)、口罩(mask)和姿态 (pitch,roll,yaw)
#人脸质量信息包括整体质量分(score)、模糊分(sharpness)、光照分(brightness)和五官遮挡分(completeness)

在第一次使用云 API 之前,用户首先需要在腾讯云控制台上申请安全凭证,安全凭证包括 SecretID 和 SecretKey, SecretID 是用于标识 API 调用者的身份,SecretKey 是用于加密签名字符串和服务器端验证签名字符串的密钥。SecretKey 必须严格保管,避免泄露。

由于我们只需要年龄和颜值评分,因此创建函数时只需要返回age和beauty两个字段即可。

def txfaceScore(url):
    try: 
    	# 实例化一个认证对象,入参需要传入腾讯云账户 secretId,secretKey
        cred = credential.Credential("secretId", "secretKey") 
        httpProfile = HttpProfile()
        httpProfile.endpoint = "iai.tencentcloudapi.com"
    
        clientProfile = ClientProfile()
        clientProfile.httpProfile = httpProfile
        client = iai_client.IaiClient(cred, "ap-beijing", clientProfile) 
    
        req = models.DetectFaceRequest()
        #url即我们需要做颜值评分的小姐姐照片所在网页地址url
        param = {"Url":url,"NeedFaceAttributes":1}
        params = json.dumps(param)
        req.from_json_string(params)
    
        resp = client.DetectFace(req) 
        respstr = resp.to_json_string().replace('false','0').replace('true','1')
        respdic = eval(respstr)
        #返回的数据格式是json,所以在转化为字典后很简单就能找到你需要的数据
        age = respdic['FaceInfos'][0]['FaceAttributesInfo']['Age']
        beauty = respdic['FaceInfos'][0]['FaceAttributesInfo']['Beauty']
        
    except TencentCloudSDKException as err: 
        print(err)
    
    return age,beauty

4.2Face++人脸识别

接口调用很简单,设置好你需要的请求参数(这里我们选择年龄和颜值:age,beauty),由于Face++颜值评分分为男女视角下的颜值分两种,所以我们需要返回三个值:年龄、男/女视角颜值分。

具体函数见下方:

def ksfaceScore(pic_url):
    url = 'https://api-cn.faceplusplus.com/facepp/v3/detect'
    
    APIKey = '你的key' 
    APISecret = '你的secret'
    
    data = {"api_key":APIKey,
            "api_secret":APISecret,
            "image_url":pic_url,
            "return_attributes":"age,beauty"
            }
    res = requests.post(url,data = data)
    dic_ = eval(res.text)
    #返回的数据格式是json,所以在转化为字典后很简单就能找到你需要的数据
    age = dic_['faces'][0]['attributes']['age']['value']
    beauty_w = dic_['faces'][0]['attributes']['beauty']['female_score']
    beauty_m = dic_['faces'][0]['attributes']['beauty']['male_score']
    
    return age,beauty_w,beauty_m

到此这篇关于Python爬虫之爬取2020女团选秀数据的文章就介绍到这了,更多相关python爬取女团内容请搜索程序员的世界以前的文章或继续浏览下面的相关文章希望大家以后多多支持程序员的世界!

Python爬虫之爬取2020女团选秀数据的更多相关文章

  1. 如何利用python实现图片批处理

    前言在训练神经网络之前,我们往往需要对数据集进行批量处理。本文以图片为例,介绍如何使用python实现图片的批量处理,包括批量命名,批量更改图像像素,批量对图片进行Harris、Canny……在此通过以下示例讲解图片遍历方法,并以shi-Tomasi角点检测算法为例,对图片进行批量处理。可实现的功能......

  2. python中re模块的使用(正则表达式)

    一、什么是正则表达式?正则表达式,又称规则表达式,通常被用来检索、替换那些符合某个模式(规则)的文本。正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。二、正则表达式的匹配规则1.表......

  3. pandas读取excel,txt,csv,pkl文件等命令的操作

    pandas读取txt文件读取txt文件需要确定txt文件是否符合基本的格式,也就是是否存在\t,,,等特殊的分隔符一般txt文件长成这个样子txt文件举例下面的文件为空格间隔1 2019-03-22 00:06:24.4463094 中文测试 2 2019-03-22 00:06:32.45656......

  4. Python字符串对齐、删除字符串不需要的内容以及格式化打印字符

    删除字符串中不需要的内容1、strip()方法strip:默认是去掉首尾的空白字符,但是也可以指定其他字符;lstrip:只去掉左边的;rstrip:只去掉右边的;print('+++apple '.strip()) # '+++apple'print('+++apple '.lstrip('+')......

  5. python 基于opencv去除图片阴影

    一、前言如果你自己打印过东西,应该有过这种经历。如果用自己拍的图片,在手机上看感觉还是清晰可见,但是一打印出来就是漆黑一片。比如下面这两张图片:因为左边的图片有大片阴影,所以打印出来的图片不堪入目(因为打印要3毛钱,所以第二张图片只是我用程序模拟的效果)。那有什么办法可以解决吗?答案是肯定的,今天我......

  6. python里glob模块知识点总结

    之前遇到过一类问题,要求快速做文件搜索,当时小编找了很多内容,但是没有发现实现方法,突然看到glob模块便豁然开朗了,该模块主要就是能够实现类似于windows的文件搜索,旗下的函数都可以实现搜索功能,并且有很多通配符,能够应用在多种场景中,一一对应的选择解决方案。简单介绍:匹配一定的格式文件和文件......

  7. Python WSGI 规范简介

    作为 Python Web 开发者来说,在开发程序阶段一般是不会接触到 WSGI 这个名词的,但当程序开发完成,考虑上线部署的时候,WSGI 规范是一个绕不开的话题,本文将介绍何为 WSGI。WSGI 全拼 Web Server Gateway Interface,是为 Python 语言定义的 W......

  8. Python学习(8)(列表的定义、常用操作、关键字函数方法的区别、列表的循环遍历、应用场景)

    Python学习(8)一、python的列表 定义二、python的列表 常用操作三、python的关键字、函数和方法的特点和区别四、python 列表的循环遍历五、python 列表的应用场景高级变量类型列表元组字典字符串python中数据类型可以分为 数字型和非数字型数字型:整型(int)、浮点......

  9. Python 实现进度条的六种方式

    一、普通进度条示例代码import sysimport timedef progress_bar():for i in range(1, 101):print("\r", end="")print("Download progress: {}%: &......

  10. python中Tkinter 窗口之输入框和文本框的实现

    在制作登录页面时学习了TK弹窗的输入文本框的使用,下面让我们一起来学习一下TK弹窗中的输入框及文本框的使用方法吧!输入框要想制作一个输入弹窗其实比较简单,只需要几行代码就可以了,下面先看一下组成输入框的代码吧#定义一个输入文本框# entry = tk.Entry(window, show=&quo......

随机推荐

  1. ViewPager2滑动冲突的解决方法

    ViewPager2滑动冲突解决,供大家参考,具体内容如下本文章对ViewPager2的滑动冲突没有提供完善的解决方案,仅为巩固解决滑动冲突方面的知识首先看看没有解决滑动冲突时写的demo:MainActivity.javapackage com.example.bannerimport andro......

  2. VUE 3.0 初体验之路

    码文不易啊,转载请带上本文链接呀,感谢感谢 https://www.cnblogs.com/echoyya/p/14394057.html在2020年9月中旬,vue.js发布了3.0正式版,在不久的将来,VUE3.0 也终将成为大前端的必然趋势,环境搭建node 版本要求: Node.js8.9 ......

  3. C#通过NI-VISA操作Tektronix TBS 2000B系列示波器

    一、概述本文描述采用C#语言访问控制Tektronix TBS 2000B 系列示波器。接口协议采用NI-VISA。最近一个项目需要和一款示波器进行通信,需要对示波器进行一些简单控制并获取到波形数据。经过一段时间研究,大致了解了相关操作,因为发现相关资料不是很多,所以把我了解的相关知识和大家分享一下......

  4. PHP 对接美团大众点评团购券(门票)的开发步骤

    一、功能简要介绍 1、根据需求,用户在美团大众点评中所购买的门票在自己的系统上可以核销,同时把核销信息存储到自己的系统里。 2、美团点评API文档地址:https://open.dianping.com/document/v2?rootDocId=5000二、开发步骤: ......

  5. python用分数表示矩阵的方法实例

    前言在机器学习中,我们会经常和矩阵打交道。在矩阵的运算中,python默认的输出是浮点数,但是如果我们想要矩阵的元素以分数的形式显示,可以通过添加一行代码来实现。1、函数及参数解释set_printoptions()——控制输出方式formatter——通用格式化输出Fraction(x).limi......

  6. [Java基础]——String类

    此篇博客主要整理Java中的String类的使用。一、String1.1 String 的定义上图是jdk中对String类的定义,得到的信息有:①、String类声明为final的,不可被继承。②、String类实现了Serializable接口,表示字符串是支持序列化的(IO流中使用)。实......

  7. Python创建二叉树

    前言本文的内容是数据结构中二叉树部分最基础的,之所以写一下主要是为了方便刷题的时候,能够在自己电脑上很快的使用这种小的demo进行复杂的练习。二叉树节点定义二叉树的节点定义如下:class TreeNode():#二叉树节点def __init__(self,val,lchild=None,rchi......

  8. Python学习(2) (代码运行的常见错误、python解释器、注释方法、算数运算符)

    Python学习(2)一、python代码运行的常见错误二、python解释器三、python注释方法1.注释的作用2.单行注释(行注释)3.多行注释(块注释)四、python的算数运算符1.算数运算符2.算数运算符的优先级一、python代码运行的常见错误1.手误。例如:pirnt(“hi wor......

  9. 基于JS简单实现手持弹幕功能+文字抖动特效代码

    前段时间抖音上有个抖动弹幕挺火的,于是决定仿写一个,话不多说,先看效果…效果展示GIF图看着有点模糊,但实际效果还是不错的。第一眼看上去也不知道该咋做,那就先把要实现的功能拆解一下吧。生成一个铺满全屏的黑色背景,写上文字,然后内容居中实现无缝滚动实现文字抖动特效旋转90度(默认横屏展示)代码如下.h......

  10. Latex安装教程(附美赛论文latex模板)

    @目录Latex简介安装步骤texlive下载配置环境变量配置Texsudiolatex版本helloworld美赛 latex模板Latex简介LaTeX(LATEX,音译“拉泰赫”)是一种基于ΤΕΧ的排版系统,由美国计算机学家莱斯利·兰伯特(Leslie Lamport)在20世纪80......