前言
本文的文字及圖片來源於網絡,僅供學習、交流使用,不具有任何商業用途,版權歸原作者所有,如有問題請及時聯繫我們以作處理。
作者:阿爾法遊戲
PS:如有需要Python學習資料的小夥伴可以加點擊下方鏈接自行獲取http://t.cn/A6Zvjdun
本文將對比《青春有你2》和《創造營2020》全體小姐姐,鑑於兩個節目的數據採集和處理過程基本相似,在使用Python做數據爬蟲採集的章節中將只以《創造營2020》爲例做詳細介紹。感興趣的同學可以照貓畫虎去實操一下《青春有你2》的數據爬蟲採集,我會在章節中放上其數據源地址。
先看結果
①創造營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日 泰國
②青春有你2當前官方榜前三甲
青春有你2官方榜(35進20)前三名分別是 劉雨昕、虞書欣、喻言
③Face++男女視角顏值最高
女性視角顏值第一名
得分95.23,來自《創造營2020》的黃若元(已經告別舞臺)
>>>df.sort_values(by = 'face++女性眼中顏值',ascending = False).head(1)[['face++女性眼中顏值','姓名','來源','身高','體重','生日','出生地']]
face++女性眼中顏值 姓名 來源 身高 體重 生日 出生地
95 95.23 黃若元 創造營2020 NaN NaN 1996-03-01 NaN
男性視角顏值第一名
得分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 上海
④小姐姐們籍貫分佈(pyecharts作圖)
創造營小姐姐都來自哪裏呀?
創造營2020的小姐姐有籍貫記錄的41位中,來自四川的有7位,江西、浙江、湖南和湖北的各3位
青春有你小姐姐都來自哪裏呀?
青春有你2小姐姐來自最多的省市分別是北京、臺灣 各9名,重慶、成都各6名
再看下統計分析結果吧
以下是整體數據部分截圖(Spyder變量查看器)
因爲整合的信息較多,共17個字段,我們在做分 數據指標 統分的時候只需要用到部分即可。
在做統計分析時,這裏核心就是一個 分組統計 (df.groupby()
)
小姐姐出生地分佈
《創造營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
小姐姐的出生年份分佈
出生年份我們合併數據做統一處理吧,一共有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
小姐姐星座分佈
星座分佈我們合併數據做統一處理吧,一共有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
小姐姐身高分佈
身高分佈我們合併數據做統一處理吧,一共有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)
載入需要的庫
使用requests+json獲取小姐姐列表
《創造營2020》撐腰榜地址:
https://m.v.qq.com/activity/h5/303_index/index.html?ovscroll=0&autoplay=1&actityId=107015
通過F12在開發者界面Network—>XHR中我們可以發現真實數據請求地址(見Headers裏的General),以及請求響應的數據格式 是 json。
真實數據請求地址:
https://zbaccess.video.qq.com/fcgi/getVoteActityRankList?(你應該點不開,因爲請求的時候需要附帶一些參數)
參數可以在Headers裏的Query String Parameters
裏找到於是我們可以編寫以下代碼進行數據爬取
1def get_Girllist():
2 url = 'https://zbaccess.video.qq.com/fcgi/getVoteActityRankList?'
3 headers = {"User-Agent": UserAgent(verify_ssl=False).random}
4 params = {'raw': 1,
5 'vappid': 51902973,
6 'vsecret': '14816bd3d3bb7c03d6fd123b47541a77d0c7ff859fb85f21',
7 'actityId': 107015,
8 'pageSize': 101,
9 'vplatform': 3,
10 'listFlag': 0,
11 'pageContext':'' ,
12 'ver': 1,
13 #以下兩個時間戳參數可以省略
14 '_t': 1590324974706,
15 '_': 1590324974708
16 }
17 #請求數據
18 re = requests.get(url,headers = headers,params = params)
19 #用json解析json數據成字典
20 data = json.loads(re.text)
21
22 Li_list = data['data']['itemList']
23
24 rank = 0
25 data_list = []
26
27 #獲取每個選手的基礎信息
28 for li in Li_list:
29 rank += 1
30 item = {}
31 #獲取基礎信息
32 item['當前排名'] = rank
33 item['選手編號'] = li['itemInfo']['id']
34 item['選手姓名'] = li['itemInfo']['name']
35 item['選手照片'] = li['itemInfo']['mapData']['poster_pic']
36 item['選手狀態'] = li['statusInfo']['voteBtnTxt']
37
38 #獲取選手doki頁,需要傳遞選手編號id信息用於循環請求
39 #根據選手編號id到選手doki頁面獲取粉絲數、星座、身高、生日等基礎個人信息
40 #簡單的靜態頁面,這裏用到xpath做解析
41 id_ = item['選手編號']
42 #調用獲取選手doki頁數據的函數,具體見get_Girlinfo函數
43 html = get_Girlinfo(id_)
44 item['粉絲數'] = html.xpath('.//div[@class="followers_count"]/text()')[0]
45 info = html.xpath('.//div[@class="wiki_info_1"]//span[@class="content"]/text()')
46 item['星座'] = info[-5]
47 item['身高'] = info[-3]
48 item['體重'] = info[-2]
49 item['出生地'] = info[-1]
50 info2 = html.xpath('.//div[@class="wiki_info_2"]//span[@class="content"]/text()')
51 item['生日'] = info2[0]
52
53 url_ai = item['選手照片']
54 #獲取騰訊雲AI顏值評分
55 age,beauty = txfaceScore(url_ai)
56 item['AI預測年齡'] = age
57 item['AI顏值評分'] = beauty
58 #獲取face++顏值評分
59 faceage,beauty_w,beauty_m = ksfaceScore(url_ai)
60 item['face++AI預測年齡'] = faceage
61 item['face++女性眼中顏值'] = beauty_w
62 item['face++男性眼中顏值'] = beauty_m
63 data_list.append(item)
64
65 return data_list
使用requests+xpath獲取小姐姐基礎信息
《創造營2020》選手詳情頁地址:https://v.qq.com/x/star/8262415?tabid=2
以上這個地址是劉些寧同學的個人資料頁百科info,我們可以看到這個網頁動態變化的是8262415,這個數字是個啥?不難發現,這是選手編號id呀,我們在獲取小姐姐列表的時候已經記錄了。基於此,我們可以創建獲取小姐姐百科info的函數如下:
使用requests調用api接口獲取小姐姐顏值評分
一開始我用的是騰訊雲的人臉識別,跑完數據發現101個創造營小姐姐裏有21個顏值得了滿分,而我喜歡的一個小姐姐朱主愛居然得分最低,那怎麼行。所以,本次我們新增了曠視的FACE++人臉識別做顏值評分對比。
騰訊雲人臉識別
騰訊雲人臉識別需要使用到第三方庫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兩個字段即可。
1def txfaceScore(url):
2 try:
3 # 實例化一個認證對象,入參需要傳入騰訊雲賬戶 secretId,secretKey
4 cred = credential.Credential("secretId", "secretKey")
5 httpProfile = HttpProfile()
6 httpProfile.endpoint = "iai.tencentcloudapi.com"
7
8 clientProfile = ClientProfile()
9 clientProfile.httpProfile = httpProfile
10 client = iai_client.IaiClient(cred, "ap-beijing", clientProfile)
11
12 req = models.DetectFaceRequest()
13 #url即我們需要做顏值評分的小姐姐照片所在網頁地址url
14 param = {"Url":url,"NeedFaceAttributes":1}
15 params = json.dumps(param)
16 req.from_json_string(params)
17
18 resp = client.DetectFace(req)
19 respstr = resp.to_json_string().replace('false','0').replace('true','1')
20 respdic = eval(respstr)
21 #返回的數據格式是json,所以在轉化爲字典後很簡單就能找到你需要的數據
22 age = respdic['FaceInfos'][0]['FaceAttributesInfo']['Age']
23 beauty = respdic['FaceInfos'][0]['FaceAttributesInfo']['Beauty']
24
25 except TencentCloudSDKException as err:
26 print(err)
27
28 return age,beauty
Face++人臉識別
Face++人工智能開放平臺文檔中心Detect
API地址:https://console.faceplusplus.com.cn/documents/4888373
接口調用很簡單,設置好你需要的請求參數(這裏我們選擇年齡和顏值:age,beauty),由於Face++顏值評分分爲男女視角下的顏值分兩種,所以我們需要返回三個值:年齡、男/女視角顏值分。
具體函數見下方:
1def ksfaceScore(pic_url):
2 url = 'https://api-cn.faceplusplus.com/facepp/v3/detect'
3
4 APIKey = '你的key'
5 APISecret = '你的secret'
6
7 data = {"api_key":APIKey,
8 "api_secret":APISecret,
9 "image_url":pic_url,
10 "return_attributes":"age,beauty"
11 }
12 res = requests.post(url,data = data)
13 dic_ = eval(res.text)
14 #返回的數據格式是json,所以在轉化爲字典後很簡單就能找到你需要的數據
15 age = dic_['faces'][0]['attributes']['age']['value']
16 beauty_w = dic_['faces'][0]['attributes']['beauty']['female_score']
17 beauty_m = dic_['faces'][0]['attributes']['beauty']['male_score']
18
19 return age,beauty_w,beauty_m