昨晚一回家,表弟就神神秘秘的跟我說,發現一個高顏值網站,非要拉著我研究一下她們的顏值高低。 我心想,這還得要我一個個慢慢看,太麻煩了~ 於是反手用Python給他寫了一個人臉識別代碼,把她們的照片全部爬下來,自動檢測顏值打分排名。 這不比手動快多了? 準備工作 開發環境 Python 3.8 Pyc ...
昨晚一回家,表弟就神神秘秘的跟我說,發現一個高顏值網站,非要拉著我研究一下她們的顏值高低。
我心想,這還得要我一個個慢慢看,太麻煩了~
於是反手用Python給他寫了一個人臉識別代碼,把她們的照片全部爬下來,自動檢測顏值打分排名。
這不比手動快多了?
準備工作
開發環境
- Python 3.8
- Pycharm
模塊使用
- requests >>> pip install requests
- tqdm >>> pip install tqdm 簡單實現進度條效果
- os 文件操作
- base64
照片採集部分
流程思路
- 明確需求:
分析 主播照片 能夠去哪裡獲取到 <開發者工具抓包分析圖片數據來源>- 打開開發者工具: F12
- 刷新網頁
- 點擊 Img 查看圖片鏈接地址
- 通過關鍵字去搜索圖片所對應的數據包
- 在這個鏈接裡面就有想要圖片數據內容
- 發送請求, 模擬瀏覽器對於url地址發送請求
- 獲取數據, 獲取伺服器返迴響應數據
- 解析數據, 提取我們想要的內容 圖片url 和 主播名字
- 保存數據, 把圖片數據內容保存本地文件夾裡面
代碼展示
# 導入數據請求模塊
import requests
"""
發送請求, 模擬瀏覽器對於url地址發送請求
"""
# 模擬瀏覽器 headers 請求頭 --> 字典數據類型, 構建完整鍵值對
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36'
}
# 請求鏈接
url = 'https://www.huya.com/cache.php?m=LiveList&do=getLiveListByPage&gameId=1663&tagAll=0&page=2'
# 發送請求
# 調用requests模塊裡面get請求方法, 對於url地址發送請求並且攜帶上headers請求頭偽裝, 最後用response變數接受返回數據
response = requests.get(url=url, headers=headers)
# <Response [200]> 響應對象, 200狀態碼表示請求成功
print(response)
"""
- 獲取數據, 獲取伺服器返迴響應數據
response.text 獲取響應文本數據 <字元串數據>
response.json() 獲取響應json字典數據 <字典數據>
- 解析數據, 提取我們想要的內容 圖片url 和 主播名字
解析數據方法選擇, 是根據返回數據內容來的
鍵值對取值 <字典取值>
"""
# for迴圈遍歷提取內容
for index in response.json()['data']['datas']:
# 照片
img = index['screenshot']
# 名字
name = index['nick']
"""
保存數據
"""
content = requests.get(url=img, headers=headers).content
with open('img\\' + name + '.jpg', mode='wb') as f:
f.write(content)
print(name, img)
採集到的照片
評分排名部分
對於照片內容進行人臉檢測, 顏值評分:
- 百度雲API介面 --> 有現成文檔代碼
- 通過文檔提供代碼 先獲取 access_token
代碼部分
import time # encoding:utf-8 import requests import base64 from pprint import pprint import os from tqdm import tqdm # 文章不理解的話,我還錄製了對應的視頻講解,和代碼一起打包好了。
# 都放在這個q裙了:708525271
def Score(file): # client_id 為官網獲取的AK, client_secret 為官網獲取的SK host = 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=官網獲取的AK&client_secret=官網獲取的SK' response = requests.get(host) access_token = response.json()['access_token'] ''' 人臉檢測與屬性分析 ''' # 讀取一下圖片數據 f = open(file, mode='rb') # 轉成 BASE64格式 img_base = base64.b64encode(f.read()) request_url = "https://aip.baidubce.com/rest/2.0/face/v3/detect" params = { # 傳入圖片BASE64格式 "image":img_base, # 指定圖片數據類型 "image_type": "BASE64", # 檢測類型 檢測顏值評分 "face_field": "beauty" } request_url = request_url + "?access_token=" + access_token headers = {'content-type': 'application/json'} json_data = requests.post(request_url, data=params, headers=headers).json() # KeyError: 'result' 因為識別失敗了 try: num = json_data['result']['face_list'][0]['beauty'] # print('顏值分數是:', num) return num except: return '識別失敗' lis = [] # 讀取文件路徑 files = os.listdir('img\\') print('正在顏值檢測中, 請稍後......') for file in tqdm(files): time.sleep(0.5) filename = f'img\\{file}' # 主播名字 name = file.split('.')[0] # 評分 num = Score(file=filename) if num != '識別失敗': dit = { '主播': name, '顏值': num } lis.append(dit) lis.sort(key=lambda x:x['顏值'], reverse=True) page = 1 for li in lis: print(f'顏值排名第{page}的是{li["主播"]}, 顏值評分是{li["顏值"]}') page += 1
效果展示
好了文章內容就分享到這裡,下次見~