「这是我参与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后结果预览
主播图片下载
获取了主播房间的封面图(对应请求结果的screenshot)url地址,直接请求改地址然后就可进行保存本地了。
先将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}个图片已下载')
完成的主播封面图:
主播颜值评分
# 定义获取评分的函数
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