目錄
- 1 前置條件
- 2 定位標簽
- 3 獲取資料
- 3.1 匯入庫和使用驅動器打開網頁
- 3.2 獲取分類和人氣兩個資料
- 3.1 匯入庫和使用驅動器打開網頁
- 4 使用pandas分析資料
- 5 使用Matplotlib畫圖
- 5.1 柱狀圖
- 5.2 餅圖
- 6 總結
本文爬取的資料為虎牙官方網站直播資料,僅獲取了直播第一頁的所有直播分類和各直播的人氣,并對其進行了粗略的分析,資料獲取時間為2021-01-03(22:00),
1 前置條件
在使用本文代碼前,需先下載selenium庫、matplotlib庫、pandas庫和相對應瀏覽器的相應版本的驅動,
此處給出Chrome瀏覽器驅動下載地址:
https://chromedriver.storage.googleapis.com/index.html.
查看自己的Chrome瀏覽器版本號的路徑為:設定→關于Chrome,結果如下:

2 定位標簽
1. 通過查看網頁原始碼,定位到每一個直播模塊的class_name為“game-live-item”,如圖:

2. 如上圖可以看到每個直播模塊的右下角都有分類和人氣兩個資料,我們同樣可以定位到其class_name,如圖:

3 獲取資料
3.1 匯入庫和使用驅動器打開網頁
代碼如下:
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() #點擊直播
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() #關閉當前頁面
4 使用pandas分析資料
代碼如下:
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 型別
輸出結果如下圖:

5 使用Matplotlib畫圖
5.1 柱狀圖
代碼如下:
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 餅圖
代碼如下:
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 總結
以上就是本文全部內容,若想了解在凌晨、早上和中午這三個時段各直播觀眾的占比,可將代碼復制后在相應時段自行運行查看,
初次撰寫博客,文字不佳,內容模糊不清之處望諸位多多包涵并指正,多謝,

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/244671.html
標籤:python
上一篇:Python+OpenCV+imutils的簡單圖片處理(放縮、翻轉、旋轉、灰度RGB提取)
下一篇:unittest單元測驗框架
