用 Python 分析一下那些 "吸粉" 无数的高票房电影

前言

孩子:妈妈我想看电影

妈妈:看,看大片,480部够吗?

孩子:够了,谢谢妈妈,妈妈真好

奈何烂片层出不穷,电影荒就成了常事,不如回归经典,看一看电影历史上票房排行位于前端的一些电影,票房高的电影不一定精彩,但烂片票房低则是必然

本文基于 requests Be autifulSoup 爬取了电影历史票房Top480的基本信息,在观察这份文件同时也会考虑,票房的高低和评分是否存在一定的关系呢?与时间呢?与地区呢?在利用 pandas 完成对这份数据概况的分析后,自然而然就会得到答案

爬虫概况简要

豆瓣是一个静态网页,所以利用 requests 结合 BeautifulSoup 就能够爬取需要的信息,但前提是我们要登陆豆瓣,这会涉及到模拟登陆的知识,例如爬取微博,知乎类似网页都需要用到模拟登陆 在密码框可以输入一个错误的密码,为了能够找到准确的登陆网址,要注意这是一个 POST 请求

模拟登陆代码如下

#建立Session保存Cookie对话维持登陆状态

s = requests.Session()

def login_in():

#登陆的网址

login_url = ‘https://accounts.douban.com/j/mobile/login/basic’

#请求头

headers = {‘User-Agent’: ‘Mozilla/5.0′,’Referer’: ‘https://accounts.douban.com/passport/login_popup?login_source=anony’}

#登陆数据

data = {

‘name’: ‘***********’,#*为豆瓣正确账号和密码

‘password’:’***********’,

‘remember’: ‘false’

}

try:

r = s.post(login_url,headers = headers,data=data)

except:

print(“登陆失败”)

#输出登陆结果

print(r.text)

Session () 的作用是在登陆这个网站之后,进入网站的其他分页时也可以维持登陆状态

登陆成功后,会出现下图提示 剩下的爬虫内容比较简单,介于篇幅问题,不再陈述

数据如下

数据分析

库与工具

在进行数据分析之前,先将必要的库导入

import pandas as pd

import matplotlib.pyplot as plt

import seaborn as sns

import numpy as np

import jieba

from wordcloud import WordCloud

#词云图加载背景图会用到

from PIL import Image

%matplotlib inline

seaborn 简介 seaborn 是基于 matplotlib 的图形可视化 python 包,在 matplotlib 的基础上进行了高级的API封装,能够用更简洁的代码绘制出更吸引人的可视化图

工具 jupyter notebook

导入数据

数据分析第一步即将被分析的 csv 文件上传至 jupyter notebook 交互页面,并利用 pandas 读取文件,查看文件的基本内容

df = pd.read_csv(‘movie_ranking.csv’)

df.head()

从左至右依次为:排名、电影名字、导演、主演、类型、制片国家、上映年份、豆瓣评分、投票人数、票房 由于位列170的电影被删除,无法获取相关信息,就只剩479部电影

由于数据是自己爬取的,并且数据集很小,所以数据比较完整,可以跳过数据清洗直接进行数据可视化

数据可视化

电影评分与制片国家的关系

国家种类太多会导致绘图时不太美观,所以按照制片多少将国家分为四类即‘America’,‘Britain‘,’China‘,’Others‘四个地区

df[‘movie_country’].value_counts()

def Country(t):

if  ‘美国’ in t:

return ‘America’

elif ‘英国’ in t:

return ‘Britain’

elif ‘中国大陆’ in t:

return ‘China’

else:

return ‘Others’

#增加新一列————分类后的国家

df[‘Country’] = df[‘movie_country’].map(Country)

df1 = df.loc[:,(‘movie_score’,’Country’)]

我们只讨论电影评分和制片地区的关系,所以将两列提取生成一个新的 DataFrame 对象

可视化选择用箱线图和散点图叠加

箱线图主要包含六个数据节点,将一组数据从大到小排列,分别计算出他的上边缘,上四分位数,中位数,下四分位数,下边缘,还有一个异常值,加入散点图后也能呈现出电影评分的分布概况 从中不难看出 美国在电影方面的造诣堪称完美,排行榜中超九成的电影都是由美国制作的,同时生产的大片都时间长、质量好、评价高,但是也有一些评分比较低的电影上榜,这也算是萝卜青菜各有所爱吧

电影上映时间与地区的关系

电影上映时间的分布也十分广泛,我们用同样的方法,让时间以年代的方式出现即’2010s’,’2000s’,’1990s’,’1980s’,1970s’,’others’六个时间段

df[‘movie_year’].value_counts()

def Time(t):

if t>=2010 and t<2020:

return ‘2010s’

elif t>=2000 and t<2010:

return ‘2000s’

elif t>=1990 and t<2000:

return ‘1990s’

elif t>=1980 and t<1990:

return ‘1980s’

elif t>=1970 and t<1980:

return ‘1970s’

else:

return ‘other’

df[‘Time’] = df[‘movie_year’].map(Time)

散点图最大化的展示了电影上映时间的分布,而饼图更高的展示出电影上映年代的分布比例

近20年上映的电影上榜的较多,占据了榜单的80%,不可否认人们生活条件变好是一个重要因素,但科技、人文进步也具有一定影响;榜单上也有许多上个世纪的电影,比如《泰坦尼克号》、《侏罗纪公园》、《狮子王》都是经典中的经典

电影评分、投票人数、票房之间的联系

关于电影票房会有一个规律,.电影口碑好→评价人数多→评分高→观看人数多→电影票房高,这一套龙服务也决定了一部电影的地位如何 电影评分和评价人数的线性关系比较明显,评分越高的电影恰恰评价人数也多,在互联网世界,电影口碑的传播速度极快,具有明显因果效应。而对于同评分的电影票房有时差异很大,不能说电影评分对票房无影响,但是其中演员阵容,电影体裁等等都具有一定的影响

词云图

想看大咖怎么办?上词云呀!

像《复仇者联盟》《星球大战》《速度与激情》这类电影,由于具有极高的人气,所以可能一个系列中有好几部会上榜,自然而然主演的影星上榜次数也较多

总结

“票房无法衡量一部电影的质量,却代表了这部电影在全球范围内的热度”, 电影的好坏不能单单用票房判定,但是票房高的电影确实它的独到之处,演员阵容虽说很重要,可演员的演技和选题不应该才是一部大片的立足之本嘛,就我个人而言,必须要吹一波《肖申克的救赎》,虽然票房不高,但依靠着口碑的它涅槃重生,成为了电影史上的经典