1. 程式人生 > 其它 >python爬取B站Top100,不小心發現了熱門UP主的祕密

python爬取B站Top100,不小心發現了熱門UP主的祕密

現在大家的生活中,已經越來越離不開B站了,

2020年的第一季度,B站月活躍使用者達到了1.72億,日活躍使用者也已經突破了5000萬個使用者。

源源不斷的流量讓B站的up主們也是粉絲數目不斷暴漲,百萬粉絲的up主比比皆是。

今天,我就帶領大家來爬取並分析一下B站的最熱視訊排行榜,看看大家究竟都喜歡看什麼樣子的視訊~~

需求分析

對於榜單的爬取,我們爬取了榜單的top100視訊的

排名、標題、視訊連結、播放量、彈幕數量、作者、綜合得分和作者詳情頁

等資訊。

網頁分析

首先我們開啟瀏覽器開發者模式如下,所有的資訊我們都可以在右邊所在的ul標籤之中找到,

所以我們先獲頁面資訊,然後使用xpath來獲取這些標籤資訊。

傳送請求

Python外掛\學習\資料Q群:906715085####
  url = 'https://www.bilibili.com/v/popular/rank/all'

  headers = {
       "cookie": "_uuid=7D3DFA6C-6EB1-F72A-632B-C9AF9B9AD4C627183infoc; buvid3=D25672DE-BD2D-4E7C-B79E-DB356316D023167639infoc; sid=aylq5kgg; fingerprint=84acc3579a53d0eba78d769e71574df6; buvid_fp=BA184AFC-F4DC-408A-8897-D0EDEA653CE5148812infoc; buvid_fp_plain=BA184AFC-F4DC-408A-8897-D0EDEA653CE5148812infoc; DedeUserID=434541726; DedeUserID__ckMd5=448fda6ab5098e5e; SESSDATA=78a505c8%2C1643594982%2Cdfa35*81; bili_jct=1d9f4e960fb0ae7fe1de53663029874b; bsource=search_baidu; CURRENT_FNVAL=80; blackside_state=1; rpdid=|(u)YJR~R~)m0J'uYk)ku)~~)
", "referer": "https://www.bilibili.com/", "user-agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.8 Safari/537.36" } resp = requests.get(url, headers = headers, timeout=15) ic(resp.text)

 

獲取瀏覽器響應資訊

接下來我們使用xpath獲取標籤內部的資訊

 for
li in lis: # 排名 sort = li.xpath("./div[@class='num']/text()") sort = ''.join(sort) # 作者 author = li.xpath("./div[@class='content']/div[@class='info']/div[@class='detail']/a/span[@class='data-box up-name']/text()") author = ''.join(author).strip() # 綜合得分 score = li.xpath("./div[@class='content']/div[@class='info']/div[@class='pts']/div/text()") score = ''.join(score) # 視訊標題 title = li.xpath("./div[@class='content']/div[@class='info']/a[@class='title']/text()") title = ''.join(title) # 視訊連結 links = li.xpath("./div[@class='content']/div[@class='img']/a/@href") links = ''.join(links).strip()[2:] # 播放數量 video_num = li.xpath("./div[@class='content']/div[@class='info']/div[@class='detail']/span[@class='data-box'][1]/text()") video_num = ''.join(video_num).strip() # 彈幕數量 barrage_num = li.xpath("./div[@class='content']/div[@class='info']/div[@class='detail']/span[@class='data-box'][2]/text()") barrage_num = ''.join(barrage_num).strip() # 作者詳情 detail_auth = li.xpath(".//div[@class='content']/div[@class='info']/div[@class='detail']/a/@href") detail_auth = ['https:' + i for i in detail_auth] detail_auth = ''.join(detail_auth) ic(sort, author, score, title,links, video_num, barrage_num, detail_auth)

 

部分資訊如下:

資料儲存

接下來我們使用openpyxl模組將獲取到的這些資訊儲存到excel中、

便於後續的資料處理和視覺化

  ws = op.Workbook()
  wb = ws.create_sheet(index=0)

  wb.cell(row=1, column=1, value='排名')
  wb.cell(row=1, column=2, value='作者')
  wb.cell(row=1, column=3, value='綜合得分')
  wb.cell(row=1, column=4, value='視訊標題')
  wb.cell(row=1, column=5, value='視訊連結')
  wb.cell(row=1, column=6, value='播放數量')
  wb.cell(row=1, column=7, value='彈幕數量')
  wb.cell(row=1, column=8, value='作者詳情')
  ws.save('嗶哩嗶哩Top100.xlsx')

 

資料處理

我們在處理資料的時候發現,有些資料的單位格式是不一致的,如下:

有些是個為單位,有些是以萬為單位。

並且我們要將數字後面的’萬‘字去掉,將字串格式的數字轉為數字型別的才便於後續的視覺化操作。

這裡我們處理資料使用的是pandas,有不明白的小夥伴可以看看這份教程,這個是我自己總結的一份實用性很高的熊貓文件。

讓人無法拒絕的pandas技巧,簡單卻好用到爆!

 # 讀取資料
  df = pd.read_excel('嗶哩嗶哩Top100.xlsx')
  
  # 刪除空格
   pd_data = df.dropna(subset=['播放數量', '彈幕數量'])

  # 格式化資料播放數量
  # 去除’萬‘
  pd_data['播放數量'] = pd_data['播放數量'].str.replace('', '')
  # 轉換格式 萬->10000
  pd_data['彈幕數量'] = pd_data['彈幕數量'].map(lambda x: float(x[:-1]) * 10000 if ('' in x) else float(x))

  # 處理後的資料另存為
  pd_data.to_excel('嗶哩嗶哩Top101.xlsx')

 

紅色是處理之前的資料

綠色是處理之後的資料

我們已經將字串型別的數字轉換成子型別

並且統一數字單位

接下來我們要找出最多評論的視訊和最多彈幕的視訊

看看它們為什麼這麼受歡迎?

 # 最多播放
  max_video_num = rcv_data[rcv_data['播放數量'] == rcv_data['播放數量'].max()]
  ic(max_video_num)

  # 最多彈幕
  max_cmts_num = rcv_data[rcv_data['彈幕數量'] == rcv_data['彈幕數量'].max()]
  ic(max_cmts_num)

  '''
  ic| max_video_num:    Unnamed: 0  排名    作者     綜合得分                    視訊標題                                 視訊連結   播放數量   彈幕數量                                 作者詳情
                   0           0   1  綿羊料理  4742269  一顆檸檬賣100塊??美食up主:那是成本!  www.bilibili.com/video/BV1vq4y1Q7TC  445.3  20000  https://space.bilibili.com/18202105
  ic| max_bag_num:     Unnamed: 0  排名     作者     綜合得分                   視訊標題                                 視訊連結   播放數量   彈幕數量                                 作者詳情
                 19          19  20  爆裂吧葉子  2320837  《B 站 各 等 級 用 戶 現 狀 !》  www.bilibili.com/video/BV1t64y1B7Kz  252.7  84000  https://space.bilibili.com/24450484

  '''

 

這個是播放了最多的視訊,

檸檬這麼貴是因為小姐姐長得好看麼

再來看看彈幕最多的視訊

說的啥,大家可以看看,還是相當不錯的.

最後我們用的水滴圖看一下綜合得分佔比情況

  # 平均數
  mean_score = rcv_data['綜合得分'].mean()

  # 最大值
  max_score = rcv_data['綜合得分'].max()
  #ic(mean_score/max_score)
  
  '''
  ic| mean_score/max_score: 0.39690731166873916
  '''

 

最後

這一篇為大家分享的B站到這裡就沒有了,不知道小夥伴們學會了沒有。不管學沒學會都給我點一個贊吧,畢竟密密麻麻的程式碼也是夠辛苦的啦。到這裡就結束了,下一篇見。