1. 程式人生 > 實用技巧 >利用Python實現《姜子牙》和《哪吒》的票房對比和評價分析

利用Python實現《姜子牙》和《哪吒》的票房對比和評價分析

前言


隨著國內疫情得到有效控制,每個地區的電影院都陸陸續續的開放了,而很多本應該在春節檔上映的電影因為疫情撤檔,現在也重新上映了。

很多人學習python,不知道從何學起。
很多人學習python,掌握了基本語法過後,不知道在哪裡尋找案例上手。
很多已經做案例的人,卻不知道如何去學習更加高深的知識。
那麼針對這三類人,我給大家提供一個好的學習平臺,免費領取視訊教程,電子書籍,以及課程的原始碼!??¤
QQ群:623406465

想必和不少小夥伴一樣,我一直對《姜子牙》滿懷期待。於是,國慶第2天我便殺入影院。而關於《姜子牙》的評價呈現了兩極分化,而它也經常被拿來和去年上映的《哪吒》對比。關於電影本身,我不做過多評價,主要是從資料的角度出發,把《姜子牙》和《哪吒》進行一個對比分析。

一、票房對比分析

兩部電影的基本情況如下:

姜子牙哪吒2020年10月1日(上映10天)2019年7月26日(上映443天)

1、獲取票房資料

為了使得資料統一,我選取上映的前9日的票房資料(將持續更新):


注:票房資料來源於網路,不保證完全準確

2、票房走勢分析

利用pandas庫對票房資料進行分析,並繪製折線圖:

import pandas as pd
import matplotlib.pyplot as plt

# 票房分析
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用來正常顯示中文標籤    
data = pd.read_excel('
票房資料.xlsx',index_col=0) data.plot(style='.-.') plt.title('票房資料') plt.ylabel('票房(億元)') plt.xlabel('上映時間') plt.savefig('票房資料.png')

其中,index_col=0表示將第一列作為索引。執行結果如下:


從圖可以看出(僅代表個人觀點):

  1. 首映當日《姜子牙》票房明顯高於《哪吒》。這大概是源於觀眾的期待,這也說明前期的宣傳工作做到位了;
  2. 從走勢來看,《姜子牙》呈現出明顯下滑。這大概是因為上映後口碑上出現了兩級分化,電影本身沒有到達觀眾原本的期待;
  3. 從走勢來看,《哪吒》後續走勢強勁有力。這大概是因為上映後《哪吒》作為國產動漫的代表口口相傳,吸引了越來越多的觀眾

二、評價對比分析

這一部分主要是對觀眾的影評進行分析,評價資料來源於某瓣。

Tip:本文僅供學習與交流,切勿用於非法用途!!!

1.爬取影評

在網站簡單搜尋之後可以發現一個電影短評的介面:

https://movie.douban.com/subject/26794435/comments?start=20&limit=20&status=P&sort=new_score

其中,26794435表示電影的編號;start引數表示評論起始位置;limit表示每次請求的評論數。

1.1 獲取評論頁面

def get_comment(mid,page):
    '''
    獲得評論頁面的HTML
    '''
    start = (page-1)*20
    url = 'https://movie.douban.com/subject/%s/comments?start=%d&limit=20&status=P&sort=new_score'%(mid,start)
    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; Win64; x64; rv:81.0) Gecko/20100101 Firefox/81.0',
               'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
               'Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',
               'Connection': 'keep-alive',
               'Upgrade-Insecure-Requests': '1'}
    cookies = {}
    res = requests.get(url,headers=headers,cookies=cookies)
    html = res.text
    return html

注:請求需要帶上登陸後的cookies,否則將只能獲取10頁的評論

1.2 解析頁面中的評論

def parse_comment(html):
    '''
    解析HTML中的評論
    '''
    comment = re.findall('<span class="short">(.*?)</span>',html)
    return comment

這裡就是一個簡單的正則匹配,就不過多解釋了

1.3 定義爬取函式

def crawl_comment(mid,N,name):
    '''
    爬取指定頁數的評論,並儲存在本地
    '''
    comments = []
    for p in range(1,N+1):
        html = get_comment(mid,p)
        comment = parse_comment(html)
        comments.extend(comment)
        print('《%s》第%d頁評論爬取完成(%d條)'%(name,p,len(comment)))
        time.sleep(random.uniform(3,5))
    with open('%s.txt'%name,'w') as f:
        f.write(json.dumps(comments))

