今天分析『奔跑吧』全系列的嘉賓名單,分析每位嘉賓參加次數(shù)(可能有的嘉賓參加過幾季),以及統(tǒng)計嘉賓職業(yè)類型個數(shù),最后進(jìn)行可視化展示分析。
1、網(wǎng)頁分析
通過網(wǎng)上查詢,知道『奔跑吧』到目前為止一共9季,先是奔跑吧兄弟14,到后面改名為奔跑吧14,以及奔跑吧黃河篇。
對應(yīng)的網(wǎng)頁鏈接如下:
url_list=[
'https://baike.baidu.com/item/奔跑吧兄弟第一季#4_2',
'https://baike.baidu.com/item/奔跑吧兄弟第二季/16414779',
'https://baike.baidu.com/item/奔跑吧兄弟第三季',
'https://baike.baidu.com/item/奔跑吧兄弟第四季',
'https://baike.baidu.com/item/奔跑吧第一季/20433390?fromtitle=奔跑吧第1季&fromid=22645259&fr=aladdin#4_2',
'https://baike.baidu.com/item/奔跑吧第二季/22421345?fromtitle=奔跑吧第2季&fromid=22645247&fr=aladdin#4_2',
'https://baike.baidu.com/item/奔跑吧第三季/23284990?fromtitle=奔跑吧第3季&fromid=23285732&fr=aladdin',
'https://baike.baidu.com/item/奔跑吧第四季/24701671?fromtitle=奔跑吧第4季&fromid=50003758&fr=aladdin',
'https://baike.baidu.com/item/奔跑吧·黃河篇/53052048'
]
1.分析網(wǎng)頁結(jié)構(gòu)
首先以奔跑吧第1季為例去分析網(wǎng)頁結(jié)構(gòu)(其他的鏈接網(wǎng)頁結(jié)構(gòu)一樣)
咱們主要是爬取嘉賓姓名和明星類型(演員、歌手等)
本來想通過xpath解析網(wǎng)頁方式去定位數(shù)據(jù),但是發(fā)現(xiàn)定位不到,所以就采取了另外一種方式:字符串截取(其實(shí)正則re也可以,有很多種方式,只要能夠解析出來即可,大家可以自由發(fā)揮)
截取前后分別是:分期嘉賓、表演嘉賓
2、獲取數(shù)據(jù)
首先導(dǎo)入相應(yīng)的庫
import requests
from lxml import etree
import json
import time
import openpyxl
將9季的網(wǎng)頁鏈接放到集合中url_list,同時定義name存放嘉賓名字,types是明星類型(歌手、演員等)
### 姓名
name = []
### 明星類型
types = []
url_list=[
'https://baike.baidu.com/item/奔跑吧兄弟第一季#4_2',
'https://baike.baidu.com/item/奔跑吧兄弟第二季/16414779',
'https://baike.baidu.com/item/奔跑吧兄弟第三季',
'https://baike.baidu.com/item/奔跑吧兄弟第四季',
'https://baike.baidu.com/item/奔跑吧第一季/20433390?fromtitle=奔跑吧第1季&fromid=22645259&fr=aladdin#4_2',
'https://baike.baidu.com/item/奔跑吧第二季/22421345?fromtitle=奔跑吧第2季&fromid=22645247&fr=aladdin#4_2',
'https://baike.baidu.com/item/奔跑吧第三季/23284990?fromtitle=奔跑吧第3季&fromid=23285732&fr=aladdin',
'https://baike.baidu.com/item/奔跑吧第四季/24701671?fromtitle=奔跑吧第4季&fromid=50003758&fr=aladdin',
'https://baike.baidu.com/item/奔跑吧·黃河篇/53052048'
]
開始請求數(shù)據(jù)
### 循環(huán)遍歷
for u in url_list:
url = u
print(url)
res = requests.get(url,headers=headers)
res.encoding = 'utf-8'
text = res.text
sp1 = text.split("參與期數(shù)")[1].split("表演嘉賓")[0]
selector = etree.HTML(sp1)
tr_list = selector.xpath('.//tr')
tr_list = tr_list[1:]
###名字
for i in tr_list:
#print(i.xpath(".//div[@class='para']/b/a/text()")[0])
name.append(i.xpath(".//div[@class='para']/b/a/text()")[0])
### 明星類型
for i in tr_list:
te = i.xpath(".//div[@class='para']/text()")[0]
te = te.split(",")[0].replace("(","")
#print(te)
types.append(te)
print(name)
print(types)
print(len(name))
print(len(types))
保存數(shù)據(jù)(excel)
outwb = openpyxl.Workbook()
outws = outwb.create_sheet(index=0)
outws.cell(row=1, column=1, value="名字")
outws.cell(row=1, column=2, value="明星類型")
for i in range(0,len(name)):
outws.cell(row=i+2, column=1, value=str(name[i]))
outws.cell(row=i+2, column=2, value=str(types[i]))
outwb_p.save("奔跑吧嘉賓名單-李運(yùn)辰.xls") # 保存
3、可視化分析
1.統(tǒng)計每一位嘉賓參加次數(shù)排名(取前15)
首先讀取excel中數(shù)據(jù),其中名字(第一列)存放在name變量中,明星類型(第二列)存放在types變量中。
data = pd.read_excel("奔跑吧嘉賓名單-李運(yùn)辰.xls")
name = data['名字'].tolist()
types = data['明星類型'].tolist()
然后對name,嘉賓名字進(jìn)行個數(shù)(參加過多少次)統(tǒng)計排名(取前15)
# 排序方法
from collections import Counter
# 排序
d = sorted(result.items(), key=lambda x: x[1], reverse=True)
name_key = [d[i][0] for i in range(0,16)]
value = [d[i][1] for i in range(0,16)]
print(name_key)
print(value)
進(jìn)行可視化展示
導(dǎo)入相關(guān)的庫
### 畫圖
from pyecharts import options as opts
from pyecharts.globals import ThemeType
from pyecharts.charts import Bar
from pyecharts.charts import Pie
繪圖代碼
# 鏈?zhǔn)秸{(diào)用
c = (
Bar(
init_opts=opts.InitOpts( # 初始配置項
theme=ThemeType.MACARONS,
animation_opts=opts.AnimationOpts(
animation_delay=1000, animation_easing="cubicOut" # 初始動畫延遲和緩動效果
))
)
.add_xaxis(xaxis_data=name_key) # x軸
.add_yaxis(series_name="統(tǒng)計每一位嘉賓參加次數(shù)排名(取前15)", y_axis=values) # y軸
.set_global_opts(
title_opts=opts.TitleOpts(title='', subtitle='', # 標(biāo)題配置和調(diào)整位置
title_textstyle_opts=opts.TextStyleOpts(
font_family='SimHei', font_size=25, font_weight='bold', color='red',
), pos_left="90%", pos_top="10",
),
xaxis_opts=opts.AxisOpts(name='嘉賓', axislabel_opts=opts.LabelOpts(rotate=45)),
# 設(shè)置x名稱和Label rotate解決標(biāo)簽名字過長使用
yaxis_opts=opts.AxisOpts(name='次數(shù)'),
).render("統(tǒng)計每一位嘉賓參加次數(shù)排名(取前15).html")
)
從圖中可以看到,參加奔跑吧節(jié)目最多的嘉賓是:林更新(3次),其他的最多的次數(shù)是兩次。
2.嘉賓職業(yè)類型統(tǒng)計
從嘉賓(明星)類型中可以大概知道有這么幾類(演員、歌手、主持人、模特、主持人、運(yùn)動員、舞者、制片人、賽車手、經(jīng)紀(jì)人)
開始統(tǒng)計以上這幾種職業(yè)類型的個數(shù)
### 嘉賓職業(yè)類型
name = ['演員','歌手','主持人','模特','主持人','運(yùn)動員','舞者','制片人','賽車手','經(jīng)紀(jì)人']
### 初始化為0
value = [0,0,0,0,0,0,0,0,0,0]
for i in types:
for j in range(0,len(name)):
if name[j] in i:
value[j] = value[j] +1
print(name)
print(value)
開始繪圖
pie = Pie("嘉賓職業(yè)類型統(tǒng)計",title_pos='center')
pie.add(
"",
name,
value,
radius=[40, 75],
label_text_color=None,
is_label_show=True,
is_more_utils=True,
legend_orient="vertical",
legend_pos="left",
)
pie.render(path="嘉賓職業(yè)類型統(tǒng)計.html")
從統(tǒng)計圖來看,嘉賓中職業(yè)最多的是演員,其次是歌手。
4、小結(jié)
今天分析『奔跑吧』全系列的嘉賓名單,分析每位嘉賓參加次數(shù)(可能有的嘉賓參加過幾季),以及統(tǒng)計嘉賓職業(yè)類型個數(shù),最后進(jìn)行可視化展示分析。