淘宝、拼多多、抖音主播颜值大比拼

本文涉及的产品
阿里云百炼推荐规格 ADB PostgreSQL,4核16GB 100GB 1个月
简介: 淘宝、拼多多、抖音主播颜值大比拼

淘宝、拼多多、抖音主播颜值大比拼


今年的 618,各大在线购物网站主打网络直播,如:淘宝、拼多多、抖音。在直播视频中每个主播都是高颜值的帅哥美女,那谁家的主播颜值最高呢?让我们用 Python 打造一款颜值排行利器吧。


技术点


使用 ADB(Android Debug Bridge)技术用 Python 代码控制手机截取直播的屏幕再发送到电脑后,使用百度 AI 开放平台的 人脸检测 API 请求得出颜值,最后使用 pyecharts 画出图表


使用的技术点有:


  1. ADB 命令
  2. 百度 AI 开放平台人脸检测 API
  3. pyecharts 画出图表


ADB


第一步需要在电脑端安装 ADB,大家可以自行百度或 google 一下。下面介绍一下需要用到的 ADB 命令


截取屏幕


将截取屏幕的图片放到 /sdcard/zhubo/taobao/xxxx.png


adb shell /system/bin/screencap -p /sdcard/zhubo/taobao/xxxx.png

滑动屏幕


将截取屏幕的图片放到 /sdcard/zhubo/taobao/xxxx.png


adb shell input swipe 1000 300 1000 10

发送文件到电脑



把文件从手机的移动到电脑


adb pull /sdcard/zhubo/taobao/xxxx.png /Users/xx/Desktop/zhubo/taobao/xxxx.png,

列出手机文件夹中的文件


列出 taobao 文件夹下的所有文件


adb shell ls /sdcard/zhubo/taobao

在 python 中的使用


在 Python 代码中使用 subprocess 模块调用 ADB 命令,总共有三个函数分别为:__init__函数、screen函数、pull函数。


__init__ 函数在类初始化的时候判断是否连接了手机设备 screen 函数截取手机屏幕,将图像保存在手机的文件夹中 pull 函数将截取的图像发送到电脑


import subprocess
mobile_root = "/sdcard/zhubo/"
computer_root = "/Users/xx/Desktop/zhubo/"
except_file = "/Users/xx/Desktop/zhubo/except.txt"
def __init__(self):
    '''
    查看连接的手机,没有手机连接则抛出异常
    '''
    connect = subprocess.Popen("adb devices",
                                stderr=subprocess.PIPE,
                                stdout=subprocess.PIPE,
                                shell=True)
    stdout, stderr = connect.communicate()  # 获取返回命令
    # 输出执行命令结果结果
    stdout = stdout.decode("utf-8")
    if len(stdout) <= 26:
        raise Exception("没有连接到手机")
    print("成功连接手机!")
def screen(self, platform):
    '''
    截取屏幕,保存到手机中的 /sdcard/zhubo/ + platform 文件夹中
    :param platform: 平台,如:taobao、pdd、jingdong
    '''
    for i in range(1, 618):
        time.sleep(3)
        pic_name = platform + '_' + str(int(time.time() * 1000)) + '.png'
        # 截屏
        screencap = subprocess.Popen('adb shell /system/bin/screencap -p /sdcard/zhubo/' + platform + '/' + pic_name,
                                    stderr=subprocess.PIPE,
                                    stdout=subprocess.PIPE,
                                    shell=True)
        # 滑动屏幕
        swipe = subprocess.Popen('adb shell input swipe 1000 300 1000 10',
                                    stderr=subprocess.PIPE,
                                    stdout=subprocess.PIPE,
                                    shell=True)
        print(str(i) + '    ' + pic_name)
def pull(self, platform):
    '''
    发送到电脑
    '''
    # 列出所有图像
    connect = subprocess.Popen('adb shell ls /sdcard/zhubo/' + platform,
                                stderr=subprocess.PIPE, stdout=subprocess.PIPE, shell=True)
    stdout, stderr = connect.communicate()
    stdout = stdout.decode("utf-8")
    pics = stdout.split('\n')
    for pic_name in pics:
        # 发送到电脑 /Users/xx/Desktop/zhubo/platform 文件夹下
        connect = subprocess.Popen('adb pull /sdcard/zhubo/' + platform + '/' + pic_name  + ' /Users/xx/Desktop/zhubo/'+platform + '/' + pic_name,
                                    stderr=subprocess.PIPE, stdout=subprocess.PIPE, shell=True)
    print('手机中的图像成功发送到电脑')


示例结果


image.png


淘宝、拼多多、抖音每个平台都截取了将近 800 张图片,过滤掉一些没有人像的图片,文章中每个平台将使用 618 张图片。


人脸检测