注:time.sleep()很重要,否則請求過於頻繁將觸發安全機制,導致403

1.4 完整程式碼

# -*- coding: utf-8 -*-
"""
Created on Sat Oct 10 12:01:35 2020

@author: kimol_love
"""
import re
import time
import json
import random
import requests

# 定義相關函式
def get_comment(mid,page):
    '''
    獲得評論頁面的HTML
    '''
    start = (page-1)*20
    url = 'https://movie.douban.com/subject/%s/comments?start=%d&limit=20&status=P&sort=new_score'%(mid,start)
    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; Win64; x64; rv:81.0) Gecko/20100101 Firefox/81.0',
               'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
               'Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',
               'Connection': 'keep-alive',
               'Upgrade-Insecure-Requests': '1'}
    cookies = {}
    res = requests.get(url,headers=headers,cookies=cookies)
    html = res.text
    return html

def parse_comment(html):
    '''
    解析HTML中的評論
    '''
    comment = re.findall('<span class="short">(.*?)</span>',html)
    return comment

def crawl_comment(mid,N,name):
    '''
    爬取指定頁數的評論,並儲存在本地
    '''
    comments = []
    for p in range(1,N+1):
        html = get_comment(mid,p)
        comment = parse_comment(html)
        comments.extend(comment)
        print('《%s》第%d頁評論爬取完成(%d條)'%(name,p,len(comment)))
        time.sleep(random.uniform(3,5))
    with open('%s.txt'%name,'w') as f:
        f.write(json.dumps(comments))

# 爬取姜子牙評論
crawl_comment('25907124',25,'姜子牙')
    
# 爬取哪吒評論
crawl_comment('26794435',25,'哪吒')

2.詞雲分析

利用python的jieba庫和wordcloud庫對評論進行分析,繪製出詞雲。其中相應庫的安裝如下:

pip install jieba
pip install wordcloud

2.1 完整程式碼

# -*- coding: utf-8 -*-
"""
Created on Sat Oct 10 12:22:53 2020

@author: kimol_love
"""
import json
import jieba
from wordcloud import WordCloud

# 定義相關函式
def create_wordcloud(comments,name):
    '''
    根據評論列表建立詞雲
    '''
    content = ''.join(comments)
    wl = jieba.cut(content,cut_all=True)
    wl_space_split = ' '.join(wl)
    wc = WordCloud('simhei.ttf',
                   background_color='white', # 背景顏色
                   width=1000,
                   height=600,).generate(wl_space_split)
    wc.to_file('%s.png'%name)
 
# 詞雲資料分析
with open('姜子牙.txt','r') as f:
    comments_jiang = json.loads(f.read())
    create_wordcloud(comments_jiang,'姜子牙評論')
with open('哪吒.txt','r') as f:
    comments_ne = json.loads(f.read())
    create_wordcloud(comments_ne,'哪吒評論')

先利用jieba對評論進行分詞處理,再利用wordcloud對詞頻進行統計並繪製出詞雲

2.2 結果展示

  • 《姜子牙》評論詞雲:



可以看出:在關於《姜子牙》的評論中,往往會伴隨著與《哪吒》的比較。同時,其中的劇情、故事也是大家比較關注的一個問題

  • 《哪吒》評論詞雲:


可以看出:在關於《哪吒》的評論中,大家往往涉及到了國產、動畫等關鍵詞,而這也與大家對《哪吒》的主流定位不謀而合。

彩蛋

本篇文章的原創並不是我,是CSDN@不正經的kimol君。說實話我接觸的python內容並不多,當我在日常閒逛CSDN的過程中,無意發現了這篇“學以致用的典範”,於是與kimol君簡單閒聊,獲得了轉載的許可權。


看著別人的程式碼執行得相當順利,自己也跟著操作了一遍,但是發現了不少問題,想到肯定還有好多小夥伴也避不開踩坑的過程,於是我就將問題及對應的解決方案記錄了下來。

First

首先科普一下:

python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫

