昨晚一回家,表弟就神神秘秘的跟我说,发现一个高颜值网站,非要拉着我研究一下她们的颜值高低。
我心想,这还得要我一个个慢慢看,太麻烦了~
于是反手用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.某牙.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
def Score(file):
# client_id 为官网获取的AK, client_secret 为官网获取的SK
host = 'https://aip.某度.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.某度.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
效果展示
好了文章内容就分享到这里,文章不理解的话,我还录制了对应的视频讲解,和代码一起打包好了。
包括文末这些资料,直接名片扫码领取。
备注【LL】快速通过验证