1. 程式人生 > 實用技巧 >從《【何同學】我拍了一張600萬人的合影...》彈幕分析中,獲取到了什麼?

從《【何同學】我拍了一張600萬人的合影...》彈幕分析中,獲取到了什麼?

這篇博文很早就打算寫了,但因為懶一直拖到現在,先交代一下博文選材背景:8月2號,B 站數碼 Up 主 老師好我叫何同學 更新了一個視訊《【何同學】我拍了一張600萬人的合影... 》(離他的上一個視訊更新已經一個多月),來紀念頻道成立三週年

雖說在何同學提前一天的預告中就猜到這個視訊的質量一定不會差,但看完之後,內心只有倆字牛逼!,這個視訊真的真的驚豔到我了,讚歎於他視訊製作水準,佩服於他對粉絲的用心;在看視訊中看到一條彈幕,覺得評價地很中肯:等一個多月看到這個視訊、值了!

關於這個視訊還是很推薦,截至到8月8日已經在B站已經播放了 880萬次,連結我放在下方,有興趣或者想二刷的小夥伴可以刷一下

而本文將是圍繞這個視訊的彈幕進行採集,並做簡單的分析;在接下來的部分中,文章將分為三個部分展開:

  • 1,資料採集部分;介紹一種採集 B 視訊彈幕的方法;

  • 2,資料視覺化並分析;根據評論時間分佈製成視覺化圖表,分別以彈幕釋出時間、視訊各階段彈幕量佔比、彈幕數量時間走勢等幾個角度做簡單分析;

  • 3,彈幕詞雲視覺化:將採集得到的文字製成詞雲圖;

B站彈幕採集

1, 這裡先介紹一下 B 站視訊彈幕的採集方法,本文用的是 Python 指令碼作為抓取工具,首先開啟抓取的視訊網頁,這裡以何同學的這個視訊為例,找到右邊的 彈幕列表

2,按 F12 開啟開發者工具,依次點選彈幕列表、檢視歷史彈幕、選擇日期 ,隨後找到 開發者模式中的 history?... 連結(圖中的右邊箭頭所示,若找不到重新整理一下頁面,重新按照上面步驟操作一下即可);

3,2 中的連結就是最終我們需要的連結,仔細觀察後會發現這個連結有兩個關鍵引數構成,一個 oid, 一個 date ,oid 表示視訊 ID 比較容易查詢,date 表示日期,可通過 datetime 來構造;

4,構造 3 中的連結之後,用常規的爬取方法(requests + Beautifulsoup) 即可,

主要程式碼部分如下:

def get_duration_time(start_date1,end_date,video_id):
    # 日期格式轉換
    start_date = datetime.datetime.fromisoformat(start_date1)
    end_date = datetime.datetime.fromisoformat(end_date)
    dateltime = datetime.timedelta(days=1)
    while start_date <= end_date:

        startdate_format =  start_date.strftime("%Y-%m-%d")
        download_date(startdate_format,video_id)
        start_date = start_date +  dateltime



def download_date(timedate,video_id):
    # 傳入日期、視訊id 進行資料爬取
    shipin_url = 'https://api.bilibili.com/x/v2/dm/history?type=1&oid={0}&date={1}'.format(video_id,timedate)
    print("正在抓取彈幕網頁", shipin_url)
    response = requests.get(url = shipin_url,headers = headers)
    response.encoding = 'utf-8'
    soup = BeautifulSoup(response.text,'lxml')
    for i in soup.find_all('d'):
        locate = re.findall(r'p="(.*?)">(.*?)</d>',str(i))
        file.write(str(locate[0][0]))
        file.write(',')
        file.write(str(str(locate[0][-1])))
        file.write("\n")
    time.sleep(2) # 增加時間間隔,防止爬取太頻繁;

視覺化分析

視覺化部分主要用到了 Pyecharts ,資料一共採集到了 7000 條彈幕,時間跨度從 8.2 — 8.8,

1,下面這張圖是關於 從8.2— 8.8 彈幕數量總數變化走勢圖,從圖裡面得不到什麼有效的資訊,有一點是彈幕走勢呈現一短時間驟升、一段時間平緩狀態;

2,接下來對 8.2 -8.8 每天以沒30分鐘作為一個時間段,彙總每天各時間段彈幕數量分佈與變化,最終繪製得到沿時間線走向的動態趨勢圖;

從動態圖中可以看到 視訊剛公佈沒多久彈幕較為集中,且數量最多,隨著時間推移,評論愈發分散、數量愈發減少,這個特點可能適用於大部分 頭部 Up 主 視訊播放特點,播放量從多到少,熱度從高到低

3,最後,因為視訊《【何同學】我拍了一張600萬人的合影...》整個時間長度為 7:56,因此我想觀察在採集的資料中那個時間段釋出的彈幕數最多,那個時間段釋出最少,再結合視訊節點內容本身分析一下,於是最終就得到了下面這一張圖:

彈幕最多的是在 4分-4分30秒的中間,我截了其中一張圖,視訊內容部分就是和同學成功把將近600萬粉絲的id 刻在A4 紙板子上,貼放在牆上為後面匯至到一個鏡頭打下基礎;以我自己的角度猜測一下,因為這個工作量太大,為何同學的用心而感動;

彈幕最少的實在2分-2分半,這部分內容是在思考 怎樣找到一個能貼滿 300張 A4紙的牆壁?,內容摻雜著一部分詼諧,粉絲們可能大部分都在思考,也就忘記了發彈幕(自己的一點猜測)。

詞雲圖展示

最後,將 7000 條彈幕製成詞雲圖,做一下視覺化預覽,這裡沒有用Python 相關包,用的是 WordArt

淚目、感動、辛苦了 是粉絲們看完這個視訊的感受,足以反映出何同學的用心和真誠,找到了 表示粉絲確實從 600萬粉絲的合照中找到了自己的 ID ,可以感受到拍攝這個合照的難度,

最後以 老師好我叫何同學 ID為詞雲圖背景作為文章的結束,關於文章完整原始碼,公號 【Z先生點記】後臺回覆 何同學 即可獲取。

好了,以上就是本篇的所有內容,最後感謝大家的閱讀!