因為我們的票房資料是存放在以.xlsx結尾的excel檔案,當我們沒有事先安裝過xlrd模組,直接通過pandas物件.read_excel方法去讀取檔案就會出現以下異常:

ImportError: Missing optional dependency ‘xlrd’. Install xlrd >= 1.0.0 for Excel support Use pip or conda to install xlrd.

解決方法相當簡單,通過pip安裝一下xlrd模組即可

pip install xlrd

Second

大家在將評論資料寫入到 txt 文字檔案的時候,開啟會發現裡面是類似這樣的字元:

\u5367\u69fd\u5c45\u7136\u770b\u54ed\u4e86\uff0c\u8fd9

作為萌新,一開始我也是相當納悶,python預設的編碼就是 ‘UTF-8’,沒問題啊
後面在向度娘詢問之後終於發現了問題:

中文寫入txt、json檔案是無非就是open()檔案時,需要新增utf-8,dump()時,需要新增ensure_ascii=False,防止ascii編碼

好吧,果然一看之前的程式碼,json.dumps果然沒有指定ensure_ascii,指定完之後執行後文件中的內容就正常了。

這裡給大家展示一些評論:

哪吒.txt

臥槽居然看哭了,這才是貨真價實的國漫新希望,終於不再是假大空的中國風堆砌,而開始借神話寓言塑造真正的“小人物”
揹負原罪的出身,命中註定的死期,對存在的篤定和身份的動搖,竟指向《刺客聶隱娘》的核心:一個人,沒有同類。
完整的世界觀構建,父子母子師徒兄弟友敵,每一段關係都處理的有血有肉全無敷衍。美術剪輯配樂動作設計,處處都是亮點,就連喜劇部分也絕非裝瘋賣傻而存在無數細節作為支撐。
海邊夕陽踢毽和社稷圖虛幻仙境兩部分堪稱絕美段落,飛馳想象力和一流製作實力的結合,值得一刷再刷。
嚴格說是四星電影,但願意加滿五星狂推鼓勵!
牛逼!牛逼!牛逼!4年前翻著白眼看完了《大聖歸來》,4年後熱淚盈眶地看完這部《哪吒之魔童降世》。
沒想到2019不僅僅是中國科幻大片元年,本片更是和《白蛇:緣起》一塊兒創造了國產動漫作品前所未有的高潮。
紮實的故事,生動的角色,飽滿的情緒,炸裂的場面,這一切都構成了110分鐘雲霄飛車式的、暢快淋漓的觀影體驗,
表面上是哪吒的傳奇,骨子裡面是《絕代雙驕》+《悟空傳》,毀天滅地的逆天氣勢更是燃破天際,
好一曲震撼人心的“冰與火之歌”!都給老子去看!,

姜子牙.txt

申公豹:“姜子牙,你保護世界,我保護你。
我再說一遍,畫面再好都是虛的,能撐起一部電影的內涵最重要的絕不是特效,而是故事內涵和劇情。各位對國漫真是太寬容了,這麼多年依舊如此。
比《哪吒》成熟度高很多,平衡得也更好。天朝終於有了一部高階的3D動畫電影了。
既然是全新的故事和設定那就不要披封神演義的皮啊。
聽導演專訪本片是刪減後的次成品,想闡釋的主題是神需被貶入凡間以人的視角經歷蒼生,才能明白蒼生。
此片本質上已是成人動畫,甚至有點暗黑恐怖元素。
劇本確實與主題撕裂,不知道是否是時長閹割妥協於資本排片的緣故,有種商業與文藝片之間強行摻雜的模糊感!
但片中那些對生靈與普羅大眾的悲憫情節著實昇華了此片的立意!

不知道大家看完有什麼感想,歡迎在評論區留言~

Third

我們在將評論資料儲存在.txt文字的時候,如果指定了encoding=“utf-8”,那麼我們在讀取的時候也要指定with open('xxx.txt', 'r', encoding="utf-8"),否則就會報錯~

UnicodeDecodeError: ‘gbk’ codec can’t decode byte 0xaf in position

結語

本篇文章就到這裡,有任何好的想法或者建議都可以在評論區留言。在最美的年華,做最好的自己,我是00後Alice,我們下一期見~~

一鍵三連,養成習慣~