利用python对《青春有你2》小姐姐们进行可视化分析

主要利用python结合爬虫和可视化技术对《青春有你2》的进行简单的数据统计与分析。

一、信息获取

利用前面文章介绍的scrapy框架对爱奇艺官方助力网站进行数据爬取,不过这里涉及到动态网页的抓取,根据下面的网页分析有两种方案,一是需要配合selenium和谷歌驱动浏览器无头模式一起使用,再根据网页标签进行解析,二是直接请求网页的动态地址,返回json格式的选手数据。通过爬虫,我们可以获取小姐姐们的一些数据,包括:姓名、出生日期、身高体重等信息,以及他们的美照。

image

1. 网页分析

大致浏览下助力网站,包含主页助力页面,点击头像进入小姐姐的主页,这里有礼物解锁和精彩视频,再进入泡泡圈,就可以了解小姐姐的详细信息了。

image

个人信息页

image

主网站解析:http://www.iqiyi.com/h5act/generalVotePlat.html?activityId=373

方式一:通过selenium模拟访问返回的网页源码进行解析。

image

可以通过XPath Helper谷歌浏览器插件帮助进行网页解析。

image

方式二:根据网页实际请求地址,可以从Header查看请求地址,直接获取json返回数据。

image

2. 信息获取

准备工作

  • 安装python工具库scrapy和selenium

scrapy为一个爬虫框架,之前有介绍:

pip install scrapy

若使用方式一进行数据抓取,还需要准备以下工作:安装selenium和浏览器驱动。我使用的是第二种方式直接获取请求后的json数据,这里也对方式一做简单记录。

selenium是一个用于Web应用程序测试的工具。直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器有IE(7, 8, 9, 10, 11),Firefox,Safari,Chrome,Opera等,在爬虫上则是模拟正常用户访问网页并获取数据。

pip install selenium
  • 安装驱动

这里我选择使用谷歌浏览器作为模拟用户操作的浏览器,因此需要安装对应的驱动chromedriver使得selenium可以调用chrome浏览器。

通过帮助 > 关于Google Chrome(G),查看浏览器版本。

通过淘宝的镜像:
http://npm.taobao.org/mirrors/chromedriver/

image

找到对应版本驱动并下载到本地。解压将chromedriver.exe放在有设置环境变量的目录下,便于程序调用,本人放在python的安装目录下。

数据爬取

  • 创建scrapy项目
scrapy startproject youngni
cd youngni
scrapy genspider star "替换为爱奇艺官方助力网站"
  • 编写代码

编写Item数据项

# -*- coding: utf-8 -*-
import scrapy

class StarItem(scrapy.Item):
    order = scrapy.Field()      # 排序
    name = scrapy.Field()       # 姓名
    page_url = scrapy.Field()   # 个人页
    option_id = scrapy.Field()  # 个人详细页面id页
    photo_url = scrapy.Field()  # 照片
    discover_image = scrapy.Field()  # 透明背景照片

    num_fans = scrapy.Field()        # 粉丝数量
    num_content = scrapy.Field()     # 内容数量

    birth_place = scrapy.Field()  # 出生地
    birth_day = scrapy.Field()    # 生日
    zodiac = scrapy.Field()       # 星座
    height = scrapy.Field()       # 身高
    weight = scrapy.Field()       # 体重
    occupation = scrapy.Field()   # 职业
    hobby = scrapy.Field()        # 爱好
    profile = scrapy.Field()      # 简介
    school = scrapy.Field()      # 简介
    fannick = scrapy.Field()      # 简介

返回json处理和网页解析

# -*- coding: utf-8 -*-
import json
import scrapy
from youngni.items import StarItem

class StarSpider(scrapy.Spider):
    name = 'star'
    allowed_domains = ['iqiyi.com']
    # start_urls = ['https://www.iqiyi.com/h5act/generalVotePlat.html?activityId=373']
    start_urls = ['https://vote.iqiyi.com/vote-api/r/getMergeVoteInfo?voteIds=0463831125010981&sourceId=1&uid=2033788978&sign=5a8981521f3c13377f1d0843363d3652']

    info_map = {'出生地':'birth_place', '生日':'birth_day', '星座':'zodiac', '身高':'height',
                '体重':'weight', '职业':'occupation', '简介':'profile', '爱好': 'hobby',
                '毕业院校': 'school', '粉丝昵称':'fannick'}

    def precess(self, text):
        if '万' in text:
            return float(text.replace('万', '')) * 10000
        return int(text)

    def parse(self, response):
        json_data = json.loads(response.body)
        data_dict = json_data['data']['0463831125010981']['childs'][0]['options']
        for index, item_dict in enumerate(data_dict):
            star_item = StarItem()
            star_item['order'] = index                         # 当前排名
            star_item['name'] = item_dict['text']              # 姓名
            star_item['page_url'] = item_dict['pageUrl']       # 个人页
            star_item['option_id'] = item_dict['optionId']     # 个人详细页面id页
            star_item['photo_url'] = [item_dict['picUrl']]     # 照片
            star_item['discover_image'] = [eval(item_dict['kv'])["discover_image"]]  # 透明背景照片

            url = 'https://m.iqiyi.com/m5/bubble/circleInfo_w{page_url}_p15.html'.format(page_url=star_item['option_id'])
            yield scrapy.Request(url,  meta={'star_item': star_item}, callback=self.parse_circleInfo)

    def parse_circleInfo(self, response):
        star_item = response.meta['star_item']

        infos = response.xpath('//div[@class="topic-info"]/span[@class="c-topic-info"]/text()').extract()
        star_item['num_fans'] = self.precess(infos[0].replace('粉丝:', ''))
        star_item['num_content'] = self.precess(infos[1].replace('内容:', ''))

        url = 'https://m.iqiyi.com/m5/bubble/star_s{}_p15.html'.format(star_item['option_id'])
        yield scrapy.Request(url, meta={'star_item': star_item}, callback=self.parse_star_page)

    def parse_star_page(self, response):
        star_item = response.meta['star_item']
        infos = response.xpath('//div[@class="m-starFile-Pinfo"]/div[@class="c-info-wape"]')

        star_infors_tag = infos[0].xpath('//h2/text()').extract()
        star_infors = infos[0].xpath('//div[@class="info-right"]/text()').extract()[:len(star_infors_tag)]
        info_dict = dict(zip(star_infors_tag, star_infors))
        for key in info_dict:
            star_item[self.info_map[key]] = info_dict[key] if '\n' not in info_dict[key] else None
        yield star_item

