Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >创造101的小姐姐,了解一下?

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

原创
作者头像
Techeek
发布于 2018-05-22 10:49:40
发布于 2018-05-22 10:49:40
2.2K00
代码可运行
举报
文章被收录于专栏:鹅厂优文鹅厂优文
运行总次数:0
代码可运行

作者:朱浩杭 | 腾讯UI工程师

通过爬虫和数据分析带你更深入地了解《创造101》的小姐姐们~

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

  • 技术栈:PythonMongoDB、PHP
  • 可视化:Echarts

0x1 思路

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

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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)

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
    "_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 接口读取数据后发现问题,出生日期数据并不是非常全: 

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 百度百科
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 提供了底层技术支持,其中有一个颜值检测的能力(说是代表了亚洲男性和女性对人脸评价的平均水平):

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 最后

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
SpringMVC—Ajax使用
Ajax的核心是XMLHttpRequest对象(XHR){内置对象},XHR为服务器发送请求和解析服务器响应提供了接口,能够以异步方式从服务器获取新数据
Java架构师必看
2021/05/14
1.7K0
SpringMVC—Ajax使用
jquery实现ajax_完整网页代码
大家好,我是架构君,一个会写代码吟诗的架构师。今天说一说jquery实现ajax_完整网页代码,希望能够帮助大家进步!!!
Java架构师必看
2022/06/13
4.6K0
jquery实现ajax_完整网页代码
【前端系列-2】layui+springboot实现表格增删改查
本文将演示如何使用Springboot(后端框架)和layui(前端框架)将数据库中的数据渲染到前端页面,以及对前端页面的数据实现增删改。
云深i不知处
2020/09/16
6.9K0
Ajax的使用
纯JS原生实现Ajax我们不去讲解这里,直接使用jquery提供的,方便学习和使用,避免重复造轮子,有兴趣的同学可以去了解下JS原生XMLHttpRequest !
Rochester
2020/09/01
1.6K0
Ajax研究
Ajax的核心是XMLHttpRequest对象(XHR)。XHR为向服务器发送请求和解析服务器响应提供了接口。能够以异步方式从服务器获取新数据。
后端码匠
2021/08/20
9500
JavaScript学习总结(二)——延迟对象、跨域、模板引擎、弹出层、AJAX示例
一、AJAX示例 AJAX全称为“Asynchronous JavaScript And XML”(异步JavaScript和XML) 是指一种创建交互式网页应用的开发技术、改善用户体验,实现无刷新效
张果
2018/01/04
3.7K0
JavaScript学习总结(二)——延迟对象、跨域、模板引擎、弹出层、AJAX示例
python测试开发django-130.jQuery中$.ajax()方法发GET/POST/DELETE请求
jQuery中$.ajax()方法可以发 GET/POST/DELETE 请求等 HTTP 的请求方式。 ajax() 方法用于执行 AJAX(异步 HTTP)请求。所有的 jQuery AJAX 方法都使用 ajax() 方法。该方法通常用于其他方法不能完成的请求。
上海-悠悠
2021/10/08
6580
JSONP原理以及示例(jsonp示例)
首先我们需要明白,在页面上直接发起一个跨域的ajax请求是不可以的,但是,在页面上引入不同域上的js脚本却是可以的,就像你可以在自己的页面上使用<img src=””> 标签来随意显示某个域上的图片一样。比如我在8080端口的页面上请求一个9090端口的图片:
超级小可爱
2024/02/20
3870
JSONP原理以及示例(jsonp示例)
从零开始学 Web 之 Vue.js(四)Vue的Ajax请求和跨域
在这里我会从 Web 前端零基础开始,一步步学习 Web 相关的知识点,期间也会分享一些好玩的项目。现在就让我们一起进入 Web 前端学习的冒险之旅吧!
Daotin
2018/09/30
1.5K0
从零开始学 Web 之 Vue.js(四)Vue的Ajax请求和跨域
Python结合jquery Ajax 的实例
jQuery对Ajax的操作进行了封装。jQuery中.ajax()属于最底层的方法。 先来看一个简单的例子:
赵云龙龙
2019/08/18
3.9K0
jQuery ajax() 方法
jQuery 库拥有完整的 Ajax 兼容套件,其中的函数和方法允许我们在不刷新浏览器的情况下从服务器加载数据。
阳光岛主
2019/02/19
2.7K0
jQuery ajax() 方法
跨域请求的常用方式及解释
同源策略 首先基于安全的原因,浏览器是存在同源策略这个机制的,同源策略阻止从一个域加载的脚本去获取另一个域上的文档属性。也就是说,受到请求的 URL 的域必须与当前 Web 页面的域相同。这意味着浏览器隔离来自不同源的内容,以防止它们之间的操作。 js跨域是指通过js在不同的域之间进行数据传输或通信,比如用ajax向一个不同的域请求数据,或者通过js获取页面中不同域的框架中(iframe)的数据。 只要协议、域名、端口有任何一个不同,都被当作是不同的域。 下面介绍几种常用的跨域请求方式 默认端口为:8080
柴小智
2018/04/10
1.5K0
跨域请求的常用方式及解释
ajax和vue.js
delegate 事件委托,子级不方便做,委托给父级做,既能给已有的绑定事件,又能给未来元素绑定。
小闫同学啊
2019/07/18
10.5K0
SpringMVC-06 Ajax
1、新建一个module :springmvc05-Ajax , 导入web支持!
张小驰出没
2021/04/15
1.1K0
SpringMVC-06  Ajax
一个ajax的Post要求
$.post(url,[data],[callback],[type]) 第一个参数是地址,第二个参数是一个参数传递。第三个参数是一个回调函数。參数是请求返回数据的类型
全栈程序员站长
2022/07/06
1.4K0
【JavaWeb】学习笔记——Ajax、Axios
AJAX(Asynchronous JavaScript And XML):异步的JavaScript 和 XML
鸡先生
2022/10/29
8690
【JavaWeb】学习笔记——Ajax、Axios
Javaweb05-Ajax
注意 基本Ajax,get提交Ajax,post提交Ajax,接收返回的boolean值都是String类型的;
化羽羽
2022/10/28
8860
【前端系列-4】layui表格集成select选择框和switch开关
在前文中,我们已经初步感受了layui表格使用自定义模板的基础操作。现在,在自定义模块应用的基础上,我们进一步丰富layui表格对其他组件的集成。
云深i不知处
2020/09/16
4.3K0
从0开始做系统之传递数据
我们做系统,光有后台不行,还得有好看和便利的前台来操作和展示信息。前端一般是用html5和JS来控制。如果好看,你还得懂css。 后台控制数据和逻辑,前台控制交互和展示。所以前后台得通信,交换信息。这里就是讲他们如何传递数据的。 市面上的系统一般的架构都是MVC的,M指的是model,数据库这层。V是view,界面这层,C是控制逻辑这层。 如果我们打开一个网页,请求网址后,它会去C这层,去哪个路由,要什么样的业务逻辑,展现到哪个页面,都是由这层控制。先去M里面拿取数据,然后渲染到V这层,最终面对的是用户。
赵云龙龙
2019/07/11
1.5K0
从0开始做系统之传递数据
Python自动化开发学习-RESTfu
RESTful API 是一种面向资源编程,也叫表征状态转移(英文:Representational State Transfer,简称REST)。 认为网络上所有的东西都是资源,对资源的操作无非就是增删改查。
py3study
2020/01/07
2.9K0
相关推荐
SpringMVC—Ajax使用
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验