Python爬取《隱秘的角落》彈幕數據,實現簡單可視化(附源碼)


Python爬取《隱秘的角落》彈幕數據,實現簡單可視化(附源碼)

今天目標爬取201865 條《隱秘的角落》彈幕數據

工具使用

開發環境:

win10、python3.6

開發工具:

pycharm

相關模塊 :

requests,stylecloud

思路分析

1、爬蟲獲取數據

愛奇藝的彈幕數據是以 .z 形式的壓縮文件存在的,先獲取 tvid 列表,再根據 tvid 獲取彈幕的壓縮文件,最后對其進行解壓及存儲,大概就是這樣一個過程。

def get_data(tv_name,tv_id):
    url = 'https://cmts.iqiyi.com/bullet/{}/{}/{}_300_{}.z'
    datas = pd.DataFrame(columns=['uid','contentsId','contents','likeCount'])
    for i in range(1,20):
        myUrl = url.format(tv_id[-4:-2],tv_id[-2:],tv_id,i)
        print(myUrl)
        res = requests.get(myUrl)
        if res.status_code == 200:
            btArr = bytearray(res.content)
            xml=zlib.decompress(btArr).decode('utf-8')
            bs = BeautifulSoup(xml,"xml")
            data = pd.DataFrame(columns=['uid','contentsId','contents','likeCount'])
            data['uid'] = [i.text for i in bs.findAll('uid')]
            data['contentsId'] = [i.text for i in bs.findAll('contentId')]
            data['contents'] = [i.text for i in bs.findAll('content')]
            data['likeCount'] = [i.text for i in bs.findAll('likeCount')]
        else:
            break
        datas = pd.concat([datas,data],ignore_index = True)
    datas['tv_name']= str(tv_name)
    return datas

共爬取得到201865 條《隱秘的角落》彈幕數據。

圖片

2、准備彈幕發射器

按照用戶id分組並對彈幕id計數,可以得到每位用戶的累計發送彈幕數。

#累計發送彈幕數的用戶
danmu_counts = df.groupby('uid')['contentsId'].count().sort_values(ascending = False).reset_index()
danmu_counts.columns = ['用戶id','累計發送彈幕數']
danmu_counts.head()

在這里插入圖片描述
第一名竟然發送了2561條彈幕,這只是一部12集的網劇啊。

在這里插入圖片描述

df_top1 = df[df['uid'] == 1810351987].sort_values(by="likeCount",ascending = False).reset_index()
df_top1.head(10)

在這里插入圖片描述
每一條彈幕都是這位觀眾的有感而發,可能他/她只是在發彈幕的同時順便看看劇吧。

這位“彈幕發射器”朋友,在每一集的彈幕量又是如何呢?

在這里插入圖片描述
是不是通過上圖可以側面說明個別劇集的戲劇沖突更大,更能引發觀眾吐槽呢?

“彈幕發射器”同志,11、12集請加大輸出!

這些彈幕大家都認同、
拋開“彈幕發射器”同志,我們繼續探究一下分集的彈幕。

看看每一集當中,哪些彈幕大家都很認同(贊)?

df_like = df[df.groupby(['tv_name'])['likeCount'].rank(method="first", ascending=False)==1].reset_index()[['tv_name','contents','likeCount']]
df_like.columns = ['劇集','彈幕','贊']
df_like

圖片
每一集的最佳彈幕都是當集劇情的濃縮,這些就是觀眾們票選出來的梗(吐槽)啊!

實在不行我請你去爬山也可

在這里插入圖片描述

3、朝陽東升

除了劇本、音樂等,“老戲骨”和“小演員”們的演技也獲得了網友的一致好評。

這部劇雖然短短12集,但故事線不僅僅在一兩個人身上。每個人都有自己背后的故事,又因為種種巧合串聯在一起,引發觀眾的持續性討論。

我們統計一下演員們在彈幕中的出現次數,看看劇中的哪些角色大家提及最多。

a = {'張東升':'東升|秦昊|張老師', '朱朝陽':'朝陽', '嚴良':'嚴良', '普普':'普普', '朱永平':'朱永平', '周春紅':'春紅|大娘子', '王瑤':'王瑤', '徐靜':'徐靜|黃米依', '陳冠聲':'王景春|老陳|陳冠聲', '葉軍':'葉軍|皮卡皮卡', '馬主任':'主任|老馬', '朱晶晶':'晶晶','葉馳敏':'葉馳敏'}
for key, value in a.items():
    df[key] = df['contents'].str.contains(value)
staff_count = pd.Series({key: df.loc[df[key], 'contentsId'].count() for key in a.keys()}).sort_values()

在這里插入圖片描述
比較讓我疑惑的三個小孩當中的朱朝陽提及量這么低,按理說應該與其其他兩位大體相當啊。

又去源數據看了一遍,提及朱朝陽(朝陽)的彈幕確實很少,因為大部分在彈幕中觀眾一般就叫他“學霸”、“兒子”之類的了。

4、詞雲

總所周知,一篇數分文章不能少了詞雲。

每篇的詞雲都盡量跟上篇文章不同,這次我采用的是stylecloud,它算是wordcloud詞雲包的升級版,看起來美觀多了。

import stylecloud
from IPython.display import Image 

stylecloud.gen_stylecloud(text=' '.join(text1), collocations=False,
                          font_path=r'‪C:\Windows\Fonts\msyh.ttc',
                          icon_name='fas fa-play-circle',size=400,
                          output_name='隱秘的角落-詞雲.png')
Image(filename='隱秘的角落-詞雲.png')

在這里插入圖片描述
除了主角的名字以外,在這部以“孩子”為主題的劇中,對孩子的思想、行為的探討占據重要部分,另外,劇中從年長的戲骨到年幼的孩子,每一個人都貢獻了高光的演技,對他們演技的稱贊也成為高頻詞匯。

而最出圈的“爬山”梗,更是被頻頻提及。

從《無證之罪》到《隱秘的角落》,都在證明懸疑犯罪題材在當下並非沒有市場,要收獲高人氣高口碑,如何傳播與營銷終歸只是手段,越來越多的團隊沉下心來打磨精品劇集,觀眾才會願意為劇買單,讓“爬山”這樣的梗一步步“出圈”。

文章到這里就結束了,感謝你的觀看,Python數據分析系列,下篇文章分享Python 爬取魯迅先生《經典語錄》

為了感謝讀者們,我想把我最近收藏的一些編程干貨分享給大家,回饋每一個讀者,希望能幫到你們。

干貨主要有:

① 2000多本Python電子書(主流和經典的書籍應該都有了)

② Python標准庫資料(最全中文版)

③ 項目源碼(四五十個有趣且經典的練手項目及源碼)

④ Python基礎入門、爬蟲、web開發、大數據分析方面的視頻(適合小白學習)

⑤ Python學習路線圖(告別不入流的學習)

⑥ 兩天的Python爬蟲訓練營直播權限

All done~詳見個人簡介或者私信獲取完整源代碼。。

往期回顧

Python實現“假”數據

Python爬蟲魯迅先生《經典語錄》

Python爬蟲豆瓣熱門話題


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM