Python爬蟲之爬取2020女團(tuán)選秀數(shù)據(jù)
一、先看結(jié)果
1.1創(chuàng)造營2020撐腰榜前三甲
創(chuàng)造營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日 泰國

1.2青春有你2當(dāng)前官方榜前三甲
青春有你2官方榜(35進(jìn)20)前三名分別是 劉雨昕、虞書欣、喻言
>>>df2[df2['排名']<=3 ][['排名','姓名','身高','體重','生日','出生地']]
排名 姓名 身高 體重 生日 出生地
107 1.0 劉雨昕 168.0 48.0 1997年04月20日 貴陽
117 2.0 虞書欣 169.0 50.0 1995年12月18日 上海
118 3.0 喻言 172.0 50.0 1997年05月26日 北京

1.3Face++男女視角顏值最高
1.3.1女性視角顏值第一名
得分95.23,來自《創(chuàng)造營2020》的黃若元(已經(jīng)告別舞臺)
>>>df.sort_values(by = 'face++女性眼中顏值',ascending = False).head(1)[['face++女性眼中顏值','姓名','來源','身高','體重','生日','出生地']]
face++女性眼中顏值 姓名 來源 身高 體重 生日 出生地
95 95.23 黃若元 創(chuàng)造營2020 NaN NaN 1996-03-01 NaN

1.3.2男性視角顏值第一名
得分93.773,來自《創(chuàng)造營2020》的孫珍妮(目前位列撐腰榜第19)
>>>df.sort_values(by = 'face++男性眼中顏值',ascending = False).head(1)[['face++男性眼中顏值','姓名','來源','身高','體重','生日','出生地']]
face++男性眼中顏值 姓名 來源 身高 體重 生日 出生地
18 93.773 孫珍妮 創(chuàng)造營2020 165.0 NaN 2000-05-05 上海

1.4小姐姐們籍貫分布(pyecharts作圖)
創(chuàng)造營2020的小姐姐有籍貫記錄的41位中,來自四川的有7位,江西、浙江、湖南和湖北的各3位

青春有你2小姐姐來自最多的省市分別是北京、臺灣 各9名,重慶、成都各6名

二、再看下統(tǒng)計分析
以下是整體數(shù)據(jù)部分截圖(Spyder變量查看器)

