python爬虫之Selenium数据爬取和数据可视化

本文爬取的数据为虎牙官方网站直播数据,仅获取了直播第一页的所有直播分类和各直播的人气,并对其进行了粗略的分析,数据获取时间为2021-01-03(22:00)。



1 前置条件

在使用本文代码前,需先下载selenium库、matplotlib库、pandas库和相对应浏览器的相应版本的驱动。

此处给出Chrome浏览器驱动下载地址:
https://chromedriver.storage.googleapis.com/index.html.
查看自己的Chrome浏览器版本号的路径为:设置→关于Chrome。结果如下:

Chrome浏览器版本号


2 定位标签


1. 通过查看网页源码,定位到每一个直播模块的class_name为“game-live-item”,如图:

定位每个直播模块的class_name

2. 如上图可以看到每个直播模块的右下角都有分类和人气两个数据,我们同样可以定位到其class_name,如图:

定位分类和人气的标签的class_name


3 获取数据

3.1 导入库和使用驱动器打开网页

  1. 导入自己需要用到的几个库;

  2. 实例化Selenium模块,写入驱动器文件路径(若驱动器与代码文件在同一处也可不写,但我建议为了不出错,不论是否在一处均可写上);

  3. 写入需要爬取数据的网页网址;

  4. 开始使用" find_elements_by_… " 的方法定位标签,也可使用" find_element_by_… “的方法定位,区别是” elements "所获取下来的数据为列表类型。

代码如下:

from selenium import webdriver
import time
import pandas as pd
import matplotlib.pyplot as plt

browser = webdriver.Chrome(r'C:\Users\29023\Desktop\chromedriver.exe')  
#实例化selenium模块,打开chrome驱动器,此处括号中写驱动器的文件路径
browser.get('https://www.huya.com/')  #浏览器打开网址

button_live = browser.find_elements_by_class_name('hy-nav-item')[1]  
#定位直播,'hy-nav-item' 为虎牙官网上方导航栏“首页”旁“直播”按钮的class_name
button_live.click()  #模拟人工操作点击“直播”

注意:在使用" .click() "方法时要注意,若数据为列表类型则不能直接使用该方法,要指明是列表中的哪一个数据后,才可以使用该方法。

3.2 获取分类和人气两个数据

代码如下:

list_game_type = []
list_viewer = []

live = browser.find_elements_by_class_name('game-live-item')  
#定位本次页面中所有的直播,live为列表类型
for i in range(len(live)):  #循环获取 live 对象中的每一个直播
    game_type = live[i].find_element_by_css_selector('.game-type a')  #获取这个直播的类型
    if game_type.text != "":  #去除空字符串
        list_game_type.append(game_type.text)  #将直播类型写入 list_game_type 中
    viewer = live[i].find_elements_by_class_name('js-num')[0]  #获取这个直播的人数
    if viewer.text[:-1] != "":  #去除空字符串
        list_viewer.append(float(viewer.text[:-1].replace(',','')))
        #将直播人数写入 list_viewer 中,因为有的直播人气过高,数据中会有",",不能直接转换为float类型,要先去掉逗号故使用replace()方法
time.sleep(2)  #休眠两秒
browser.close()  #关闭当前页面

注意:在使用" .text "方法将数据显示出来时要注意,若数据为列表类型则不能直接使用该方法,要指明是列表中的哪一个数据后,才可以使用该方法。


4 使用pandas分析数据

  1. 获取到数据后将其封装成 DataFrame 类型;

  2. 通过groupby()方法将封装好的数据按照自己意愿进行分组,同时也能进行一些计算。

代码如下:

game_viewer_DF = pd.DataFrame([list_game_type,list_viewer]).T  
#将两个列表中的组合成 DataFrame 类型,此时数据为两行显示,所以将其转置,即为两列显示
game_viewer_DF.rename(columns={0:'game_type',1:'viewer'},inplace=True)  
#给两列数据取名
data = game_viewer_DF.groupby(game_viewer_DF['game_type'],as_index=False).sum()
'''
利用 groupby() 方法将数据按照 ‘game_type’ 分组,然后使用 sum() 函数求和
正常使用 groupby().sum() 后会有层级索引levels上移的问题,这时候使用 as_index = False 即可解决(默认为True)
'''
print(data)  #数据data查看数据
data = pd.DataFrame(data)  #将data转回 DataFrame 类型

输出结果如下图:

输出data查看数据


5 使用Matplotlib画图

5.1 柱状图

  1. 提取出自己想要的 x 轴和 y 轴数据;

  2. 若有中文则使用" plt.rcParams[‘font.sans-serif’]=[‘SimHei’] " 方法防止中文乱码;

  3. 设置图形大小、文字样式等等后绘制柱状图并输出。

代码如下:

list_gt = []
list_vi = []
for key in data['game_type']:
    list_gt.append(key)  #取出 game_type
for value in data['viewer']:
    list_vi.append(value)  #取出 viewer
x = list_gt  #x轴数据
y = list_vi  #y轴数据
plt.rcParams['font.sans-serif']=['SimHei']  
#用来正常显示中文标签,默认中文为乱码
plt.figure(figsize=(10,10))  #图形大小
plt.xticks(rotation=45)  #x轴数据字体倾斜角度
plt.ylabel('直播人气(单位:万)')  #y轴名称
plt.bar(x,y)  #绘制柱状图的方法
plt.show()  #输出图形

图形如下:

柱状图


5.2 饼图

  1. 提取出自己想要的每个扇区的数据;

  2. 设置图形大小、文字样式等等后绘制柱状图并输出。

代码如下:

plt.figure(figsize=(30, 30))  #设置图形大小
plt.pie(
list_vi,  # 每个扇区数值占比
labels = list_gt,  # 每个扇区的名称
# explode=(0,0.1,0,0,0,0,0,0,0),  # 突出块,突出比例
autopct='%1.1f%%',  # 显示百分比方式
# startangle=-110,  # 饼图起始的角度,度数,默认0为右侧水平180度开始,逆时针旋转
)
plt.axis('equal')  # 正圆形饼图,x/y轴尺寸相等.默认是扁图
plt.show()  #输出图形

图形如下:

饼图


因为数据过多,图形较小导致有重叠,在pycharm中输出图形时放大查看即可。

由以上两张图不难看出,在晚上,直播观众占比最大的为“王者荣耀”、“英雄联盟”和“户外”类型。
且在直播类型中,游戏直播的占比非常大。



6 总结

以上就是本文全部内容,若想了解在凌晨、早上和中午这三个时段各直播观众的占比,可将代码复制后在相应时段自行运行查看。
初次编写博客,文字不佳,内容模糊不清之处望诸位多多包涵并指正,多谢。

憨憨敬礼

  • 16
    点赞
  • 49
    收藏
  • 打赏
    打赏
  • 17
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:深蓝海洋 设计师:CSDN官方博客 返回首页
评论 17

打赏作者

二师弟_k

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值