前言
随着国内疫情得到有效控制,每个地区的电影院都陆陆续续的开放了,而很多本应该在春节档上映的电影因为疫情撤档,现在也重新上映了。
私信小编01即可获取大量Python学习资料
想必和不少小伙伴一样,我一直对《姜子牙》满怀期待。于是,国庆第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表示将第一列作为索引。运行结果如下:
从图可以看出(仅代表个人观点):
- 首映当日《姜子牙》票房明显高于《哪吒》。这大概是源于观众的期待,这也说明前期的宣传工作做到位了;
- 从走势来看,《姜子牙》呈现出明显下滑。这大概是因为上映后口碑上出现了两级分化,电影本身没有到达观众原本的期待;
- 从走势来看,《哪吒》后续走势强劲有力。这大概是因为上映后《哪吒》作为国产动漫的代表口口相传,吸引了越来越多的观众
二、评价对比分析
这一部分主要是对观众的影评进行分析,评价数据来源于某瓣。
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
12
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 文本文件的时候,打开会发现里面是类似这样的字符:
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,我们下一期见~~
一键三连,养成习惯~