因為整合的信息較多,共17個字段,我們在做分 數(shù)據(jù)指標(biāo) 統(tǒng)分的時候只需要用到部分即可。
在做統(tǒng)計分析時,這里核心就是一個 分組統(tǒng)計 (df.groupby())。
>>>df.info() <class 'pandas.core.frame.DataFrame'> RangeIndex: 210 entries, 0 to 209 Data columns (total 17 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 排名 136 non-null float64 1 編號 210 non-null int64 2 姓名 210 non-null object 3 照片 210 non-null object 4 狀態(tài) 210 non-null object 5 粉絲數(shù) 101 non-null object 6 星座 168 non-null object 7 身高 137 non-null float64 8 體重 120 non-null float64 9 出生地 149 non-null object 10 生日 160 non-null object 11 AI預(yù)測年齡 210 non-null int64 12 AI顏值評分 210 non-null int64 13 face++AI預(yù)測年齡 210 non-null int64 14 face++女性眼中顏值 210 non-null float64 15 face++男性眼中顏值 210 non-null float64 16 來源 210 non-null object dtypes: float64(5), int64(4), object(8) memory usage: 28.0+ KB
2.1小姐姐出生地分布
《創(chuàng)造營2020》小姐姐官方信息數(shù)據(jù)中,出生地只有41/101個,且多以省為標(biāo)尺,我們統(tǒng)計結(jié)果如下:
>>>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》小姐姐官方數(shù)據(jù)比較全,出生地有108/109,且多以市為標(biāo)尺,我們統(tǒng)計結(jié)果如下:
>>>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
2.2小姐姐的出生年份分布
出生年份我們合并數(shù)據(jù)做統(tǒng)一處理吧,一共有160/210份數(shù)據(jù),我們統(tǒng)計結(jié)果如下:
>>>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
2.3小姐姐星座分布
星座分布我們合并數(shù)據(jù)做統(tǒng)一處理吧,一共有168/210份數(shù)據(jù),我們統(tǒng)計結(jié)果如下:
>>>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
2.4小姐姐身高分布
身高分布我們合并數(shù)據(jù)做統(tǒng)一處理吧,一共有137/210份數(shù)據(jù),我們統(tǒng)計結(jié)果如下:
>>>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
身高這種屬性,咱們還可以做簡單的描述統(tǒng)計分析如下:
(可以看到,最高175cm,最低158cm,平均167.12cm,中位數(shù)168cm)
>>>df['身高'].describe() count 137.000000 mean 167.124088 std 4.080883 min 158.000000 25% 165.000000 50% 168.000000 75% 170.000000 max 175.000000 Name: 身高, dtype: float64
2.5小姐姐體重分布
體重分布我們合并數(shù)據(jù)做統(tǒng)一處理吧,一共有120/210份數(shù)據(jù),我們統(tǒng)計結(jié)果如下:
>>>weight = df.groupby('體重')['編號'].count().to_frame('count').sort_values(by = 'count',ascending = False).reset_index()
>>>weight.head()
體重 count
0 48.0 20
1 46.0 15
2 50.0 13
3 47.0 13
4 49.0 12
身高這種屬性,咱們還可以做簡單的描述統(tǒng)計分析如下:
(可以看到,最高87kg???,最低40kg,平均48kg,中位數(shù)48kg)
>>>df['體重'].describe() count 120.000000 mean 48.012500 std 5.081877 min 40.000000 25% 46.000000 50% 48.000000 75% 50.000000 max 87.000000 Name: 體重, dtype: float64
趕快查一下這個87KG的妹子是誰,看了下照片,感覺是官網(wǎng)數(shù)據(jù)填錯了吧,應(yīng)該47kg或者87斤?才對吧,算了不改了~
>>>df[df['體重']==87][['編號','姓名','來源']]
編號 姓名 來源
170 540476547 孫美楠 青春有你2

2.6小姐姐顏值分布
因為騰訊云ai評分,過百的就有40來個,咱們還是用Face++吧
顏值評分這個因為是精確到了小數(shù)點后3位,所以咱們在做統(tǒng)分的時候,更適合先進(jìn)行分箱操作
2.6.1女性角度顏值評分
先看描述統(tǒng)計分析結(jié)果:
(可以看到,最高95.23,最低65.596,平均83.742,中位數(shù)84.837)
>>>df['face++女性眼中顏值'].describe() count 210.000000 mean 83.742038 std 5.340208 min 65.596000 25% 81.028000 50% 84.837500 75% 87.449750 max 95.230000 Name: face++女性眼中顏值, dtype: float64
顏值按照60-100每10分一個檔位,我們統(tǒng)計結(jié)果如下:
90分以上顏值居然高達(dá)16位~
>>>beauty_bins = [60,70,80,90,100] >>>beauty_labels = ['60-70', '70-80', '80-90', '90-100'] >>>df['face++女-顏值區(qū)間'] = pd.cut(df['face++女性眼中顏值'], bins=beauty_bins, labels=beauty_labels) >>>df['face++女-顏值區(qū)間'].value_counts() 80-90 155 70-80 34 90-100 16 60-70 5 Name: face++女-顏值區(qū)間, dtype: int64
2.6.2男性角度顏值評分
先看描述統(tǒng)計分析結(jié)果:
(可以看到,最高93.77,最低66.404,平均82.606,中位數(shù)83.482)
>>>df['face++男性眼中顏值'].describe() count 210.000000 mean 82.605929 std 5.055116 min 66.404000 25% 79.699250 50% 83.482500 75% 86.409000 max 93.773000 Name: face++男性眼中顏值, dtype: float64
顏值按照60-100每10分一個檔位,我們統(tǒng)計結(jié)果如下:
90分以上顏值居然只有6位~【難道男性對顏值的要求更高???】
>>>df['face++男-顏值區(qū)間'].value_counts() 80-90 147 70-80 52 90-100 6 60-70 5 Name: face++男-顏值區(qū)間, dtype: int64
三、載入需要的庫
import requests from fake_useragent import UserAgent import pandas as pd import json from lxml import etree
3.1使用requests+json獲取小姐姐列表
通過F12在開發(fā)者界面Network—>XHR中我們可以發(fā)現(xiàn)真實數(shù)據(jù)請求地址(見Headers里的General),以及請求響應(yīng)的數(shù)據(jù)格式 是 json。

參數(shù)可以在Headers里的Query String Parameters 里找到
于是我們可以編寫以下代碼進(jìn)行數(shù)據(jù)爬取
def get_Girllist():
url = 'https://zbaccess.video.qq.com/fcgi/getVoteActityRankList?'
headers = {"User-Agent": UserAgent(verify_ssl=False).random}
params = {'raw': 1,
'vappid': 51902973,
'vsecret': '14816bd3d3bb7c03d6fd123b47541a77d0c7ff859fb85f21',
'actityId': 107015,
'pageSize': 101,
'vplatform': 3,
'listFlag': 0,
'pageContext':'' ,
'ver': 1,
#以下兩個時間戳參數(shù)可以省略
'_t': 1590324974706,
'_': 1590324974708
}
#請求數(shù)據(jù)
re = requests.get(url,headers = headers,params = params)
#用json解析json數(shù)據(jù)成字典
data = json.loads(re.text)
Li_list = data['data']['itemList']
rank = 0
data_list = []
#獲取每個選手的基礎(chǔ)信息
for li in Li_list:
rank += 1
item = {}
#獲取基礎(chǔ)信息
item['當(dāng)前排名'] = rank
item['選手編號'] = li['itemInfo']['id']
item['選手姓名'] = li['itemInfo']['name']
item['選手照片'] = li['itemInfo']['mapData']['poster_pic']
item['選手狀態(tài)'] = li['statusInfo']['voteBtnTxt']
#獲取選手doki頁,需要傳遞選手編號id信息用于循環(huán)請求
#根據(jù)選手編號id到選手doki頁面獲取粉絲數(shù)、星座、身高、生日等基礎(chǔ)個人信息
#簡單的靜態(tài)頁面,這里用到xpath做解析
id_ = item['選手編號']
#調(diào)用獲取選手doki頁數(shù)據(jù)的函數(shù),具體見get_Girlinfo函數(shù)
html = get_Girlinfo(id_)
item['粉絲數(shù)'] = html.xpath('.//div[@class="followers_count"]/text()')[0]
info = html.xpath('.//div[@class="wiki_info_1"]//span[@class="content"]/text()')
item['星座'] = info[-5]
item['身高'] = info[-3]
item['體重'] = info[-2]
item['出生地'] = info[-1]
info2 = html.xpath('.//div[@class="wiki_info_2"]//span[@class="content"]/text()')
item['生日'] = info2[0]
url_ai = item['選手照片']
#獲取騰訊云AI顏值評分
age,beauty = txfaceScore(url_ai)
item['AI預(yù)測年齡'] = age
item['AI顏值評分'] = beauty
#獲取face++顏值評分
faceage,beauty_w,beauty_m = ksfaceScore(url_ai)
item['face++AI預(yù)測年齡'] = faceage
item['face++女性眼中顏值'] = beauty_w
item['face++男性眼中顏值'] = beauty_m
data_list.append(item)
return data_list
3.2使用requests+xpath獲取小姐姐基礎(chǔ)信息
def get_Girlinfo(id_):
url_ = f'https://v.qq.com/x/star/{id_}?tabid=2'
headers = {"User-Agent": UserAgent(verify_ssl=False).random}
re_ = requests.get(url_,headers = headers)
#直接獲取的數(shù)據(jù)中中文是亂碼,我們轉(zhuǎn)化一下編碼格式即可
re_.encoding='utf-8'
#因本次爬蟲我們解析網(wǎng)站源碼用到的是xpath,所以需要處理一下
html = etree.HTML(re_.text)
#返回處理后的網(wǎng)站數(shù)據(jù)源碼,在小姐姐列表中我們再行處理
return html
四、使用requests調(diào)用api接口獲取小姐姐顏值評分
一開始我用的是騰訊云的人臉識別,跑完數(shù)據(jù)發(fā)現(xiàn)101個創(chuàng)造營小姐姐里有21個顏值得了滿分,而我喜歡的一個小姐姐朱主愛居然得分最低,那怎么行。所以,本次我們新增了曠視的FACE++人臉識別做顏值評分對比。
4.1騰訊云人臉識別
騰訊云人臉識別需要使用到第三方庫tencentcloud-sdk-python
pip install tencentcloud-sdk-python
在進(jìn)行調(diào)用的時候,需要先加載有關(guān)包
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)的位置、相應(yīng)的面部屬性和人臉質(zhì)量信息
#位置包括 (x,y,w,h)
#面部屬性包括性別(gender)、年齡(age)、表情(expression)、魅力(beauty)、眼鏡(glass)、發(fā)型(hair)、口罩(mask)和姿態(tài) (pitch,roll,yaw)
#人臉質(zhì)量信息包括整體質(zhì)量分(score)、模糊分(sharpness)、光照分(brightness)和五官遮擋分(completeness)
在第一次使用云 API 之前,用戶首先需要在騰訊云控制臺上申請安全憑證,安全憑證包括 SecretID 和 SecretKey, SecretID 是用于標(biāo)識 API 調(diào)用者的身份,SecretKey 是用于加密簽名字符串和服務(wù)器端驗證簽名字符串的密鑰。SecretKey 必須嚴(yán)格保管,避免泄露。
由于我們只需要年齡和顏值評分,因此創(chuàng)建函數(shù)時只需要返回age和beauty兩個字段即可。
def txfaceScore(url):
try:
# 實例化一個認(rèn)證對象,入?yún)⑿枰獋魅腧v訊云賬戶 secretId,secretKey
cred = credential.Credential("secretId", "secretKey")
httpProfile = HttpProfile()
httpProfile.endpoint = "iai.tencentcloudapi.com"
clientProfile = ClientProfile()
clientProfile.httpProfile = httpProfile
client = iai_client.IaiClient(cred, "ap-beijing", clientProfile)
req = models.DetectFaceRequest()
#url即我們需要做顏值評分的小姐姐照片所在網(wǎng)頁地址url
param = {"Url":url,"NeedFaceAttributes":1}
params = json.dumps(param)
req.from_json_string(params)
resp = client.DetectFace(req)
respstr = resp.to_json_string().replace('false','0').replace('true','1')
respdic = eval(respstr)
#返回的數(shù)據(jù)格式是json,所以在轉(zhuǎn)化為字典后很簡單就能找到你需要的數(shù)據(jù)
age = respdic['FaceInfos'][0]['FaceAttributesInfo']['Age']
beauty = respdic['FaceInfos'][0]['FaceAttributesInfo']['Beauty']
except TencentCloudSDKException as err:
print(err)
return age,beauty
4.2Face++人臉識別
接口調(diào)用很簡單,設(shè)置好你需要的請求參數(shù)(這里我們選擇年齡和顏值:age,beauty),由于Face++顏值評分分為男女視角下的顏值分兩種,所以我們需要返回三個值:年齡、男/女視角顏值分。
具體函數(shù)見下方:
def ksfaceScore(pic_url):
url = 'https://api-cn.faceplusplus.com/facepp/v3/detect'
APIKey = '你的key'
APISecret = '你的secret'
data = {"api_key":APIKey,
"api_secret":APISecret,
"image_url":pic_url,
"return_attributes":"age,beauty"
}
res = requests.post(url,data = data)
dic_ = eval(res.text)
#返回的數(shù)據(jù)格式是json,所以在轉(zhuǎn)化為字典后很簡單就能找到你需要的數(shù)據(jù)
age = dic_['faces'][0]['attributes']['age']['value']
beauty_w = dic_['faces'][0]['attributes']['beauty']['female_score']
beauty_m = dic_['faces'][0]['attributes']['beauty']['male_score']
return age,beauty_w,beauty_m
到此這篇關(guān)于Python爬蟲之爬取2020女團(tuán)選秀數(shù)據(jù)的文章就介紹到這了,更多相關(guān)python爬取女團(tuán)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Python爬取股票信息,并可視化數(shù)據(jù)的示例
- Python爬取數(shù)據(jù)并實現(xiàn)可視化代碼解析
- python如何爬取網(wǎng)站數(shù)據(jù)并進(jìn)行數(shù)據(jù)可視化
- 高考要來啦!用Python爬取歷年高考數(shù)據(jù)并分析
- 單身狗福利?Python爬取某婚戀網(wǎng)征婚數(shù)據(jù)
- Python爬蟲之自動爬取某車之家各車銷售數(shù)據(jù)
- Python爬蟲之爬取某文庫文檔數(shù)據(jù)
- python爬蟲之教你如何爬取地理數(shù)據(jù)
- Python爬蟲實戰(zhàn)之爬取京東商品數(shù)據(jù)并實實現(xiàn)數(shù)據(jù)可視化
相關(guān)文章
java 通過聚合查詢實現(xiàn)elasticsearch的group by后的數(shù)量
這篇文章主要介紹了java 通過聚合查詢實現(xiàn)elasticsearch的group by后的數(shù)量,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-12-12
詳解Java8中接口的默認(rèn)方法和靜態(tài)方法
Java 8是Java語言的一個重要版本,其中引入了許多新特性和改進(jìn),其中一個值得關(guān)注的特性是接口的默認(rèn)方法和靜態(tài)方法,本文就來和大家簡單講講吧2023-05-05
通過實例深入學(xué)習(xí)Java的Struts框架中的OGNL表達(dá)式使用
這篇文章主要通過實例介紹了Java的Strus框架中的OGNL表達(dá)式使用,Struts框架是Java的SSH三大web開發(fā)框架之一,需要的朋友可以參考下2015-11-11
Java關(guān)鍵字finally_動力節(jié)點Java學(xué)院整理
java關(guān)鍵字finally不管是否出現(xiàn)異常,finally子句總是在塊完成之前執(zhí)行。下面通過實現(xiàn)代碼給大家介紹Java關(guān)鍵字finally相關(guān)知識,需要的的朋友參考下吧2017-04-04
有關(guān)ServletConfig與ServletContext的訪問
下面小編就為大家?guī)硪黄嘘P(guān)ServletConfig與ServletContext的訪問。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-01-01