数据存取pipeline,主要实现将信息写入到csv文件,图片处理的pipeline可以不用直接写,scrapy提供有scrapy.pipelines.images.ImagesPipeline直接保存图片,需要将照片链接转成list,然后和保存路径一并配置在setting里。

# -*- coding: utf-8 -*-
import pandas as pd
from scrapy.pipelines.images import ImagesPipeline

class YoungniPipeline(object):
    def __init__(self):
        self.info_list = []

    def process_item(self, item, spider):
        self.info_list.append(item)
        return item

    def close_spider(self, spider):
        df = pd.DataFrame(self.info_list)
        df.to_csv('star_info.csv', encoding='utf-8', index=False)

setting配置

BOT_NAME = 'youngni'

SPIDER_MODULES = ['youngni.spiders']
NEWSPIDER_MODULE = 'youngni.spiders'
ROBOTSTXT_OBEY = False
ITEM_PIPELINES = {
   'youngni.pipelines.YoungniPipeline': 300,
   'scrapy.pipelines.images.ImagesPipeline': 1
}
# photo_url是在item.py文件中添加的图片的url属性
IMAGES_URLS_FIELD = 'photo_url'
# 设置存放图片的路径
IMAGES_STORE = './images'

运行程序,等着收小姐姐们的数据吧🙂

import os
os.system("scrapy crawl star")

二、可视化分析

01. 数据可视化

本部分主要根据上面获取的数据进行各类信息的统计与可视化展示,采用pandas做统计分析,使用pyecharts进行可视化绘制,代码较多就不展示了。

pyecharts文档:https://pyecharts.org
pyecharts案例:https://gallery.pyecharts.org

年龄段分析:年龄集中在21至25之间,看来90后的我们还是很青春的嘛。

image

**地域分析**:可以看出山东妹子最多,其余相对较多的分布在长江流域的省份。

image

身高分析:平均身高167,最高身高175,最矮158。

image

体重分析:数量最多的体重在48kg,难怪别人吃火锅,大于48kg的就只能吃黄瓜了🤭。

星座统计:相对较多的是狮子座、魔羯座、天秤座和白羊座,不知道出道和星座有关系没有?

image

爱好词云:看看小姐姐们都有些什么爱好,排第一的竟然是看电影😀

image

**粉丝话题**:根据泡泡圈粉丝统计数量进行展示,第一名虞书欣绝对的优势啊。

02. 图像操作

使用百度paddlehub的pyramidbox_face_detection人脸检测模型对大合照(绝佳的测试样本啊)进行人脸检测,竟然都还有漏检的,使用轻量化模型Ultra-Light-Fast-Generic-Face-Detector-1MB更没法看。

image

人像漫画:调用百度人像漫画API接口实现

漫画美少女-费沁源

image

据说小姐姐们撞脸了整个娱乐圈,我用了百度的人脸识别试了试乃万和王源的最强撞脸,看来实锤了。

乃万 VS 王源

我以为相似度会上升呢😀

乃万 VS 女版王源

人脸融合以下试试,几乎没有违和感啊

image

最后,要想出道,颜值肯定得过关,这里仍采用了百度的人脸识别接口进行人脸检测、关键点定位和颜值打分

image

然后,AI搞事情的我肯定是要对颜值排个序的,看看百度模型认为的高颜值是什么样的。

image

看来这模型还是不行啊,我觉得小姐姐们都应该是90多分以上的颜值啊。

排名前三的小姐姐:

image

image

image

到此,所有骚操作结束,快去为自己喜欢的小姐姐助力去吧!

posted @ 2020-04-19 17:15  fahaiAI  阅读(1346)  评论(0编辑  收藏  举报