- 技术栈:Python、MongoDB、PHP
- 可视化:Echarts
0x1 思路
简单来说,通过爬官方的 选手榜 得到了 101 位小姐姐们的基础数据,如名字、照片、排名:
然后通过每个选手的 详情页 得到更详细的信息:星座、身高、体重、出生地、粉丝数等:
使用 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 接口读取数据后发现问题,出生日期数据并不是非常全:
咋办?在网上搜了一番,最终在百度百科里找到了一份包含了出生日期和经纪公司的表:
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]) |
最终完整数据呈现是这样的(段奥娟的年龄这么神秘?):
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. 男性女性的眼中,谁的颜值最高?
调用的过程大致是这样的(注意不要请求太频繁,加一些延时):
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); }) |
下面看看男性眼中颜值最高的小姐姐排名:
再看看女性眼中颜值最高的小姐姐排名:
0x3 最后
本次分析纯粹源于个人爱好,结果不含恶意。谢谢腾讯视频提供优质的综艺节目。欢迎关注团队公众号,里面有更多小秘密哦: