回到目录

创造101的小姐姐,了解一下?

2018-06-02

在女票的影响下开始看咱们厂自制的综艺节目《创造101》,被里面充满才华和颜值的小姐姐们所吸引。在大饱眼福的同时,不仅萌生了深入了解小姐姐的想法,通过爬虫和数据分析,为大家揭开更多小秘密。

  • 技术栈:Python、MongoDB、PHP
  • 可视化:Echarts

0x1 思路

简单来说,通过爬官方的 选手榜 得到了 101 位小姐姐们的基础数据,如名字、照片、排名:

然后通过每个选手的 详情页 得到更详细的信息:星座、身高、体重、出生地、粉丝数等:

使用 Python 爬取数据并做简单的清洗,得到了一份格式化的数据,最后保存在 MongoDB 中:

if __name__ == "__main__":
    content = dataRequest("http://v.qq.com/biu/101_star_web")
    clist = content.select('.mod_pic_list .pic_list .list_item')

    for item in clist:
    dataitem = {}
    dataitem['avatar'] = 'http:'+item.select('.pic img')[0]['src']
    dataitem['link'] = 'http:'+item.select('.tit')[0].attrs['href']
    dataitem['rank'] = item.select('.rank_num .num')[0].text
    dataitem['name'] = item.select('.tit')[0].text
    print(dataitem['name'])

    detail = dataRequest(dataitem['link']+'&tabid=2')
    dataitem['follower'] = detail.select('.star_followers #_banner_fanscount')[0].attrs['data-num']
    dataitem['pic'] = 'http:'+detail.select('.star_pic img')[0].attrs['src']
    wiki = detail.select('.mod_row_box #infoWrapper')[0]
    wikicnt = wiki.select('.wiki_content')[0].text
    wikilist = wiki.select('.wiki_info .wiki_info_1 .line, .wiki_info .wiki_info_2 .line')

    wikiobj = WikiObj()

    for item in wikilist:
    key = re.sub('\s', '', item.select('.lable')[0].text)
    value = item.select('.content')[0].text
    setattr(wikiobj, key, value)

    dataitem['weight'] = wikiobj.体重
    dataitem['birthplace'] = wikiobj.出生地
    dataitem['birthdate'] = wikiobj.出生日期
    dataitem['alias'] = wikiobj.别名
    dataitem['location'] = wikiobj.地区
    dataitem['constellation'] = wikiobj.星座
    dataitem['nation'] = wikiobj.民族
    dataitem['hobby'] = wikiobj.爱好
    dataitem['occupation'] = wikiobj.职业
    dataitem['blood'] = wikiobj.血型
    dataitem['height'] = wikiobj.身高
    dataitem['achievement'] = wikiobj.主要成就.strip()
    dataitem['works'] = wikiobj.代表作品

    collection.update_one({'name': dataitem['name']}, {"$set": dataitem}, True)

格式化后的数据是这样的:

{
    "_id" : ObjectId("5afcf8e4dcc481f9bc268ff4"),
    "avatar" : "http://puui.qpic.cn/media_img/0/null1524465886/0",
    "link" : "http://v.qq.com/doki/star?id=1503935",
    "rank" : 1,
    "name" : "吴宣仪",
    "follower" : "1238880",
    "weight" : "45kg",
    "birthplace" : "中国海南省",
    "birthdate" : "1995年01月26日",
    "alias" : "宣仪",
    "location" : "内地",
    "constellation" : "水瓶座",
    "nation" : "-",
    "hobby" : "-",
    "occupation" : "歌手",
    "blood" : "O型",
    "height" : 166,
    "achievement" : "2016年2月25日,荣获"最具潜力组合奖"。",
    "works" : "创造101、闺蜜的完美旅行、创造101悠享版、101进阶练习室、101宿舍日记",
    "pic" : "http://puui.qpic.cn/media_img/0/null1524119204/0"
}

在前端通过 PHP API 接口读取数据后发现问题,出生日期数据并不是非常全:

咋办?在网上搜了一番,最终在百度百科里找到了一份包含了出生日期和经纪公司的表:

话不多说,继续爬,将数据追加到数据库里:

# 百度百科
baidu = dataRequest("https://baike.baidu.com/item/%E5%88%9B%E9%80%A0101/22435864")
table = baidu.select('table')[3].select('tr')

