美文网首页
爬虫小项目之二 颜值排名+寻找初恋

爬虫小项目之二 颜值排名+寻找初恋

作者: Charles_ye | 来源:发表于2020-07-17 10:17 被阅读0次

    昨天晚上听了十几遍[《愿得一人心》川建国版],我被建国同志的英雄事迹感动得热泪盈眶,整晚失眠。长夜漫漫,总要干点活。寻思着正好我还是个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张美女照片,放出一部分大家欣赏一下


    image.png

    小姐姐们画完妆颜值还是不错滴~
    接下来就要对这些小姐姐们的颜值进行打分和排名了。自己搭建人脸识别巨型神经网络?~那是不可能滴,没有那么多资源训练神经网络,不过如果是搭建一个迁移学习的神经网络是可以的。等有空在干这个。对于我们这些白嫖党来说,自然是“君子善假于物”。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()
    

    排名就出来了,大家一起欣赏一下:


    image.png

    看一下颜值最高的前三位长啥样:
    排名第一位的,颜值分数:89.5


    image.png
    排名第二位的,颜值分数:89.26
    image.png

    排名第三位的,颜值分数:87.48


    image.png
    啧啧啧,不得不感叹,亚洲的美颜黑科技太强大了,差不多都是网红脸。
    那么排名最后的,我看了一下,基本是纯天然不修边幅那种,这里就不跟大家分享了。

    接下来,就要做寻找初恋这个任务了。首先要找到一个初恋,我的嘛就算了。这里就选择新垣结衣吧,毕竟她是大家的”老婆“。
    先上gakki美照:


    Mina.jpg

    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长得像的女生了。
    先看一下整体情况:


    image.png

    有点儿失望,相似度超过50分的都没有,毕竟只有一千多张照片。好了,看一下排名最高的前三位都长啥样。
    排名第一位,颜值相似度:49.13


    image.png
    脸的轮廓有点儿像
    排名第二位,颜值相似度:45.55
    image.png

    眼睛很像gakki的
    排名第三位,颜值相似度:44.42


    image.png
    这位怎么样,大家自己评论。
    由于只有一千多位照片,所以嘛,找不到和gakki颜值相似度高的可以理解,只要下载的数据多,肯定是可以找到心仪的初恋女友的。

    总结:首先从某相亲网站上爬取特定条件的女性头像,建好数据库;再使用baidu ai的API接口做人脸识别和人脸比对;最后对比对结果进行排名
    好了!下次更新再见~

    相关文章

      网友评论

          本文标题:爬虫小项目之二 颜值排名+寻找初恋

          本文链接:https://www.haomeiwen.com/subject/lawwhktx.html