前言

利用Python实现《姜子牙》和《哪吒》的票房对比和评价分析

 


随着国内疫情得到有效控制,每个地区的电影院都陆陆续续的开放了,而很多本应该在春节档上映的电影因为疫情撤档,现在也重新上映了。

很多人学习python,不知道从何学起。
很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手。
很多已经做案例的人,却不知道如何去学习更加高深的知识。
那么针对这三类人,我给大家提供一个好的学习平台,免费领取视频教程,电子书籍,以及课程的源代码!??¤
QQ群:623406465

想必和不少小伙伴一样,我一直对《姜子牙》满怀期待。于是,国庆第2天我便杀入影院。而关于《姜子牙》的评价呈现了两极分化,而它也经常被拿来和去年上映的《哪吒》对比。关于电影本身,我不做过多评价,主要是从数据的角度出发,把《姜子牙》和《哪吒》进行一个对比分析。

一、票房对比分析

两部电影的基本情况如下:

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

1、获取票房数据

为了使得数据统一,我选取上映的前9日的票房数据(将持续更新):

利用Python实现《姜子牙》和《哪吒》的票房对比和评价分析

 


注:票房数据来源于网络,不保证完全准确

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表示将第一列作为索引。运行结果如下:

利用Python实现《姜子牙》和《哪吒》的票房对比和评价分析

 


从图可以看出(仅代表个人观点):

  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 结果展示

  • 《姜子牙》评论词云:
利用Python实现《姜子牙》和《哪吒》的票房对比和评价分析

 



可以看出:在关于《姜子牙》的评论中,往往会伴随着与《哪吒》的比较。同时,其中的剧情、故事也是大家比较关注的一个问题

  • 《哪吒》评论词云:
利用Python实现《姜子牙》和《哪吒》的票房对比和评价分析

 


可以看出:在关于《哪吒》的评论中,大家往往涉及到了国产、动画等关键词,而这也与大家对《哪吒》的主流定位不谋而合。

彩蛋

本篇文章的原创并不是我,是CSDN@不正经的kimol君。说实话我接触的python内容并不多,当我在日常闲逛CSDN的过程中,无意发现了这篇“学以致用的典范”,于是与kimol君简单闲聊,获得了转载的权限。

利用Python实现《姜子牙》和《哪吒》的票房对比和评价分析

 


看着别人的代码执行得相当顺利,自己也跟着操作了一遍,但是发现了不少问题,想到肯定还有好多小伙伴也避不开踩坑的过程,于是我就将问题及对应的解决方案记录了下来。

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 文本文件的时候,打开会发现里面是类似这样的字符:

u5367u69fdu5c45u7136u770bu54edu4e86uff0cu8fd9

作为萌新,一开始我也是相当纳闷,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,我们下一期见~~

一键三连,养成习惯~

内容来源于网络如有侵权请私信删除

文章来源: 博客园

原文链接: https://www.cnblogs.com/sn8888/p/13858282.html

你还没有登录,请先登录注册
  • 还没有人评论,欢迎说说您的想法!