一、先看結果
1.1創造營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日 泰國
1.2青春有你2當前官方榜前三甲
青春有你2官方榜(35進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,來自《創造營2020》的黃若元(已經告別舞臺)
>>>df.sort_values(by = "face++女性眼中顏值",ascending = False).head(1)[["face++女性眼中顏值","姓名","來源","身高","體重","生日","出生地"]] face++女性眼中顏值 姓名 來源 身高 體重 生日 出生地 95 95.23 黃若元 創造營2020 NaN NaN 1996-03-01 NaN
1.3.2男性視角顏值第一名
得分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 上海
1.4小姐姐們籍貫分布(pyecharts作圖)
創造營2020的小姐姐有籍貫記錄的41位中,來自四川的有7位,江西、浙江、湖南和湖北的各3位
青春有你2小姐姐來自最多的省市分別是北京、臺灣 各9名,重慶、成都各6名
二、再看下統計分析
以下是整體數據部分截圖(Spyder變量查看器)
因為整合的信息較多,共17個字段,我們在做分 數據指標 統分的時候只需要用到部分即可。
在做統計分析時,這里核心就是一個 分組統計 (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 狀態 210 non-null object 5 粉絲數 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預測年齡 210 non-null int64 12 AI顏值評分 210 non-null int64 13 face++AI預測年齡 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小姐姐出生地分布
《創造營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
2.2小姐姐的出生年份分布
出生年份我們合并數據做統一處理吧,一共有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
2.3小姐姐星座分布
星座分布我們合并數據做統一處理吧,一共有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
2.4小姐姐身高分布
身高分布我們合并數據做統一處理吧,一共有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)
>>>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小姐姐體重分布
體重分布我們合并數據做統一處理吧,一共有120/210份數據,我們統計結果如下:
>>>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
身高這種屬性,咱們還可以做簡單的描述統計分析如下:
(可以看到,最高87kg???,最低40kg,平均48kg,中位數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的妹子是誰,看了下照片,感覺是官網數據填錯了吧,應該47kg或者87斤?才對吧,算了不改了~
>>>df[df["體重"]==87][["編號","姓名","來源"]] 編號 姓名 來源 170 540476547 孫美楠 青春有你2
2.6小姐姐顏值分布
因為騰訊云ai評分,過百的就有40來個,咱們還是用Face++吧
顏值評分這個因為是精確到了小數點后3位,所以咱們在做統分的時候,更適合先進行分箱操作
2.6.1女性角度顏值評分
先看描述統計分析結果:
(可以看到,最高95.23,最低65.596,平均83.742,中位數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分一個檔位,我們統計結果如下:
90分以上顏值居然高達16位~
>>>beauty_bins = [60,70,80,90,100] >>>beauty_labels = ["60-70", "70-80", "80-90", "90-100"] >>>df["face++女-顏值區間"] = pd.cut(df["face++女性眼中顏值"], bins=beauty_bins, labels=beauty_labels) >>>df["face++女-顏值區間"].value_counts() 80-90 155 70-80 34 90-100 16 60-70 5 Name: face++女-顏值區間, dtype: int64
2.6.2男性角度顏值評分
先看描述統計分析結果:
(可以看到,最高93.77,最低66.404,平均82.606,中位數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分一個檔位,我們統計結果如下:
90分以上顏值居然只有6位~【難道男性對顏值的要求更高???】
>>>df["face++男-顏值區間"].value_counts() 80-90 147 70-80 52 90-100 6 60-70 5 Name: face++男-顏值區間, dtype: int64
三、載入需要的庫
import requests from fake_useragent import UserAgent import pandas as pd import json from lxml import etree
3.1使用requests+json獲取小姐姐列表
通過F12在開發者界面Network―>XHR中我們可以發現真實數據請求地址(見Headers里的General),以及請求響應的數據格式 是 json。
參數可以在Headers里的Query String Parameters 里找到
于是我們可以編寫以下代碼進行數據爬取
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, #以下兩個時間戳參數可以省略 "_t": 1590324974706, "_": 1590324974708 } #請求數據 re = requests.get(url,headers = headers,params = params) #用json解析json數據成字典 data = json.loads(re.text) Li_list = data["data"]["itemList"] rank = 0 data_list = [] #獲取每個選手的基礎信息 for li in Li_list: rank += 1 item = {} #獲取基礎信息 item["當前排名"] = rank item["選手編號"] = li["itemInfo"]["id"] item["選手姓名"] = li["itemInfo"]["name"] item["選手照片"] = li["itemInfo"]["mapData"]["poster_pic"] item["選手狀態"] = li["statusInfo"]["voteBtnTxt"] #獲取選手doki頁,需要傳遞選手編號id信息用于循環請求 #根據選手編號id到選手doki頁面獲取粉絲數、星座、身高、生日等基礎個人信息 #簡單的靜態頁面,這里用到xpath做解析 id_ = item["選手編號"] #調用獲取選手doki頁數據的函數,具體見get_Girlinfo函數 html = get_Girlinfo(id_) item["粉絲數"] = 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預測年齡"] = age item["AI顏值評分"] = beauty #獲取face++顏值評分 faceage,beauty_w,beauty_m = ksfaceScore(url_ai) item["face++AI預測年齡"] = faceage item["face++女性眼中顏值"] = beauty_w item["face++男性眼中顏值"] = beauty_m data_list.append(item) return data_list
3.2使用requests+xpath獲取小姐姐基礎信息
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) #直接獲取的數據中中文是亂碼,我們轉化一下編碼格式即可 re_.encoding="utf-8" #因本次爬蟲我們解析網站源碼用到的是xpath,所以需要處理一下 html = etree.HTML(re_.text) #返回處理后的網站數據源碼,在小姐姐列表中我們再行處理 return html
四、使用requests調用api接口獲取小姐姐顏值評分
一開始我用的是騰訊云的人臉識別,跑完數據發現101個創造營小姐姐里有21個顏值得了滿分,而我喜歡的一個小姐姐朱主愛居然得分最低,那怎么行。所以,本次我們新增了曠視的FACE++人臉識別做顏值評分對比。
4.1騰訊云人臉識別
騰訊云人臉識別需要使用到第三方庫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兩個字段即可。
def txfaceScore(url): try: # 實例化一個認證對象,入參需要傳入騰訊云賬戶 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即我們需要做顏值評分的小姐姐照片所在網頁地址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) #返回的數據格式是json,所以在轉化為字典后很簡單就能找到你需要的數據 age = respdic["FaceInfos"][0]["FaceAttributesInfo"]["Age"] beauty = respdic["FaceInfos"][0]["FaceAttributesInfo"]["Beauty"] except TencentCloudSDKException as err: print(err) return age,beauty
4.2Face++人臉識別
接口調用很簡單,設置好你需要的請求參數(這里我們選擇年齡和顏值:age,beauty),由于Face++顏值評分分為男女視角下的顏值分兩種,所以我們需要返回三個值:年齡、男/女視角顏值分。
具體函數見下方:
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) #返回的數據格式是json,所以在轉化為字典后很簡單就能找到你需要的數據 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
到此這篇關于Python爬蟲之爬取2020女團選秀數據的文章就介紹到這了,更多相關python爬取女團內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!
原文鏈接:https://blog.csdn.net/dxawdc/article/details/106354234