
CDA數據分析師 出品
【導語】:今天我們就來聊聊另類春節檔的唯一一部電影《囧媽》,Python技術部分可以直接看第三部分。
2020年的春節檔之前被譽為神仙打架,各顯神通,可以說是史上最強的春節檔,不料一場疫情,就換了另一個局面。為配合疫情的防控,春節檔電影全部撤檔。
本以為就這樣沒下文了,結果徐崢打出一張牌:線上免費看《囧媽》,作為發行方的歡喜傳媒股票當天也應聲上漲42%。今天我們就來聊聊另類春節檔的唯一一部電影《囧媽》。
另類春節檔
《囧媽》繞過院線 全網免費看
在《姜子牙》《唐人街探案3》等片紛紛撤出春節檔之時,《囧媽》突然宣布將于大年初一零點起,在抖音、西瓜視頻、今日頭條、歡喜首映等App上免費上映,成為史上首部繞過院線直接網播的春節檔電影。
《囧媽》主要講的是小老板伊萬纏身于商業糾紛,卻意外同母親坐上了開往俄羅斯的火車。在旅途中,他和母親發生激烈沖突,同時還要和競爭對手斗智斗勇。為了最終抵達莫斯科,他不得不和母親共同克服難關,并面對家庭生活中一直所逃避的問題。
徐崢這次把《囧媽》免費讓觀眾看的舉措,讓《囧媽》在慘淡的春節檔賺足了足夠的熱度,字節跳動也收獲了大量的流量。該片三天總播出量超過6億人次,觀眾總數為1.8億人次。
敢做第一個吃螃蟹的人
回望中國電影「大票房」時代,國內首部票房破10億的國產電影就是徐崢在2012年的作品《人再囧途之泰囧》,達到12.67億,之后國產電影就像打了雞血一樣,一個又一個破新高。
當然這里面C君覺得有50%的功勞要算在2010年前作《人在囧途》的精彩上,讓影迷們覺得囧系列和徐崢是品質保證。C君記得當時看完《人在囧途》,就說下次徐崢再拍囧系列一定要去電影院支持,這種口碑效應在電影里面特別明顯??赡苷沁@樣的藝高,所以才膽大。
這次《囧媽》直接選擇線上首映,同時還把錢給掙了,弄的電影院聯名聲討,了解一下過程,你就懂了。
原來的形式是發行方歡喜傳媒拍好了電影,賣給橫店影視,保底24億票房。然后橫店影視去找全國的電影院,你們幫我放這部電影,最后我們肯定至少能收入24億票房,咱們一起分。給發行方歡喜傳媒6個多億,然后我們再分剩下的18億,是個不錯的生意。
而現在,是今日頭條直接取代了橫店影視的位置,我給你6個多億,我不用電影院放,我自己上億裝機量的APP上就可以看,大家拿手機免費看,我的APP打開率高了,錢就掙回來了,說不定還能培養出大家用APP看電影首映的習慣。
發行方歡喜傳媒,徐崢沒啥損失。電影院被今日頭條系給取代了,你說能不聲討嗎?
但觀眾看完之后
又是什么反應呢?
雖然《囧媽》賺足了流量,但口碑究竟如何呢?
目前《囧媽》在豆瓣上的評分僅為5.9分,負面的評論居多。我們搜集整理了豆瓣上的評論數據,用Python進行分析。整個數據分析的過程分為三步:
· 獲取數據
· 數據預處理
· 數據可視化
以下是具體的步驟和代碼實現:
01 獲取數據
豆瓣從2017.10月開始全面限制爬取數據,非登錄狀態下最多獲取200條,登錄狀態下最多為500條,本次我們共獲取數據698條。
為了解決登錄的問題,本次使用Selenium+BeautifulSoup獲取數據。
如下圖所示,本此數據爬取主要獲取的內容有:
· 評論用戶ID
· 評論用戶主頁
· 評論內容
· 評分星級
· 評論日期
· 用戶所在城市
代碼實現:
# 導入所需包
import requests
from bs4 import BeautifulSoup
import numpy as np
import pandas as pd
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.chrome.options import Options
# 定義登錄函數
def login_douban:
'''功能:自動登錄豆瓣網站'''
global browser # 設置為全局變量
browser = webdriver.Chrome
# 進入登錄頁面
login_url = 'https://accounts.douban.com/passport/login?source=movie'
browser.get(login_url)
# 點擊密碼登錄
browser.find_element_by_class_name('account-tab-account').click
# 輸入賬號和密碼
username = browser.find_element_by_id('username')
username.send_keys('18511302788')
password = browser.find_element_by_id('password')
password.send_keys('12349148feng')
# 點擊登錄
browser.find_element_by_class_name('btn-account').click
# 定義函數獲取單頁數據
def get_one_page(url):
'''功能:傳入url,豆瓣電影一頁的短評信息'''
# 進入短評頁
browser.get(url)
# 使用bs解析網頁數據
bs = BeautifulSoup(browser.page_source, 'lxml')
# 獲取用戶名
username = [i.find('a').text for i in bs.findAll('span', class_='comment-info')]
# 獲取用戶url
user_url = [i.find('a')['href'] for i in bs.findAll('span', class_='comment-info')]
# 獲取推薦星級
rating =
for i in bs.findAll('span', class_='comment-info'):
try:
one_rating = i.find('span', class_='rating')['title']
rating.append(one_rating)
except:
rating.append('力薦')
# 評論時間
time = [i.find('span', class_='comment-time')['title'] for i in bs.findAll('span', class_='comment-info')]
# 短評信息
short = [i.text for i in bs.findAll('span', class_='short')]
# 投票次數
votes = [i.text for i in bs.findAll('span', class_='votes')]
# 創建一個空的DataFrame
df_one = pd.DataFrame
# 存儲信息
df_one['用戶名'] = username
df_one['用戶主頁'] = user_url
df_one['推薦星級'] = rating
df_one['評論時間'] = time
df_one['短評信息'] = short
df_one['投票次數'] = votes
return df_one
# 定義函數獲取25頁數據(目前所能獲取的最大頁數)
def get_25_page(movie_id):
'''功能:傳入電影ID,獲取豆瓣電影25頁的短評信息'''
# 創建空的DataFrame
df_all = pd.DataFrame
# 循環追加
for i in range(25):
url = "https://movie.douban.com/subject/{}/comments?start={}&limit=20&sort=new_score&status=P".format(movie_id,i*20)
print('我正在抓取第{}頁'.format(i+1), end='\r')
# 調用函數
df_one = get_one_page(url)
df_all = df_all.append(df_one, ignore_index=True)
# 程序休眠一秒
time.sleep(1.5)
return df_all
if __name__ == '__main__':
# 先運行登錄函數
login_douban
# 程序休眠兩秒
time.sleep(2)
# 再運行循環翻頁函數
movie_id = 30306570 # 囧媽
df_all = get_25_page(movie_id)
爬取出來的數據以數據框的形式存儲,結果如下所示:
從用戶主頁的地址可以獲取到用戶的城市信息,這一步比較簡單,此處的代碼省略。
02 數據預處理
對于獲取到的數據,我們需要進行以下的處理以方便后續分析:
· 推薦星級:轉換為1-5分。
· 評論時間:轉換為時間類型,提取出日期信息
· 城市:有城市空缺、海外城市、亂寫和pyecharts尚4. 不支持的城市,需要進行處理
· 短評信息:需要進行分詞和提取關鍵詞
代碼實現:
# 定義函數轉換推薦星級字段
def transform_star(x):
if x == '力薦':
return 5
elif x == '推薦':
return 4
elif x == '還行':
return 3
elif x == '較差':
return 2
else:
return 1
# 星級轉換
df_all['星級'] = df_all.推薦星級.map(lambda x:transform_star(x))
# 轉換日期類型
df_all['評論時間'] = pd.to_datetime(df_all.評論時間)
# 提取日期
df_all['日期'] = df_all.評論時間.dt.date
# 定義函數-獲取短評信息關鍵詞
def get_comment_word(df):
'''功能:傳入df,提取短評信息關鍵詞'''
# 導入庫
import jieba.analyse
import os
# 去停用詞
stop_words = set
# 加載停用詞
cwd = os.getcwd
stop_words_path = cwd + '\\stop_words.txt'
with open(stop_words_path, 'r', encoding='utf-8') as sw:
for line in sw.readlines:
stop_words.add(line.strip)
# 添加停用詞
stop_words.add('6.3')
stop_words.add('一張')
stop_words.add('一部')
stop_words.add('徐崢')
stop_words.add('徐導')
stop_words.add('電影')
stop_words.add('電影票')
# 合并評論信息
df_comment_all = df['短評信息'].str.cat
# 使用TF-IDF算法提取關鍵詞
word_num = jieba.analyse.extract_tags(df_comment_all, topK=100, withWeight=True, allowPOS=)
# 做一步篩選
word_num_selected =
# 篩選掉停用詞
for i in word_num:
if i[0] not in stop_words:
word_num_selected.append(i)
else:
pass
return word_num_selected
key_words = get_comment_word(df_all)
key_words = pd.DataFrame(key_words, columns=['words','num'])
03 數據可視化
用Python做可視化分析的工具很多,目前比較好用可以實現動態可視化的是pyecharts。我們主要對以下幾個方面信息進行可視化分析:
· 評論總體評分分布
· 評分時間走勢
· 城市分布
· 評論內容
總體評分分布
《囧媽》截止到目前在豆瓣中的總體評分為5.9分,僅好于19%的喜劇片。從評分分布來看,3分的占比最高,有36.39%,其次為2分,有32.09%,5分的比例最低,僅有6.88%。
代碼實現:
# 總體評分百分比
score_perc = df_all.星級.value_counts / df_all.星級.value_counts.sum
score_perc = np.round(score_perc*100,2)
# 導入所需包
from pyecharts import options as opts
from pyecharts.charts import Pie, Page
# 繪制柱形圖
pie1 = Pie(init_opts=opts.InitOpts(width='1350px', height='750px'))
pie1.add("",
[*zip(score_perc.index, score_perc.values)],
radius=["40%","75%"])
pie1.set_global_opts(title_opts=opts.TitleOpts(title='總體評分分布'),
legend_opts=opts.LegendOpts(orient="vertical", pos_top="15%", pos_left="2%"),
toolbox_opts=opts.ToolboxOpts)
pie1.set_series_opts(label_opts=opts.LabelOpts(formatter="{c}%"))
pie1.render('總體評分分布.html')
評分時間走勢圖
評論的時間走勢圖和電影熱度一致,在大年初一免費上映時候達到最高值。
代碼實現:
# 時間排序
time = df_all.日期.value_counts
time.sort_index(inplace=True)
from pyecharts.charts import Line
# 繪制時間走勢圖
line1 = Line(init_opts=opts.InitOpts(width='1350px', height='750px'))
line1.add_xaxis(time.index.tolist)
line1.add_yaxis('評論熱度', time.values.tolist, areastyle_opts=opts.AreaStyleOpts(opacity=0.5), label_opts=opts.LabelOpts(is_show=False))
line1.set_global_opts(title_opts=opts.TitleOpts(title="時間走勢圖"), toolbox_opts=opts.ToolboxOpts)
line1.render('評論時間走勢圖.html')
評論用戶城市分布
接下來分析了評論者所在的城市分布。
首先是用條形圖,來粗略的展示前十大熱門的影迷城市。
代碼實現:
# 國內城市top10
city_top10 = df_all.城市處理.value_counts[:12]
city_top10.drop('國外', inplace=True)
city_top10.drop('未知', inplace=True)
from pyecharts.charts import Bar
# 條形圖
bar1 = Bar(init_opts=opts.InitOpts(width='1350px', height='750px'))
bar1.add_xaxis(city_top10.index.tolist)
bar1.add_yaxis("城市", city_top10.values.tolist)
bar1.set_global_opts(title_opts=opts.TitleOpts(title="評論者Top10城市分布"),toolbox_opts=opts.ToolboxOpts)
bar1.render('評論者Top10城市分布條形圖.html')
柱形圖的展示不是很直觀也不全面,在含有地理位置的數據中,我們常采用采用地圖的形式,為大家更加直觀的進行展示,選取了觀影城市最多的前三十個城市作為動態展示,如下圖所示:
代碼實現:
city_num = df_all.城市處理.value_counts[:30]
city_num.drop('國外', inplace=True)
city_num.drop('未知', inplace=True)
c1 = Geo(init_opts=opts.InitOpts(width='1350px', height='750px'))
c1.add_schema(maptype='china')
c1.add('geo', [list(z) for z in zip(city_num.index, city_num.values.astype('str'))], type_=ChartType.EFFECT_SCATTER)
c1.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
c1.set_global_opts(visualmap_opts=opts.VisualMapOpts,
title_opts=opts.TitleOpts(title='評論者城市分布'),
toolbox_opts=opts.ToolboxOpts)
c1.render('評論者城市分布地圖.html')
評分詞云圖
從詞云圖中可以看出,"喜劇" "和解" "母子" "笑點" "親情"等詞占較大的比重。骨子里還是囧系列那種公路喜劇片,這次用母子關系制造一系列的笑點,讓電影的主題表達更進一步。但也有很多觀眾反映電影強行煽情,強行上升高度,強行搞笑,強行接續劇情,強行中年婚姻危機。
代碼實現:
from pyecharts.charts import WordCloud
from pyecharts.globals import SymbolType, ThemeType
word = WordCloud(init_opts=opts.InitOpts(width='1350px', height='750px'))
word.add("", [*zip(key_words.words, key_words.num)], word_size_range=[20, 200])
word.set_global_opts(title_opts=opts.TitleOpts(title="囧媽電影評論詞云圖"),
toolbox_opts=opts.ToolboxOpts)
word.render('囧媽電影評論詞云圖.html')
在熱門評論里,用戶阿暖說道:
“ 很平庸,很無趣,既不好笑,對于原生家庭的探討也只是隔靴搔癢而已?!?/span>
竟然獲得了5560個贊同。
同時C君也查了一下:
2010年《人在囧途》,豆瓣7.7分。主演是徐崢,導演葉偉民。
2012年《人在囧途之泰囧》,豆瓣7.4分,徐崢自導自演。
2015年《港囧》,豆瓣5.7分,徐崢自導自演。
2018年《我不是藥神》,豆瓣9.0分,主演是徐崢,導演是文牧野。
2020年《囧媽》,豆瓣5.9分,徐崢自導自演。
所以徐崢一定是個好演員,但導演嘛,就不好說了。
有人說這次徐崢這個玩法是要做中國版的Netflix。Netflix 現在大家都知道是世界數一數二流媒體平臺,就是視頻網站,也能在電視上看。所以從口碑上看,《囧媽》只能算在形式上開了個頭,就像當年徐崢是開啟了中國電影的大票房時代,但真正的票房王是吳京,讓我們期待一下吧。
數據分析咨詢請掃描二維碼
若不方便掃碼,搜微信號:CDAshujufenxi
CDA數據分析師證書考試體系(更新于2025年05月22日)
2025-05-26解碼數據基因:從數字敏感度到邏輯思維 每當看到超市貨架上商品的排列變化,你是否會聯想到背后的銷售數據波動?三年前在零售行 ...
2025-05-23在本文中,我們將探討 AI 為何能夠加速數據分析、如何在每個步驟中實現數據分析自動化以及使用哪些工具。 數據分析中的AI是什么 ...
2025-05-20當數據遇見人生:我的第一個分析項目 記得三年前接手第一個數據分析項目時,我面對Excel里密密麻麻的銷售數據手足無措。那些跳動 ...
2025-05-20在數字化運營的時代,企業每天都在產生海量數據:用戶點擊行為、商品銷售記錄、廣告投放反饋…… 這些數據就像散落的拼圖,而相 ...
2025-05-19在當今數字化營銷時代,小紅書作為國內領先的社交電商平臺,其銷售數據蘊含著巨大的商業價值。通過對小紅書銷售數據的深入分析, ...
2025-05-16Excel作為最常用的數據分析工具,有沒有什么工具可以幫助我們快速地使用excel表格,只要輕松幾步甚至輸入幾項指令就能搞定呢? ...
2025-05-15數據,如同無形的燃料,驅動著現代社會的運轉。從全球互聯網用戶每天產生的2.5億TB數據,到制造業的傳感器、金融交易 ...
2025-05-15大數據是什么_數據分析師培訓 其實,現在的大數據指的并不僅僅是海量數據,更準確而言是對大數據分析的方法。傳統的數 ...
2025-05-14CDA持證人簡介: 萬木,CDA L1持證人,某電商中廠BI工程師 ,5年數據經驗1年BI內訓師,高級數據分析師,擁有豐富的行業經驗。 ...
2025-05-13CDA持證人簡介: 王明月 ,CDA 數據分析師二級持證人,2年數據產品工作經驗,管理學博士在讀。 學習入口:https://edu.cda.cn/g ...
2025-05-12CDA持證人簡介: 楊貞璽 ,CDA一級持證人,鄭州大學情報學碩士研究生,某上市公司數據分析師。 學習入口:https://edu.cda.cn/g ...
2025-05-09CDA持證人簡介 程靖 CDA會員大咖,暢銷書《小白學產品》作者,13年頂級互聯網公司產品經理相關經驗,曾在百度、美團、阿里等 ...
2025-05-07相信很多做數據分析的小伙伴,都接到過一些高階的數據分析需求,實現的過程需要用到一些數據獲取,數據清洗轉換,建模方法等,這 ...
2025-05-06以下的文章內容來源于劉靜老師的專欄,如果您想閱讀專欄《10大業務分析模型突破業務瓶頸》,點擊下方鏈接 https://edu.cda.cn/g ...
2025-04-30CDA持證人簡介: 邱立峰 CDA 數據分析師二級持證人,數字化轉型專家,數據治理專家,高級數據分析師,擁有豐富的行業經驗。 ...
2025-04-29CDA持證人簡介: 程靖 CDA會員大咖,暢銷書《小白學產品》作者,13年頂級互聯網公司產品經理相關經驗,曾在百度,美團,阿里等 ...
2025-04-28CDA持證人簡介: 居瑜 ,CDA一級持證人國企財務經理,13年財務管理運營經驗,在數據分析就業和實踐經驗方面有著豐富的積累和經 ...
2025-04-27數據分析在當今信息時代發揮著重要作用。單因素方差分析(One-Way ANOVA)是一種關鍵的統計方法,用于比較三個或更多獨立樣本組 ...
2025-04-25CDA持證人簡介: 居瑜 ,CDA一級持證人國企財務經理,13年財務管理運營經驗,在數據分析就業和實踐經驗方面有著豐富的積累和經 ...
2025-04-25