【技术文】创造101的小姐姐,了解一下?

分类栏目:用户体验 - 前端开发

24870

发布于 暂无评论

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

0x1 思路

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

1526621458_10_w2470_h1350

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

1526621510_73_w3078_h1520

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
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)

格式化后的数据是这样的:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
{
“_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 接口读取数据后发现问题,出生日期数据并不是非常全:

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

话不多说,继续爬,将数据追加到数据库里:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 百度百科
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].textif dataitem[‘birthdate’] == ‘-‘ or dataitem[‘birthdate’] == ‘—-‘:
dataitem[‘age’] = ‘-‘
else:
now = datetime.datetime.now()
dataitem[‘age’] = now.year – int(dataitem[‘birthdate’].split(‘年’)[0])

 

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

 

05

0x2 数据分析

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

1. 年龄分布

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

05

06

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

 

2. 星座分布

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

07

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

08

3. 身高分布

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

maxresdefault

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

09

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

10

 

4. 经济公司排名

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

11

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

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

02424022AA2E129E79033F2F3F21AC3D

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

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

12

13

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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);
})

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

15

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

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

0x3 最后

本次分析纯粹源于个人爱好,结果不含恶意。谢谢腾讯视频提供优质的综艺节目。欢迎关注团队公众号,里面有更多小秘密哦:

WX20180518-151318@2x