利用python分析了下乘风破浪的姐姐
點擊上方“AI搞事情”關注我們
要說今年最火的綜藝節目,興風作浪……,哦,不對;小明歷險記……,也不對,哎!算了,接著看吧……
數據
利用爬蟲抓取了百度百科和維基百科上姐姐們的公開數據信息。兩個網站均為靜態的頁面,只需要對相應HTML標簽進行解析即可獲取相應的數據。(更簡單的方法也可以直接復制相應的表格信息到本地)
百度百科
百度百科頁面解析PS:仔細一瞧,百度百科上有些信息竟然是錯的,比如陳松伶的初舞臺評分。
宣傳照維基百科
維基百科頁面解析第一輪公演維基百科數據可以跟百度百科互補一下,對于評分細節更細致許多。
視頻彈幕
看著視頻,按F12打開開發者工具,然后在network下就會有彈幕json數據包不斷的向你扔過來了,在Headers欄可以查看json的路徑。https://bullet-ali.hitv.com/bullet/2020/06/30/224134/8766480/0.json可以看出有日期,即爬取當天的彈幕數據,其余兩個應該是節目id和視頻id,x.json應該是按照節目的時間來定的,每60s一個數據包。
還是采用之前【鏈接】使用的scrapy框架進行彈幕數據爬取,新建項目與爬蟲文件。
scrapy startproject sisiter cd sisiter scrapy genspider danmu bullet-ali.hitv.com構建數據Item
import scrapy class DanmuItem(scrapy.Item):# define the fields for your item here like:# 視頻idvid_id = scrapy.Field()# iddanmu_id = scrapy.Field()# unameuname = scrapy.Field()# 內容content = scrapy.Field()# 時間danmu_time = scrapy.Field()# 點贊up_count = scrapy.Field()# 分鐘danmu_minites = scrapy.Field()編寫爬蟲解析代碼
# -*- coding: utf-8 -*- import scrapy import json from datetime import datetime from sister.items import DanmuItemclass DanmuSpider(scrapy.Spider):name = 'danmu'# allowed_domains = ['bullet-ws.hitv.com']start_urls = ['https://bullet-ali.hitv.com']date_str = datetime.now().strftime('%Y/%m/%d')[:8] + str(datetime.now().day)# 當前時日期num1 = 112744 # 節目參數 7/3最新一期num2 = 8980904 # 視頻參數def start_requests(self):base_url = 'https://bullet-ali.hitv.com/bullet/%s/%d/%d/%d.json'for page in range(38):# 打印進度print('正在獲取第{}頁的信息'.format(page))url = base_url % (self.date_str, self.num1, self.num2, page)yield scrapy.Request(url=url, meta={'step': page}, callback=self.parse)def parse(self, response):step = response.meta['step']json_data = json.loads(response.body)# 獲取數據all_data = json_data['data']['items']print(len(all_data))for data in all_data:danmu_item = DanmuItem()danmu_item['vid_id'] = self.num2danmu_item['danmu_id'] = data.get('id')danmu_item['uname'] = data.get('uname')danmu_item['content'] =data.get('content')danmu_item['danmu_time'] = data.get('time')danmu_item['up_count'] = data.get('v2_up_count')danmu_item['danmu_minites'] = step + 1yield danmu_item保存數據pipeline
import pandas as pdclass SisterPipeline(object):def __init__(self):self.info_list = []def process_item(self, item, spider):self.info_list.append(item)return itemdef close_spider(self, spider):df = pd.DataFrame(self.info_list)df.to_csv('danmu_info.csv', sep='\t', encoding='utf-8', index=False)保存的數據就是這樣嬸兒的
可視化
整體
首先,看看姐姐們都來自哪里,可以看出節目組在姐姐們的選擇上兼顧到了兩岸三地。
而且在民族構成上,也包含了7位少數民族選手,比如“土家族之花”--沈夢辰。
年齡分布情況
職業分布情況
年齡與初評得分的關系很明顯了????
彈幕熱度排行
彈幕詞云,看來大家都 喜歡 姐姐
基于這些可視化結果,制作了一個簡易的統計大屏進行展示:
每位浪姐
代碼
import os import jieba import pandas as pd from bs4 import BeautifulSoup import matplotlib.pyplot as plt from pyecharts.charts import Page, Sankey, WordCloud, Radar from pyecharts.components import Image from pyecharts.options import ComponentTitleOpts from collections import Counter from pyecharts.globals import SymbolType from pyecharts import options as opts from pyecharts.options.global_options import ThemeType from pyecharts import options as opts from collections import Counter import random#顯示所有列 pd.set_option('display.max_columns', None) #顯示所有行 pd.set_option('display.max_rows', None) #設置value的顯示長度為100,默認為50 pd.set_option('max_colwidth',100)def get_cut_words(content_series):# 讀入停用詞表import jiebastop_words = []with open("data/stopwords.txt", 'r', encoding='utf-8') as f:lines = f.readlines()for line in lines:stop_words.append(line.strip())# 添加關鍵詞my_words = ['杜華', '辣雞', '導演組', '節目組', '不公平', '黃圣依', '無杜華版']for i in my_words:jieba.add_word(i)my_words2 = my_words_listfor j in my_words2:jieba.add_word(j)# 自定義停用詞my_stop_words = ['第一期', '一堆', '三個', '真的', '哈哈哈', '哈哈哈哈', '啊啊啊']stop_words.extend(my_stop_words)# 分詞word_num = jieba.lcut(content_series.str.cat(sep='。'), cut_all=False)# 條件篩選word_num_selected = [i for i in word_num if i not in stop_words and len(i) >= 2]return word_num_selecteddef show_all():page = Page()page.add(image1,wc,radar)out_html = 'data/sister/%s.html' % namepage.render(out_html)# 修改樣式with open(os.path.join(os.path.abspath("."), out_html), 'r+', encoding="utf8") as html:html_bf = BeautifulSoup(html, "lxml")divs = html_bf.find_all("div")print(len(divs))divs[0]["style"] = "align=\"center\";margin:0 auto;text-align:center;"divs[1]["style"] = "width:550px;height:350px;position:absolute;top:120px;left:700px;border-style:solid;border-color:#444444;border-width:0px;" # 修改圖表大小、位置、邊框divs[2]["style"] = "width:700px;height:700px;position:absolute;top:120px;left:20px;border-style:solid;border-color:#444444;border-width:0px;" # 修改圖表大小、位置、邊框divs[3]["style"] = "width:600px;height:400px;position:absolute;top:300px;left:1250px;border-style:solid;border-color:#444444;border-width:0px;" # 修改圖表大小、位置、邊框# 修改頁面背景色body = html_bf.find("body")body["style"] = "background-color:#333333;"# 追加標題div_title = "<div align=\"center\" style=\"width:1840px;\">\n<span style=\"font-size:32px;font face=\'黑體\';color:#FFFFFF\"><b> </b></div>"body.insert(0, BeautifulSoup(div_title, "lxml").div)html_new = str(html_bf)html.seek(0, 0)html.truncate()html.write(html_new)html.close()df = pd.read_csv('data/sister_data.csv', encoding='utf-8', sep='\t')# 彈幕數據 df_all = pd.DataFrame() for i in range(1, 9):tmp = pd.read_csv('sister/sister/danmu_info_%d.csv' % i, encoding='utf-8', sep='\t')df_all = df_all.append(tmp)# print(df['names'].tolist()) df.sort_values('總分', ascending=False, inplace=True) # 昵稱 df['昵稱'] = ['藍盈瑩|盈瑩', '黃齡', '丹妮', '孟佳', '夢辰','可唯', '寧靜|靜靜子|靜姐', '霏霏', '希怡', '袁詠琳','圣依|依依子', '金晨', '阿朵', '含韻', '白冰','鐘麗緹', '茜|茜茜子', '張萌|萌萌子', '婧汐', '丁當','許飛', '劉蕓|蕓蕓子', '吳昕|昕昕子|昕姐|昕昕', '伊能靜', '松伶','麗坤', '張雨綺|雨綺|綺綺子', '海陸', '金莎', '王智'] print(df.head(5)) print(df.columns)for name in df.names.tolist():image1 = Image()img_src = ("../img/%s.jpg" % name # html 路徑問題)image1.add(src=img_src,style_opts={"width": "345px", "height": "584px", "style": "margin-top: 15px"},)image1.set_global_opts(title_opts=ComponentTitleOpts(title_style={"style": "color: white; font-size: 18px; font-weight:bold;"},subtitle_style={"style": "color: white;font-size: 12px;"}))# 雷達圖value = df[["個人特質", "聲樂表現力", "成團潛力", "舞臺表現力"]][df.names == name].values[0]data = [{"value": [float(i) for i in value], "name": "分數"}]c_schema = [{"name": "個人特質", "max": 25, "min": 0},{"name": "聲樂表現力", "max": 25, "min": 0},{"name": "成團潛力", "max": 25, "min": 0},{"name": "舞臺表現力", "max": 25, "min": 0},]radar = (Radar().set_colors(["#4587E7"]).add_schema(schema=c_schema,shape="circle",center=["50%", "50%"],radius="80%",angleaxis_opts=opts.AngleAxisOpts(min_=0,max_=360,is_clockwise=False,interval=5,axistick_opts=opts.AxisTickOpts(is_show=False),axislabel_opts=opts.LabelOpts(is_show=False),axisline_opts=opts.AxisLineOpts(is_show=False),splitline_opts=opts.SplitLineOpts(is_show=False),),radiusaxis_opts=opts.RadiusAxisOpts(min_=0,max_=25,interval=5,splitarea_opts=opts.SplitAreaOpts(is_show=True, areastyle_opts=opts.AreaStyleOpts(opacity=1)),),polar_opts=opts.PolarOpts(),splitarea_opt=opts.SplitAreaOpts(is_show=False),splitline_opt=opts.SplitLineOpts(is_show=False),).add(series_name="分數",data=data,color="#f9713c",areastyle_opts=opts.AreaStyleOpts(opacity=0.1),linestyle_opts=opts.LineStyleOpts(width=1),))# 彈幕詞云tmp = df[df.names == name]my_words_list = df.昵稱.str.cat(sep='。').replace('|', '。').split('。')print(tmp.昵稱.values[0])text1 = get_cut_words(content_series=df_all.content[df_all.content.str.contains(tmp.昵稱.values[0])])wordCount_dict = Counter(text1)choices_number = 200count_list = sorted(wordCount_dict.items(), key=lambda x:x[1],reverse=True)count_list = count_list[:choices_number]keyword_list = [k[0] for k in count_list]value_list = [k[1] for k in count_list]wc = (WordCloud().add(series_name="彈幕詞云", data_pair=count_list, word_size_range=[20, 100],textstyle_opts=opts.TextStyleOpts(font_family="cursive"),shape=SymbolType.DIAMOND).set_global_opts(tooltip_opts=opts.TooltipOpts(is_show=True),))show_all()往期推薦
蹭一波熱度,對《青春有你2》109位漂亮小姐姐下手了
python獲取原圖GPS位置信息,輕松得到你的活動軌跡
Scrapy爬取姓名大全,看看那個名字最受父母青睞
長按二維碼關注我們
有趣的靈魂在等你
留言請摁
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的利用python分析了下乘风破浪的姐姐的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: DeepHSV:号称可以商用的计算机笔迹
- 下一篇: 目标又多又密?多轮迭代的方式进行密集目标