人脸检测我们使用百度 AI 开放平台的 API(https://ai.baidu.com/tech/face/detect),大家都知道百度 AI 开放平台的 API 需要登录百度账号后获取 AK 和 SK 取得 token 值才能得到调用。


image.png


获取 access_token


import time import requests


def getAccessToken(self):
    '''
    获取百度 AI 开放平台的 access_token
    :return: access_token
    '''
    ak = 'ak'
    sk = 'sk'
    host = 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=' + ak + '&client_secret=' + sk
    response = requests.get(host)
    if response:
        return response.json()['access_token']


获取颜值


获取颜值需要用到人脸检测的 API 也是相当的简单,必要的参数只需传入 image 为 base64 位的图片、指定图片类型 image_type 为 base64 以及返回的结果 face_field 为 beauty(颜值),外加上面获取到的 access_token


def image2base64(self, pic_path):
    '''
    图片转base64
    :param image_path: 图片地址
    :return: base64
    '''
    with open(pic_path, 'rb') as f:
        base64_data = base64.b64encode(f.read())
        s = base64_data.decode()
        return s
def beauty_detect(self, access_token, platform):
    '''
    人脸检测
    :param access_token: access_token
    :param platform: 平台,如:taobao、pdd、jingdong
    :return: 文件
    '''
    # 人脸检测 url
    request_url = "https://aip.baidubce.com/rest/2.0/face/v3/detect"
    # 为了防止请求百度发生意外事故,将颜值结果写入文件
    filename = self.computer_root + platform + '.txt'
    index = 0
    # 循环所有图片
    for root, dirs, files in os.walk(self.computer_root + platform ):
        for pic in files:
            index = index + 1
            base64img = self.image2base64(root + '/' + pic)
            params = "{\"image\":\"" + base64img + "\",\"image_type\":\"BASE64\",\"face_field\":\"beauty\"}"
            request_url = request_url + "?access_token=" + access_token
            headers = {'content-type': 'application/json'}
            # 免费 API QPS只有2个,可以使用多个账号,注意:这里容易异常
            response = requests.post(request_url, data=params, headers=headers)
            print(response)
            if response:
                json = response.json()
                print(json)
                # 解析获取颜值i
                if json['error_msg'] == 'SUCCESS':
                    face_list = json['result']['face_list']
                    beauty_list = []
                    for face in face_list:
                        beauty_list.append(face['beauty'])
                        beauty = max(beauty_list)
                        with open(filename, 'a') as f:
                            f.write(str(index) + ',' + pic + ',' + str(beauty) + '\n')


示例结果(部分):


image.png


image.png


image.png


图表


在上一节中已经计算出了每一张图片上美女、帅哥的颜值,在这一节将统计颜值在 ["90-100", "80-89", "70-79", "60-69", "50-59", "40-49", "30-39", "20-29", "10-19", "0-9"]分值阶段的个数并使用 pyecharts 模块统计成柱状图和饼图。


from pyecharts.charts import Bar, Pie
from pyecharts import options as opts
def calc(self, platform):
'''
统计颜值区间的个数
:param platform: 平台,如:taobao、pdd、douyin
:return: 颜值区间汇总、颜值字典
'''
beauty_sum_dir = {"90-100": 0, "80-89": 0, "70-79": 0, "60-69": 0, "50-59": 0, "40-49": 0, "30-39": 0,
                    "20-29": 0, "10-19": 0, "0-9": 0}
beauty_dir = {}
beauty_areas = ["90-100", "80-89", "70-79", "60-69", "50-59", "40-49", "30-39", "20-29", "10-19", "0-9"]
filename =  self.computer_root + platform + '.txt'
with open(filename) as f:
    lines = f.readlines()
if lines == None or len(lines) == 0:
    raise Exception(filename + '中没有颜值数据')
index = 0
for line in lines:
    # 只取 618 个图像
    index = index + 1
    if index > 618:
        break
    l = line.rstrip()
    result = l.split(',')
    beauty = float(result[2])
    beauty_area = beauty_areas[int((beauty // 10 * -1) - 1)]
    beauty_sum_dir[beauty_area] = beauty_sum_dir.get(beauty_area) + 1
    beauty_dir[result[1]] = result[2]
return beauty_sum_dir, beauty_dir
def bar(self, taobao_beauty_sum_dir = {}, pdd_beauty_sum_dir = {}, douyin_beauty_sum_dir = {}):
    '''
    柱状图
    :param taobao_beauty_sum_dir: 淘宝颜值区间汇总
    :param pdd_beauty_sum_dir: 拼多多颜值区间汇总
    :param douyin_beauty_sum_dir: 抖音颜值区间汇总
    :return: 
    '''
    bar = (
        Bar()
            .add_xaxis(list(taobao_beauty_sum_dir.keys()))
            .add_yaxis('淘宝', list(taobao_beauty_sum_dir.values()))
            .add_yaxis("拼多多", list(pdd_beauty_sum_dir.values()))
            .add_yaxis("抖音", list(douyin_beauty_sum_dir.values()))
            .set_global_opts(title_opts=opts.TitleOpts(title="主播颜值柱状图"))
    )
    bar.render("颜值柱状图.html")
def pie(self, platform, beauty_sum_dir = {}):
    '''
    饼图
    :param platform:  平台,如:taobao、pdd、douyin
    :param beauty_sum_dir: 颜值区间汇总
    :return: 
    '''
    c = (
        Pie()
            .add(
            "",
            [list(z) for z in zip(beauty_sum_dir.keys(), beauty_sum_dir.values())],
            center=["35%", "50%"],
        )
            .set_global_opts(
            title_opts=opts.TitleOpts(title=platform + '主播颜值饼图'),
            legend_opts=opts.LegendOpts(pos_left="15%"),
        )
            .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}({d}%)"))
            .render(platform + "颜值饼图.html")
    )


示例结果


image.png


image.png


从图表中可以看出,抖音主播的颜值最高在[60-89]分值区域人数最多,分值在[50-59]区域拼多多三者都相差不大,拼多多以一点点的优势胜出,[49-0]分值区域淘宝主播人数最多。可以得出结论如果只是冲主播颜值去看直播抖音是个第一选择。


前三颜值主播


最后按颜值倒序排列一下,欣赏一下前三的颜值主播吧


def sorted_by_value(self, beauty_dir):
    return beauty_sorted = sorted(beauty_dir.items(), key = lambda kv:(kv[1], kv[0]), reverse=True)


示例结果


image.png


image.png


image.png


总结

使用人脸检测技术得出抖音上高颜值主播的数量要大于淘宝和拼多多。完整的代码在代码示例中,有兴趣的朋友可以跑出来看看各大平台给你推荐的哪位高颜值主播

相关实践学习
阿里云百炼xAnalyticDB PostgreSQL构建AIGC应用
通过该实验体验在阿里云百炼中构建企业专属知识库构建及应用全流程。同时体验使用ADB-PG向量检索引擎提供专属安全存储,保障企业数据隐私安全。
AnalyticDB PostgreSQL 企业智能数据中台:一站式管理数据服务资产
企业在数据仓库之上可构建丰富的数据服务用以支持数据应用及业务场景;ADB PG推出全新企业智能数据平台,用以帮助用户一站式的管理企业数据服务资产,包括创建, 管理,探索, 监控等; 助力企业在现有平台之上快速构建起数据服务资产体系
目录
相关文章
为什么头条和抖音上这么多人月入好几万?
为什么头条和抖音上这么多人月入好几万?
|
NoSQL 网络协议 算法
不愧是抖音电商,问的真细。
前段时间分享了一位师弟的面经,他在提前批顺利拿到字节跳动抖音部门电商部门的offer,算是我知道的为数不多能在提前批阶段斩获offer的应届生了,其中编程语言和算法类考察面经详见该篇文章:抖音电商,提前批offer!。
236 0
体育足球直播APP开发,2023最新赛事直播系统现成源码推荐
随着移动设备和体育产业的快速发展,移动体育赛事直播应用已经成为人们观赛的主要途径之一。然而,开发一款功能具备实时的比赛直播、竞猜、精彩视频、社区互动等功能的APP常常需要巨大的开发成本、时间和风险。
|
Web App开发 人工智能 算法
抖音快手后,2019年短视频群雄逐鹿
抖音快手后,2019年短视频群雄逐鹿
256 0
抖音快手后,2019年短视频群雄逐鹿
|
监控 搜索推荐 前端开发
618直播间里玩起了“排位赛”,按小时刷榜的淘宝直播是如何保持稳定的?
今年天猫618期间,淘宝直播的核心玩法“排位赛”也进行了升级。
|
机器学习/深度学习 数据采集 编解码
3D全息技术带你沉浸式逛展逛店逛世界
万花筒3D全息扫描技术能够针对室内的各种场景实现全自动、高精度的室内3D全息内容采集和建模,并通过真实感的渲染技术,让用户摆脱了地理空间的束缚,身临其境地漫游在真实感的1比1复刻的数字孪生世界中。其中,团队自研的空间三维信息采集硬件,巧妙地运用旋转云台将单线激光雷达所采集的2D空间信息升格为3D信息,并研发了高效的深度稠密化算法。在算法拼接上,具有高精度,轻量化以及大规模化的优势,且引入高效的渲染技术让用户有更完美的沉浸体验感。目前该技术应用于云上会展、零售电商、建筑地产、家居服务等多个行业,通过AI技术推进真实物理空间的还原,让“空间”就在眼前。
900 0
3D全息技术带你沉浸式逛展逛店逛世界
|
数据安全/隐私保护
看过无数短视频软件后,发现了抖音短视频系统开发的小彩蛋
抖音之火,很多人都跟着“中了毒”,邻居聊天,同事间交流,常常谈起抖音短视频,同时也有很多人在研究它,小编也不例外,今天为大家分享几个抖音短视频系统开发的小秘密,快来看看你不知道的有几个?
看过无数短视频软件后,发现了抖音短视频系统开发的小彩蛋
|
新零售
抖音短视频开发项目跨入社交圈,头条实现社交梦?
“1月15日下午,抖音在新品发布会上正式宣布升级私信功能,并推出了自己的独立视频社交产品—多闪,定位于增进亲密关系,这意味着抖音正式进军社交领域。” 今日头条的公众号发文介绍了全新的社交产品多闪,官方称“多闪是一款由抖音推出的独立社交产品,主打视频社交,他们希望多闪是一个无压且有温度的熟人社交产品,帮助用户缓解日益沉重的社交压力,找回日渐疏远的亲密关系。
1451 0