小言_互联网的博客

爬虫+可视化|爬取「奔跑吧」全系列嘉宾名单,并进行可视化分析

333人阅读  评论(0)

大家好,我是启航。

今天分析『奔跑吧』全系列的嘉宾名单,分析每位嘉宾参加次数(可能有的嘉宾参加过几季),以及统计嘉宾职业类型个数,最后进行可视化展示分析。

1

网页分析

通过网上查询,知道『奔跑吧』到目前为止一共9季,先是奔跑吧兄弟1~4,到后面改名为奔跑吧1~4,以及奔跑吧黄河篇。

对应的网页链接如下:


  
  1. url_list=[
  2. 'https://baike.baidu.com/item/奔跑吧兄弟第一季#4_2',
  3. 'https://baike.baidu.com/item/奔跑吧兄弟第二季/16414779',
  4. 'https://baike.baidu.com/item/奔跑吧兄弟第三季',
  5. 'https://baike.baidu.com/item/奔跑吧兄弟第四季',
  6. 'https://baike.baidu.com/item/奔跑吧第一季/20433390?fromtitle=奔跑吧第1季&fromid=22645259&fr=aladdin#4_2',
  7. 'https://baike.baidu.com/item/奔跑吧第二季/22421345?fromtitle=奔跑吧第2季&fromid=22645247&fr=aladdin#4_2',
  8. 'https://baike.baidu.com/item/奔跑吧第三季/23284990?fromtitle=奔跑吧第3季&fromid=23285732&fr=aladdin',
  9. 'https://baike.baidu.com/item/奔跑吧第四季/24701671?fromtitle=奔跑吧第4季&fromid=50003758&fr=aladdin',
  10. 'https://baike.baidu.com/item/奔跑吧·黄河篇/53052048'
  11. ]

1.分析网页结构

首先以奔跑吧第1季为例去分析网页结构(其他的链接网页结构一样)

 

 

咱们主要是爬取嘉宾姓名和明星类型(演员、歌手等)

 

本来想通过xpath解析网页方式去定位数据,但是发现定位不到,所以就采取了另外一种方式:字符串截取(其实正则re也可以,有很多种方式,只要能够解析出来即可,大家可以自由发挥)

截取前后分别是:分期嘉宾、表演嘉宾

 

2

获取数据

首先导入相应的库


  
  1. import requests
  2. from lxml import etree
  3. import json
  4. import time
  5. import openpyxl

 

将9季的网页链接放到集合中url_list,同时定义name存放嘉宾名字,types是明星类型(歌手、演员等)


  
  1. ### 姓名
  2. name = []
  3. ### 明星类型
  4. types = []
  5. url_list=[
  6. 'https://baike.baidu.com/item/奔跑吧兄弟第一季#4_2',
  7. 'https://baike.baidu.com/item/奔跑吧兄弟第二季/16414779',
  8. 'https://baike.baidu.com/item/奔跑吧兄弟第三季',
  9. 'https://baike.baidu.com/item/奔跑吧兄弟第四季',
  10. 'https://baike.baidu.com/item/奔跑吧第一季/20433390?fromtitle=奔跑吧第1季&fromid=22645259&fr=aladdin#4_2',
  11. 'https://baike.baidu.com/item/奔跑吧第二季/22421345?fromtitle=奔跑吧第2季&fromid=22645247&fr=aladdin#4_2',
  12. 'https://baike.baidu.com/item/奔跑吧第三季/23284990?fromtitle=奔跑吧第3季&fromid=23285732&fr=aladdin',
  13. 'https://baike.baidu.com/item/奔跑吧第四季/24701671?fromtitle=奔跑吧第4季&fromid=50003758&fr=aladdin',
  14. 'https://baike.baidu.com/item/奔跑吧·黄河篇/53052048'
  15. ]

 

开始请求数据


  
  1. ### 循环遍历
  2. for u  in url_list:
  3. url = u
  4. print(url)
  5. res = requests.get(url,headers=headers)
  6. res.encoding = 'utf-8'
  7. text = res.text
  8. sp1 = text.split( "参与期数")[ 1].split( "表演嘉宾")[ 0]
  9. selector = etree.HTML(sp1)
  10. tr_list = selector.xpath( './/tr')
  11. tr_list = tr_list[ 1:]
  12.    ###名字
  13. for i in tr_list:
  14. #print(i.xpath(".//div[@class='para']/b/a/text()")[0])
  15. name.append(i.xpath( ".//div[@class='para']/b/a/text()")[ 0])
  16.    ### 明星类型
  17. for i in tr_list:
  18. te = i.xpath( ".//div[@class='para']/text()")[ 0]
  19. te = te.split( ",")[ 0].replace( "(", "")
  20. #print(te)
  21. types.append(te)
  22.  
  23. print(name)
  24. print(types)
  25. print(len(name))
  26. print(len(types))

 

 

保存数据(excel)


  
  1. outwb = openpyxl.Workbook()
  2. outws = outwb.create_sheet(index= 0)
  3. outws.cell(row= 1, column= 1, value= "名字")
  4. outws.cell(row= 1, column= 2, value= "明星类型")
  5. for i in range( 0,len(name)):
  6.     outws.cell(row=i+ 2, column= 1, value=str(name[i]))
  7. outws.cell(row=i+ 2, column= 2, value=str(types[i]))
  8. outwb_p.save( "奔跑吧嘉宾名单-李运辰.xls") # 保存

 

3

可视化分析

1.统计每一位嘉宾参加次数排名(取前15)

首先读取excel中数据,其中名字(第一列)存放在name变量中,明星类型(第二列)存放在types变量中。


  
  1. data = pd.read_excel( "奔跑吧嘉宾名单-李运辰.xls")
  2. name = data[ '名字'].tolist()
  3. types = data[ '明星类型'].tolist()

 

然后对name,嘉宾名字进行个数(参加过多少次)统计排名(取前15)


  
  1. # 排序方法
  2. from collections import Counter
  3. # 排序
  4. d = sorted(result.items(), key= lambda x: x[ 1], reverse= True)
  5. name_key = [d[i][ 0] for i in range( 0, 16)]
  6. value = [d[i][ 1] for i in range( 0, 16)]
  7. print(name_key)
  8. print(value)

 

 

进行可视化展示

 

导入相关的库


  
  1. ### 画图
  2. from pyecharts import options as opts
  3. from pyecharts.globals import ThemeType
  4. from pyecharts.charts import Bar
  5. from pyecharts.charts import Pie

 

绘图代码


  
  1. # 链式调用
  2. c = (
  3. Bar(
  4. init_opts=opts.InitOpts( # 初始配置项
  5. theme=ThemeType.MACARONS,
  6. animation_opts=opts.AnimationOpts(
  7. animation_delay= 1000, animation_easing= "cubicOut" # 初始动画延迟和缓动效果
  8. ))
  9. )
  10. .add_xaxis(xaxis_data=name_key) # x轴
  11. .add_yaxis(series_name= "统计每一位嘉宾参加次数排名(取前15)", y_axis=values) # y轴
  12. .set_global_opts(
  13. title_opts=opts.TitleOpts(title= '', subtitle= '', # 标题配置和调整位置
  14. title_textstyle_opts=opts.TextStyleOpts(
  15. font_family= 'SimHei', font_size= 25, font_weight= 'bold', color= 'red',
  16. ), pos_left= "90%", pos_top= "10",
  17. ),
  18. xaxis_opts=opts.AxisOpts(name= '嘉宾', axislabel_opts=opts.LabelOpts(rotate= 45)),
  19. # 设置x名称和Label rotate解决标签名字过长使用
  20. yaxis_opts=opts.AxisOpts(name= '次数'),
  21. ).render( "统计每一位嘉宾参加次数排名(取前15).html")
  22. )

 

 

从图中可以看到,参加奔跑吧节目最多的嘉宾是:林更新(3次),其他的最多的次数是两次。

2.嘉宾职业类型统计

从嘉宾(明星)类型中可以大概知道有这么几类(演员、歌手、主持人、模特、主持人、运动员、舞者、制片人、赛车手、经纪人)

开始统计以上这几种职业类型的个数


  
  1. ### 嘉宾职业类型
  2. name = [ '演员', '歌手', '主持人', '模特', '主持人', '运动员', '舞者', '制片人', '赛车手', '经纪人']
  3. ### 初始化为0
  4. value = [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
  5. for i in types:
  6. for j in range( 0,len(name)):
  7. if name[j] in i:
  8.                 value[j] = value[j] + 1
  9. print(name)
  10. print(value)

 

 

开始绘图


  
  1. pie = Pie( "嘉宾职业类型统计",title_pos= 'center')
  2. pie.add(
  3. "",
  4. name,
  5. value,
  6. radius=[ 40, 75],
  7. label_text_color= None,
  8. is_label_show= True,
  9. is_more_utils= True,
  10. legend_orient= "vertical",
  11. legend_pos= "left",
  12. )
  13. pie.render(path= "嘉宾职业类型统计.html")

 

 

从统计图来看,嘉宾中职业最多的是演员,其次是歌手。

4

小结

今天分析『奔跑吧』全系列的嘉宾名单,分析每位嘉宾参加次数(可能有的嘉宾参加过几季),以及统计嘉宾职业类型个数,最后进行可视化展示分析。

在这里还是要推荐下我自己建的Python学习Q群:705933274,群里都是学Python的,如果你想学或者正在学习Python ,欢迎你加入,大家都是软件开发党,不定期分享干货(只有Python软件开发相关的),包括我自己整理的一份2021最新的Python进阶资料和零基础教学,欢迎进阶中和对Python感兴趣的小伙伴加入!


转载:https://blog.csdn.net/aaahtml/article/details/116302019
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场