Rotten Tomatoes 电影数据分析

“烂番茄”电影数据分析

背景

一千个读者眼中有一千个哈姆雷特,
看电影也是一种艺术鉴赏活动,
不同的观影人有不同的欣赏偏好。
所以大众的平均电影评分未必准确,
尤其对于品味独特的人,
很难在 x x 高分电影列表上找到自己喜欢的。

自己深受其苦,
喜欢看老电影,
但又不想看那些类似于“四大名著”,
总是盘踞在高分排行榜,
又一成不变的经典电影。

偶然间翻到了“烂番茄”,
它奇特的评分系统似乎能拯救自己的电影清单。

“烂番茄”网站建立于1998年,由美国加州大学伯克利分校的三位在校生创建。

随着影响力的日渐增加,“烂番茄”甚至能左右电影票房和电视收视率。

“烂番茄”已经成为新一代电影消费者和影迷的首选参考地。

先说“烂番茄”最重要的评分指标:百分比指数
很多人误以为它类似于一般电影网站的评分,
实际上它只代表新鲜度
是专业影评人对该电影正面评价的百分比,
如果正面评价多,可能是大于60%,就是“新鲜”的;
如果正面评价少,可能是低于60%,就是“腐烂”的。
而“烂番茄”的 Average Rating 才是类似于一般电影网站的平均分。
这种独树一帜的新鲜度评分避免了绝对评分的尴尬。

自己并不很爱电影,
却喜欢年代感十足的老片,
比如 Lovers and Lollipops‎ (1956),The 39 Steps (1935),
它们在一般的电影网站中得分一般,
而“烂番茄”给的新鲜度却很高,百分之九十多,
很符合个人口味。

下面以“烂番茄”排名前100的电影为例,
进行数据进行分析,
也许会有不错的收获~
(top 100 movies of all time,all genres)
这里写图片描述

数据采集及处理

“烂番茄”有官方API,但是不想麻烦申请key,所以自己爬取数据。
从上面的页面爬取top 100电影信息。

代码如下:

# 数据分析包
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

# 爬虫包
import requests
from bs4 import BeautifulSoup

%matplotlib inline
%config InlineBackend.figure_format = 'retina'

然后请求页面,构建BeautifulSoup对象:

url_top_100 = 'https://www.rottentomatoes.com/top/bestofrt/'
prefix = 'https://www.rottentomatoes.com/'

res = requests.get(url_top_100)
soup = BeautifulSoup(res.content, 'lxml')

对soup按照html结构进行拆解,获取需要的信息:

table = soup.find('div', class_='panel-body content_body allow-overflow').find('table')
table
<table class="table">
<thead>
<tr>
<th>Rank</th>
<th><span class="hidden-xs">Rating</span><span class="visible-xs">Tomatometer</span></th>
<th>Title</th>
<th class="right hidden-xs">No. of Reviews</th>
</tr>
</thead>
……
trs = table.find_all('tr')
trs
[<tr>
 <th>Rank</th>
 <th><span class="hidden-xs">Rating</span><span class="visible-xs">Tomatometer</span></th>
 <th>Title</th>
 <th class="right hidden-xs">No. of Reviews</th>
 </tr>,
 ……

将每行电影信息以字典的形式储存到列表movie_list中:

movie_list = []

for i, tr in enumerate(trs[1:]):
    tmeter_score = int(tr.find(class_='tMeterScore').text.strip()[:-1])
    title = tr.find(class_='unstyled articleLink').text.strip()
    url = prefix + tr.find(class_='unstyled articleLink').get('href').strip()
    no_of_reviews = int(tr.find(class_='right hidden-xs').text.strip())

    movie_list.append({'rank': i+1,
                      'tmeter_score': tmeter_score,
                      'title': title,
                      'url': url,
                      'no_of_reviews': no_of_reviews})

根据movie_list构建pd.DataFrame对象:

df = pd.DataFrame(movie_list, columns=['rank','tmeter_score','title','url','no_of_reviews'])

这里写图片描述

因为希望获取有“年代感”的电影,
所以要将名字中的年份信息提取出来,单独成列,
此处可感受到pandas的厉害之处,
一行代码搞定:提取年份然后赋值:

df['year'] = df['title'].str.slice(-5,-1).astype(int)

这里写图片描述

数据可视化

plt.figure(figsize=(12,6))
plt.scatter(x=df['year'], y=df['tmeter_score'],alpha=0.4)
plt.xlabel('Year')
plt.ylabel('Tomatometer Score')
plt.xticks(np.arange(1920, 2020, step=3), rotation=30)

plt.axvline(x=1990, linestyle='dashed');

这里写图片描述

电影的新旧是相对的,这里以83年以前的为“老电影”。

查看一下83年以前top 100的电影数量:

df[df.year < 1983].shape
(60, 6)

查看83年以前top 100的电影名称:
这里写图片描述
一些是耳熟能详的,剩下的不熟悉的电影中,至少一部分可以更新到自己的待看列表中。

分别查看新旧电影的平均新鲜度:
这里写图片描述

得出结论

除了更新了自己的电影清单外,还得到了一些有价值的结论:
1)top 100的电影新鲜度都很高,最低为91%
2)top 100的电影中,“老电影”占大多数,比例高达60%,而且新鲜度都在96%及以上,平均新鲜度为98.9%,质量十分稳定;
3)“新电影”即83年以后的电影,新鲜度从91%到100%,平均新鲜度96%,认可度也很高,但较“老电影”稍逊且只占40%。

所以,
经典电影并不会因为年代久远而褪色,反而会历久弥新;
不管是文学作品,还是影视作品,
经典之所以为经典,
是因为饱含着人类的丰富情感,有真善美的表达,有触动人心的部分;

电影技术越来越发达的今天,
也许太多声光、特效、大场面的加入,
弱化了内容的表达;
相比之下,“老电影”因为缺乏技术手段而注重内容本身,
让人感觉更真诚,更体现人性。

进一步,
不光是五光十色的电影,
众多的传媒介质,真人秀、网综、微博、twitter、公众号、视频网站、交友网站、直播平台等,
也都在分散个人的注意力,
唯有阅读经典,欣赏经典,
才可以让自己不那么浮躁。

猜你喜欢

转载自blog.csdn.net/guo_ya_nan/article/details/80115125