B站排行榜第一的視訊,看看5W彈幕都在說些什麼?
前言
本文的文字及圖片來源於網路,僅供學習、交流使用,不具有任何商業用途,如有問題請及時聯絡我們以作處理。
Python爬蟲、資料分析、網站開發等案例教程視訊免費線上觀看
https://space.bilibili.com/523606542
基本開發環境
- Python 3.6
- Pycharm
相關模組的使用
import requests import re
requests在cmd中 pip install requests 安裝即可
我這是顯示已經安裝過了的,如果你沒有安裝的話,是會有安裝進度條的。
目標網頁分析
就選擇B站排行榜第一的視訊。
如何找到彈幕資料?
如上圖所示:
1、點選進入網頁之後,F12開啟開發者工具,選擇Ntework
2、點選檢視歷史彈幕,選擇日期就有相對應的資料加載出來
3、點選選擇有日期的url地址,彈幕的資料都包含在內了(如下圖所示)
彈幕資料的url地址既然都知道了,那麼就可以直接爬取下來了。
程式碼實現部分
1、請求網頁獲取原始碼資料
import requests url = 'https://api.bilibili.com/x/v2/dm/history?type=1&oid=279984604&date=2021-01-10' headers = { 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36' } response = requests.get(url=url, headers=headers) print(response.text)
爬取這些資料是需要加上cookie的,如果沒有加cookie的話會顯示你未登入賬號
所以需要在headers裡面新增cookie
cookie怎麼新增呢?
在開發者工具當中,選擇你所需要爬取的url地址,檢視headers其中的requests headers 中的cookie就是了。
當給了cookie之後又出現問題了
雖然資料是有了,但是出現亂。其實只需要加一行程式碼就可以解決,還是比較萬能的轉碼方式。
response.encoding = response.apparent_encoding
遇到亂碼問題都可以這樣使用,如果使用之後還是出現亂碼問題,就要根據網頁的編碼進行轉碼了。
2、使用正則表示式提取彈幕資料
result = re.findall('p=".*?">(.*?)</d><d ', response.text) for i in result: print(i)
正則表示式提取出來的資料,是列表格式,所以需要遍歷提取出每一條彈幕資料。
3、儲存資料至本地
with open('彈幕.txt', mode='a', encoding='utf-8') as f: f.write(i) f.write('\n')
mode='a':寫入模式為a,追加寫入
encoding='utf-8':指定寫入編碼,文字內容均為'utf-8'
寫入一個換行符,每寫入一條資料,就重新換一個行寫入
4、批量爬取彈幕資料
之前只是爬取一天的彈幕資料,如果想要爬取一段時間內容的彈幕資料的話,只需要改變url地址中的日期就可以了
for date in range(9, 12): url = f'https://api.bilibili.com/x/v2/dm/history?type=1&oid=279984604&date=2021-01-{date}'
就是從9號爬取到11號的資料,這個視訊也剛出來三天。
爬蟲完整程式碼
import requests import re for date in range(9, 12): url = f'https://api.bilibili.com/x/v2/dm/history?type=1&oid=279984604&date=2021-01-{date}' headers = { "cookie": "輸入你自己的cookie", 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36' } response = requests.get(url=url, headers=headers) response.encoding = response.apparent_encoding result = re.findall('p=".*?">(.*?)</d><d ', response.text) for i in result: with open('彈幕.txt', mode='a', encoding='utf-8') as f: f.write(i) f.write('\n') print(i)
通過程式碼量可以看得出來,B站彈幕的爬取還是比較簡單的,16行就能搞定,說到底還是python程式碼簡潔優雅。
彈幕詞雲程式碼
import jieba import wordcloud import imageio # 匯入imageio庫中的imread函式,並用這個函式讀取本地圖片,作為詞雲形狀圖片 # py = imageio.imread('圖片路徑') 如何你想要改變詞雲圖的形狀,可以新增 # 讀取檔案內容 f = open('彈幕.txt', encoding='utf-8') txt = f.read() # jiabe 分詞 分割詞彙 txt_list = jieba.lcut(txt) string = ' '.join(txt_list) # 詞雲圖設定 wc = wordcloud.WordCloud( width=1000, # 圖片的寬 height=700, # 圖片的高 background_color='white', # 圖片背景顏色 font_path='msyh.ttc', # 詞雲字型 # mask=py, # 所使用的詞雲圖片 scale=15, # stopwords={''}, # 停用詞 # contour_width=5, # contour_color='red' # 輪廓顏色 ) # 給詞雲輸入文字 wc.generate(string) # 詞雲圖儲存圖片地址 wc.to_file('out.png')