# ...

for td in table[1:]:
name = td.select('td:nth-of-type(1)')[0].text
if name == dataitem['name']:
dataitem['birthdate'] = dataitem['birthdate'] if dataitem['birthdate'] != '-' else td.select('td:nth-of-type(3)')[0].text
dataitem['company'] = td.select('td:nth-of-type(4)')[0].text

if dataitem['birthdate'] == '-' or dataitem['birthdate'] == '----':
dataitem['age'] = '-'
else:
now = datetime.datetime.now()
dataitem['age'] = now.year - int(dataitem['birthdate'].split('年')[0])

最终完整数据呈现是这样的(段奥娟的年龄这么神秘?):

0x2 数据分析

有了这批原始数据后,就可以开始做一些数据筛分和分析了,选了几个纬度:年龄、星座、身高、经纪公司、颜值来进一步挖掘。

1. 年龄分布

听说这次的选手都很小,但有多小还真不知道,把年龄划分几个阶段:0~16、17~20、21~24、25~28、29~35,通过数据库条件筛选看看都是如何分布的:

可见 17~24 岁已经占了 78% 了,最小 16 岁(2002年出生,而且还有四位!),最大 28 岁。至于 29~35 岁,不好意思不存在的。当然仔细看看,排名靠前的都是岁数相对较大的 90 后,同为 90 后,这也算是作一点安慰吧?

2. 星座分布

有人说冬天出生的孩子比较聪明,这次晋级的小姐姐们能否体现这个规律?当然我知道这个比赛不是拼智商的。通过数据分析可以得出:选手们的星座分布得比较均匀,射手座最少天秤座最多,不懂星座只能解读到这里了。

对了,58 名晋级选手里也是天秤最多,射手全军覆没:

3. 身高分布

第三集的时候对李紫婷这组的《红色高跟鞋》印象很深刻,这个组里面个个都是人才,说话又好听,唱功还很好(吴印香我在中国好声音的时候已经关注了),而且都是大长腿。那这群小姐姐们平均都有多高?

选定三个区间:150~160cm、160~170cm、170~180cm 进行统计:

女团似乎 160~170cm 会比较吃香(前五名齐刷刷出现在了一起),180cm 的热依娜跳起舞来可真不容易。数据也表明确实大部分选手身高都集中在 160~170cm 这个区间了:

4. 经济公司排名

像这种女团比赛,拼的也是背景。谁家的公司资源多,谁就可以发展得更好。先看看哪家经纪公司派出的选手最多:

乐华娱乐是韩庚、周笔畅、王嘉宁的经纪公司,而王思聪旗下的香蕉娱乐排在第五,旗下的强东玥还是很有实力的。

再看看晋级的选手里,哪家经济公司占比较大(吴宣仪、山支哥两位是我比较熟悉的,她们的排名也在前五,乐华娱乐能否笑到最后?):

5. 男性女性的眼中,谁的颜值最高?

女团颜值也是一大吸引点,不过颜值本身就不好判断,既然人的评价太过主观,那就让机器来评价吧。这里我用的是 Face++ 的接口,这家公司为国内很多大公司的 App 提供了底层技术支持,其中有一个颜值检测的能力(说是代表了亚洲男性和女性对人脸评价的平均水平):

调用的过程大致是这样的(注意不要请求太频繁,加一些延时):

let params = {
    api_key: 'xxx',
    api_secret: 'xxx',
    image_url: avatar,
    return_attributes: 'beauty'
}
this.$http.post("https://api-cn.faceplusplus.com/facepp/v3/detect", qs.stringify(params))
.then((response) => {
    let beauty = response.data.faces[0].attributes.beauty
    this.newSisterList[index].beauty = beauty
})
.catch(function(error) {
    console.log(error);
})

下面看看男性眼中颜值最高的小姐姐排名:

再看看女性眼中颜值最高的小姐姐排名:

你们觉得准不准?还有前20名去哪儿了?难不成他们已经脱离了亚洲人的审美?「丑丑」又为何频频出现在颜值榜里?请跟我一起走进 —— 笑笑就好,认真就输了。

0x3 最后

本次分析纯粹源于个人爱好,结果不含恶意。谢谢腾讯视频提供优质的综艺节目。