Python爬蟲+顏值打分,5000+圖片找到你的Mrs. Right

 
 

一見傾心鐘的不是情,是臉
日久生情生的不是臉,是情php

項目簡介

本項目利用Python爬蟲和百度人臉識別API,針對簡書交友專欄,爬取用戶照片(侵刪),並進行打分。
本項目包括如下內容:html

  • 圖片爬蟲
  • 人臉識別API使用
  • 顏值打分並進行文件歸類

圖片爬蟲

如今各大交友網站都會有一些用戶會爆照,本文爬取簡書交友專欄(https://www.jianshu.com/c/bd38bd199ec6)的全部帖子,並進入詳細頁,獲取全部圖片並下載到本地。服務器

 
 
代碼
import requests
from lxml import etree
import time

headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36'
}

def get_url(url):
    res = requests.get(url,headers=headers)
    html = etree.HTML(res.text)
    infos = html.xpath('//ul[@class="note-list"]/li')
    for info in infos:
        root = 'https://www.jianshu.com'
        url_path = root + info.xpath('div/a/@href')[0]
        # print(url_path)
        get_img(url_path)
    time.sleep(3)

def get_img(url):
    res = requests.get(url, headers=headers)
    html = etree.HTML(res.text)
    title = html.xpath('//div[@class="article"]/h1/text()')[0].strip('|').split('')[0]
    name = html.xpath('//div[@class="author"]/div/span/a/text()')[0].strip('|')
    infos = html.xpath('//div[@class = "image-package"]')
    i = 1
    for info in infos:
        try:
            img_url = info.xpath('div[1]/div[2]/img/@data-original-src')[0]
            print(img_url)
            data = requests.get('http:' + img_url,headers=headers)
            try:
                fp = open('row_img/' + title + '+' + name + '+' + str(i) + '.jpg','wb')
                fp.write(data.content)
                fp.close()
            except OSError:
                fp = open('row_img/' + name + '+' + str(i) + '.jpg', 'wb')
                fp.write(data.content)
                fp.close()
        except IndexError:
            pass
        i = i + 1

if __name__ == '__main__':
    urls = ['https://www.jianshu.com/c/bd38bd199ec6?order_by=added_at&page={}'.format(str(i)) for i in range(1,201)]
    for url in urls:
        get_url(url)

 

 
 

人臉識別API使用

因爲爬取了帖子下面的全部圖片,裏面有各類圖片(不包括人臉),並且是爲了找到高顏值小姐姐,若是人工篩選費事費力,這裏調用百度的人臉識別API,進行圖片過濾和顏值打分。測試

人臉識別應用申請
  • 首先,進入百度人臉識別官網(http://ai.baidu.com/tech/face),點擊當即使用,登錄百度帳號(沒有就註冊一個)。
 
 
  • 建立應用,完成後,點擊管理應用,就能看到AppID等,這些在調用API時須要使用的。
 
 
 
 
API調用

這裏使用楊超越的圖片先試下水。經過結果,能夠看到75分,還算比較高了(本身用了一些網紅和明星測試了下,分數平均在80左右,最高也沒有90以上的)。網站

 
 
from aip import AipFace
import base64
 
APP_ID = ''
API_KEY = ''
SECRET_KEY = ''
 
aipFace = AipFace(APP_ID, API_KEY, SECRET_KEY)
 
filePath = r'C:\Users\LP\Desktop\6.jpg'
def get_file_content(filePath):
    with open(filePath, 'rb') as fp:
        content = base64.b64encode(fp.read())
        return content.decode('utf-8')
    
imageType = "BASE64"
    
options = {}
options["face_field"] = "age,gender,beauty"

result = aipFace.detect(get_file_content(filePath),imageType,options)
print(result)

 

 
 

顏值打分並進行文件歸類

最後結合圖片數據和顏值打分,設計代碼,過濾掉非人物以及男性圖片,獲取小姐姐圖片的分數(這裏處理爲1-10分),並分別存在不一樣的文件夾中。url

from aip import AipFace
import base64
import os
import time

APP_ID = ''
API_KEY = ''
SECRET_KEY = ''
 
aipFace = AipFace(APP_ID, API_KEY, SECRET_KEY)

def get_file_content(filePath):
    with open(filePath, 'rb') as fp:
        content = base64.b64encode(fp.read())
        return content.decode('utf-8')
    
imageType = "BASE64"
    
options = {}
options["face_field"] = "age,gender,beauty"

file_path = 'row_img'
file_lists = os.listdir(file_path)
for file_list in file_lists:
    result = aipFace.detect(get_file_content(os.path.join(file_path,file_list)),imageType,options)
    error_code = result['error_code']
    if error_code == 222202:
        continue
        
    try:
        sex_type = result['result']['face_list'][-1]['gender']['type']
        if sex_type == 'male':
            continue
    #     print(result)
        beauty = result['result']['face_list'][-1]['beauty']
        new_beauty = round(beauty/10,1)
        print(file_list,new_beauty)
        if new_beauty >= 8:
            os.rename(os.path.join(file_path,file_list),os.path.join('8分',str(new_beauty) +  '+' + file_list))
        elif new_beauty >= 7:
            os.rename(os.path.join(file_path,file_list),os.path.join('7分',str(new_beauty) +  '+' + file_list))
        elif new_beauty >= 6:
            os.rename(os.path.join(file_path,file_list),os.path.join('6分',str(new_beauty) +  '+' + file_list))
        elif new_beauty >= 5:
            os.rename(os.path.join(file_path,file_list),os.path.join('5分',str(new_beauty) +  '+' + file_list))
        else:
            os.rename(os.path.join(file_path,file_list),os.path.join('其餘分',str(new_beauty) +  '+' + file_list))
        time.sleep(1)
    except KeyError:
        pass
    except TypeError:
        pass

 

最後結果8分以上的小姐姐不多,如圖(侵刪)。spa

 
 

最後傳播一個喜大普奔的消息

騰訊雲有史以來最大優惠,新用戶福利1000減750!雲服務器最低3折,1核1G內存50G硬盤1年最低325元!戳此瞭解詳情設計

 


 

做者:羅羅攀
連接:https://www.jianshu.com/p/7ba9c90ff12d
來源:簡書

3d

相關文章
相關標籤/搜索