昨天晚上听了十几遍[《愿得一人心》川建国版],我被建国同志的英雄事迹感动得热泪盈眶,整晚失眠。长夜漫漫,总要干点活。寻思着正好我还是个student,那么就该兑现承诺,写一个爬虫来搞定颜值排名和寻找初恋的任务。OK,废话不多说!直接上代码,最近刚学会怎么在简书添加markdown:
首先要从某相亲网站上爬取25-30岁女性的头像。具体是哪家网站,这个不能公布,怕查水表,这里只讲原理:从网站的api路口直接进入该网站的数据库,从网页的json数据库中提取21-30岁女性的图片信息。
import requests
import jsonpath
from urllib.request import urlretrieve
from facereg import face_rg
import os
if not os.path.exists("pic"): #创建文件夹存储下载的照片
os.mkdir("pic")
for i in range(60):
url="http://www.xxxxxxxxxxxxx.xxxx?startage=21&endage=30&gender=2&page={}".format(i)
req=requests.get(url).json() #将数据格式转化为json
avatars=jsonpath.jsonpath(req,"$..avatar")
names=jsonpath.jsonpath(req,"$..username")
#使数据意义对应
for avatar,name in zip(avatars,names):
print(avatar,name.replace("\'",""))
try:
urlretrieve(avatar,"pic"+"\\"+str(name.replace("\'","").replace("\\",""))+".png")
except:
print("有这样取名的吗?") #有些注册人名称中带大量非常用字符直接无视她们
这样总共下载了1173张美女照片,放出一部分大家欣赏一下
小姐姐们画完妆颜值还是不错滴~
接下来就要对这些小姐姐们的颜值进行打分和排名了。自己搭建人脸识别巨型神经网络?~那是不可能滴,没有那么多资源训练神经网络,不过如果是搭建一个迁移学习的神经网络是可以的。等有空在干这个。对于我们这些白嫖党来说,自然是“君子善假于物”。baidu的ai平台现在大部分功能都free了。不过这种大规模的运算需要本地和云端进行数据交互,这样就很考验网速了。不过baidu ai提供云存储,可以一试。废话不多说,直接上代码:
from aip import AipFace
import base64
def face_rg(file_path):
APP_ID="xxxx" #APP_ID,API_KEY,SECRET_KEY 注册一下就可以申请到
API_KEY="xxxxxxx"
SECRET_KEY="xxxxxxxxxxxxxxxxxxxxx"
client=AipFace(APP_ID,API_KEY,SECRET_KEY)
with open(file_path,"rb") as f:
data=base64.b64encode(f.read()) #对图片进行编码
image=data.decode()
options={}
options["face_field"]="beauty"
imageType="BASE64"
"""调用人脸检测"""
res=client.detect(image,imageType,options)
res_score=res['result']['face_list'][0]['beauty']
return res_score
将这一段代码存为facereg.py,方便调用。
有了这些评分就可以对一千多位小姐姐的颜值进行打分排名了。OK,废话不多说,直接上代码:
from facereg import face_rg
import os
images=os.listdir("pic")print(images)
path=r"pic"
yz=[]
yz_dict={}
for image in images:
try:
score=face_rg(path+"\\"+image)
name=image[0:-4] #截取ID
yz_dict[score]=name
yz.append(score)
except:
print("It is not human face")
yz.sort(reverse=True) #对颜值进行排名
f=open("颜值排名.txt","w")
for i,b in enumerate(yz):
string="{}的颜值排第{}名,她的颜值是{}".format(yz_dict[b],i+1,b)
print(string)
try:
f.write(string.encode("gbk","ignore").decode("gbk")+"\r\n")
except:
print("写入错误")
f.close()
排名就出来了,大家一起欣赏一下:
看一下颜值最高的前三位长啥样:
排名第一位的,颜值分数:89.5
排名第二位的,颜值分数:89.26
排名第三位的,颜值分数:87.48
啧啧啧,不得不感叹,亚洲的美颜黑科技太强大了,差不多都是网红脸。
那么排名最后的,我看了一下,基本是纯天然不修边幅那种,这里就不跟大家分享了。
接下来,就要做寻找初恋这个任务了。首先要找到一个初恋,我的嘛就算了。这里就选择新垣结衣吧,毕竟她是大家的”老婆“。
先上gakki美照:
gakki的颜值还是非常可以的,那么大家想不想找一位跟gakki长得一样的女朋友?好了,直接上代码:
#coding:utf-8
import gevent
import gevent.monkey
gevent.monkey.patch_all() #
import gevent.pool
import os
import time
from aip import AipFace
import base64
""" 你的 APPID AK SK """
APP_ID = 'xxxx'
API_KEY = 'xxxxxxxxxxxxxxx'
SECRET_KEY = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
client = AipFace(APP_ID, API_KEY, SECRET_KEY)
#读取图片
def get_file_content(filepath):
with open(filepath,'rb') as fp:
base64_data=base64.b64encode(fp.read())
s=base64_data.decode()
return s
def preImage(filepath):
return {"image":get_file_content(filepath),"image_type":"BASE64"}
def FaceCompare(filepath):
return client.match([preImage("Mina.jpg"),preImage(filepath)]),filepath
if __name__=="__main__":
mypool=gevent.pool.Pool(1) #协程池,只用一个,因为上传照片网速不行
images=os.listdir("pic")
path=r"pic"
filepath2=[]
for image in images:
filepath2.append(path+"\\"+image)
result=mypool.map(FaceCompare,filepath2)
face_score_dict={}
face_score=[]
file_bak=open("result_bak.txt","w")
for r,n in result:
try:
face_score.append(r['result']['score'])
face_score_dict[r['result']['score']]=n[4:]
file_bak.write(r['result']['score']+"******"+n[4:]+"\r\n")
except:
print("score error")
file_bak.close()
face_score.sort(reverse=True)
file=open("初恋相似度.txt","w")
for i,b in enumerate(face_score):
string="{}的颜值与初恋相似度排第{}名,她的相似度是{}".format(face_score_dict[b],i+1,b)
#print(string)
try:
file.write(string.encode("gbk","ignore").decode("gbk")+"\r\n")
file.flush()
except:
print("写入错误")
file.close()
OK,通过初恋相似度.txt这个文件就可以找到跟gakki长得像的女生了。
先看一下整体情况:
有点儿失望,相似度超过50分的都没有,毕竟只有一千多张照片。好了,看一下排名最高的前三位都长啥样。
排名第一位,颜值相似度:49.13
脸的轮廓有点儿像
排名第二位,颜值相似度:45.55
眼睛很像gakki的
排名第三位,颜值相似度:44.42
这位怎么样,大家自己评论。
由于只有一千多位照片,所以嘛,找不到和gakki颜值相似度高的可以理解,只要下载的数据多,肯定是可以找到心仪的初恋女友的。
总结:首先从某相亲网站上爬取特定条件的女性头像,建好数据库;再使用baidu ai的API接口做人脸识别和人脸比对;最后对比对结果进行排名
好了!下次更新再见~