1. 程式人生 > >Rotten Tomatoes 電影資料分析

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、公眾號、視訊網站、交友網站、直播平臺等,
也都在分散個人的注意力,
唯有閱讀經典,欣賞經典,
才可以讓自己不那麼浮躁。