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獲取標籤內部的資訊
forli 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站到這裡就沒有了,不知道小夥伴們學會了沒有。不管學沒學會都給我點一個贊吧,畢竟密密麻麻的程式碼也是夠辛苦的啦。到這裡就結束了,下一篇見。