爬了20W條《隱秘的角落》彈幕,一起爬山嗎?
最近又火了一部國產(chǎn)?。骸峨[秘的角落》,如果你沒看過,那可能會對朋友圈里大家說的“一起去爬山”、“小白船”、“還有機(jī)會嗎”感到莫名其妙。
圖片來自 Pexels
由于《隱秘的角落》是在愛奇藝獨(dú)播,所以數(shù)據(jù)從愛奇藝下手最直接。
暑期推薦旅游
如果沒爬過愛奇藝,可以考慮使用豆瓣、微博、知乎(電視劇數(shù)據(jù)分析·萬能三件套)的數(shù)據(jù)。
爬蟲
劇很精彩,但追劇界有句俗話說得好:“彈幕往往比劇更精彩”,為了讓精彩延續(xù)下去,我終究沒能忍住對彈幕下手。
愛奇藝的彈幕數(shù)據(jù)是以 .z 形式的壓縮文件存在的,先獲取 tvid 列表,再根據(jù) tvid 獲取彈幕的壓縮文件,最后對其進(jìn)行解壓及存儲,大概就是這樣一個(gè)過程。
我實(shí)現(xiàn)分集爬取所有彈幕,代碼如下:
- 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
注:避免引起不必要的麻煩,本爬蟲僅指出關(guān)鍵步驟,不再公開提供。
共爬取得到 201865 條《隱秘的角落》彈幕數(shù)據(jù),如下圖:
彈幕發(fā)射器
按照用戶 id 分組并對彈幕 id 計(jì)數(shù),可以得到每位用戶的累計(jì)發(fā)送彈幕數(shù)。
- #累計(jì)發(fā)送彈幕數(shù)的用戶
- danmu_counts = df.groupby('uid')['contentsId'].count().sort_values(ascending = False).reset_index()
- danmu_counts.columns = ['用戶id','累計(jì)發(fā)送彈幕數(shù)']
- danmu_counts.head()
累計(jì)發(fā)送彈幕數(shù)用戶 Top5
第一名竟然發(fā)送了 2561 條彈幕,這只是一部 12 集的網(wǎng)劇啊。
真·彈幕發(fā)射器
難道他/她是水軍?每條都發(fā)的差不多?
- df_TOP1 = df[df['uid'] == 1810351987].sort_values(by="likeCount",ascending = False).reset_index()
- df_TOP1.head(10)
然而并不是,每一條彈幕都是這位觀眾的有感而發(fā),可能他/她只是在發(fā)彈幕的同時(shí)順便看看劇吧。
這位“彈幕發(fā)射器”朋友,在每一集的彈幕量又是如何呢?
分集&平均彈幕量
是不是通過上圖可以側(cè)面說明個(gè)別劇集的戲劇沖突更大,更能引發(fā)觀眾吐槽呢?
“彈幕發(fā)射器”同志,11、12 集請加大輸出!
這些彈幕大家都認(rèn)同
拋開“彈幕發(fā)射器”同志,我們繼續(xù)探究一下分集的彈幕。
看看每一集當(dāng)中,哪些彈幕大家都很認(rèn)同(贊)?
- 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
每一集中點(diǎn)贊最多的彈幕
每一集的最佳彈幕都是當(dāng)集劇情的濃縮,這些就是觀眾們票選出來的梗(吐槽)啊!
應(yīng)該不算劇透吧,不算吧,不算吧實(shí)在不行我請你去爬山也可。
朝陽東升
除了劇本、音樂等,“老戲骨”和“小演員”們的演技也獲得了網(wǎng)友的一致好評。
這部劇雖然短短 12 集,但故事線不僅僅在一兩個(gè)人身上。每個(gè)人都有自己背后的故事,又因?yàn)榉N種巧合串聯(lián)在一起,引發(fā)觀眾的持續(xù)性討論。
我們統(tǒng)計(jì)一下演員們在彈幕中的出現(xiàn)次數(shù),看看劇中的哪些角色大家提及最多。
- a = {'張東升':'東升|秦昊|張老師', '朱朝陽':'朝陽', '嚴(yán)良':'嚴(yán)良', '普普':'普普', '朱永平':'朱永平', '周春紅':'春紅|大娘子', '王瑤':'王瑤', '徐靜':'徐靜|黃米依', '陳冠聲':'王景春|老陳|陳冠聲', '葉軍':'葉軍|皮卡皮卡', '馬主任':'主任|老馬', '朱晶晶':'晶晶','葉馳敏':'葉馳敏'}
- 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()
先計(jì)算出現(xiàn)次數(shù),再利用 pyecharts 制作極坐標(biāo)圖:
彈幕中提到的主要演員
比較讓我疑惑的三個(gè)小孩當(dāng)中的朱朝陽提及量這么低,按理說應(yīng)該與其其他兩位大體相當(dāng)啊。
又去源數(shù)據(jù)看了一遍,提及朱朝陽(朝陽)的彈幕確實(shí)很少,因?yàn)榇蟛糠衷趶椖恢杏^眾一般就叫他“學(xué)霸”、“兒子”之類的了。
詞云
總所周知,一篇數(shù)分文章不能少了詞云。
每篇的詞云都盡量跟上篇文章不同,這次我采用的是 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')
20 萬條彈幕詞云
除了主角的名字以外,在這部以“孩子”為主題的劇中,對孩子的思想、行為的探討占據(jù)重要部分,另外,劇中從年長的戲骨到年幼的孩子,每一個(gè)人都貢獻(xiàn)了高光的演技,對他們演技的稱贊也成為高頻詞匯。
而最出圈的“爬山”梗,更是被頻頻提及。
一起爬山嗎?
從《無證之罪》到《隱秘的角落》,都在證明懸疑犯罪題材在當(dāng)下并非沒有市場,要收獲高人氣高口碑,如何傳播與營銷終歸只是手段,越來越多的團(tuán)隊(duì)沉下心來打磨精品劇集,觀眾才會愿意為劇買單,讓“爬山”這樣的梗一步步“出圈”。
本文相關(guān)數(shù)據(jù)和可視化源碼下載:
https://alltodata.cowtransfer.com/s/5b483c08987243
作者:朱小五
編輯:陶家龍
出處:轉(zhuǎn)載自微信公眾號凹凸數(shù)據(jù)(ID:alltodata)