Python爬虫实战,requests模块,Python实现抓取虎牙小姐姐照片并做颜值评分

231 阅读3分钟

「这是我参与2022首次更文挑战的第14天,活动详情查看:2022首次更文挑战」。

前言

今天带你Python实现抓取虎牙小姐姐照片并做颜值评分

让我们愉快地开始吧~

开发工具

Python版本: 3.6.4

相关模块:

requests模块;

pandas模块;

以及一些Python自带的模块。

环境搭建

安装Python并添加到环境变量,pip安装需要的相关模块即可。

页面分析

打开虎牙直播星秀模块,按F12进入开发者模式,然后选中Network->XHR,再拖到页面最下方点击第2页,查看开发者页签中Name的变化找到如图所示部分即可。

图片

通过原始url地址加上请求参数即可,如下:

# 原始url地址
url = 'https://www.huya.com/cache.php'
# 请求参数
parames = {
    'm': 'LiveList',
    'do': 'getLiveListByPage',
    'gameId': 1663,
    'tagAll': 0,
    'page': 2, # 翻页后会变化的字段
    }

点击开发者模式页签里的Preview可以看到请求的结果也是很格式化的,如下:

图片

对照左侧的实际网页渲染的结果,我们可以看到包含封面图(对应请求结果的screenshot),房间的简介(对应请求结果的 introduction),主播名称(对应请求结果的nick)以及其他一些更详细的信息。

图片

单页主播信息爬取

直接用json.loads()方法即可解析为字典格式,然后选取需要的键值信息即可。

通过分析请求的结果数据,发现需要的单页主播信息在data = js['data']['datas']中,是由字典组成的列表。同时,此时在进行直播的主播数为1102,总页数为totalPage,这为我们后续做自动翻页提供了便利。

图片

import requests
import json
import pandas as pd

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.66 Safari/537.36",
    }
# 原始Url地址
url = 'https://www.huya.com/cache.php'
# 请求参数
parames = {
    'm': 'LiveList',
    'do': 'getLiveListByPage',
    'gameId': 1663,
    'tagAll': 0,
    'page': 1,
    }

rep = requests.post(url,headers=headers,params=parames)
text = rep.text
# 请求结果为json格式,我们用json.loads()方法处理
js = json.loads(text)
# 通过字典获取键值
data = js['data']['datas']
# 直接转化为dataframe类型
df = pd.DataFrame(data)

转化为dataframe后结果预览

图片

主播图片下载

获取了主播房间的封面图(对应请求结果的screenshoturl地址,直接请求改地址然后就可进行保存本地了。

先将df中的该列数据转化为列表,然后遍历列表进行请求和下载到本地。

# 主播图片地址列表
urls = df.screenshot.to_list()
# 主播名称列表
nicks = df.nick.to_list()
for i,(nick,imgUrl) in enumerate(zip(nicks,urls)):
    img = requests.get(imgUrl).content
    name = f'封面图\{nick}.jpg'
    with open(name,'wb') as f:
        f.write(img)
        
    print(f'{i+1}个图片已下载')

完成的主播封面图:

image.png

主播颜值评分

# 定义获取评分的函数
def ksfaceScore(pic_url):
    '''
    Parameters
    ----------
    pic_url : str
        用于进行颜值评分的图片地址
    Returns
    -------
    gender:str
        性别
    age:int
        年龄
    beauty_w:int
        女性视角评分
    beauty_m:int
        男性视角评分
    '''
    url = 'https://api-cn.faceplusplus.com/facepp/v3/detect'
    
    APIKey = '你的key' 
    APISecret = '你的secret'
#    pic_url = 'https://anchorpost.msstatic.com/cdnimage/anchorpost/1071/be/43a2756f5fc3aa0df31a1bc14fb13a_1663_1610179385.jpg'
    
    data = {"api_key":APIKey,
            "api_secret":APISecret,
            "image_url":pic_url,
            "return_attributes":"gender,age,beauty"
            }
    res = requests.post(url,data = data)
    dic_ = eval(res.text)
    gender = dic_['faces'][0]['attributes']['gender']['value']
    age = dic_['faces'][0]['attributes']['age']['value']
    beauty_w = dic_['faces'][0]['attributes']['beauty']['female_score']
    beauty_m = dic_['faces'][0]['attributes']['beauty']['male_score']
    
    return gender,age,beauty_w,beauty_m

拿下面这个小姐姐图片做示例,其照片url地址为 https://anchorpost.msstatic.com/cdnimage/anchorpost/1071/be/43a2756f5fc3aa0df31a1bc14fb13a_1663_1610179385.jpg

图片

调用函数获取相关参数数值如下:

In [1]: pic_url = 'https://anchorpost.msstatic.com/cdnimage/anchorpost/1071/be/43a2756f5fc3aa0df31a1bc14fb13a_1663_1610179385.jpg'

In [2]: ksfaceScore(pic_url)
Out[2]: ('Female', 22, 86.18, 85.295)

性别:Female(女) 年龄:22 女性视角评分:86.18 男性视角评分:85.295