近十年中国电影票房数据爬取与分析

  • 前言
  • 爬取
  • 分析
    • 十年top10
    • 年度top5
    • 每年电影数
    • 每年总票房
    • 二八原则
  • 代码与数据

前言

这篇文章主要讲述的是近十年(2010-2019)中国电影票房数据的爬取与简单分析。
之所以想到做这个,是因为我最近在一本书上读到这么一段话

2013年受市场热捧的电影行业其实是个现金流状况很差的行业。中国每年会拍七百多部电影,只有两百多部能够上映,其中票房能够超过五亿的屈指可数。即使赚了五亿的票房“大获成功”的电影,扣除分给院线的一半,再扣除发行费,宣传费,制片方能够拿到手的大概只有2亿多一点。再扣除给编剧、导演、制片和演员的薪酬以及拍摄中的各种成本,最后剩下的净利润可能只有几千万。

这句话让我对中国的电影市场产生了好奇,想了解一下近年来中国电影市场的发展,于是想爬取近十年的中国电影票房。
但是,我在爬取的过程中,遇到了很多困难:

  1. 数据不公开
    没有一个权威、公开、透明的电影数据网站。我搜索了很多网站,没有找到满意的。所谓的中国电影数据信息网,有的是政策法规,工作咨询,没有的是电影数据。
  2. 设置爬虫障碍
    后来我找到一家数据齐全的网站:电影票房网,但是万万没有想到这个网站给爬虫设置了重重障碍:

    1. 查看多页数据需要用户登录

    2. 奇怪的验证码

    3. 这个数据居然是图片格式!

这让我这个爬虫小白望而却步,等以后学得更精了,再来爬这个。

后来我在外网上找到一个不错的网站:这是个网站
但是这个数据是非正式的,存在很多漏洞和问题,与真实数据有出入(下面会说明)。这里只是用来作爬取和数据分析用,不代表真实情况!

爬取

与前两个爬虫项目类似,直接上代码:

# 引入库
import re
import pandas as pd
import time
import urllib.request
from lxml.html import fromstring
from bs4 import BeautifulSoup# 下载链接
def download(url):print('Downloading:', url)request = urllib.request.Request(url)request.add_header('User-agent', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36') #进行伪装resp = urllib.request.urlopen(request)html = resp.read().decode('utf-8')return html# 待爬取内容
name = []
year = []
Box_office = []# 循环爬取每页内容
for k in range(10):movie_year = 2010+kurl = download('http://www.boxofficecn.com/boxoffice{}'.format(movie_year))time.sleep(3)   #间隔3s,防止被封禁tree = fromstring(url)soup = BeautifulSoup(url)length_string = soup.find('div',{'class':'entry-content'}).p.get_text()length = int(re.search('[0-9]{1,3}(?=部)',length_string).group())for k in range(length):name.append(soup.find_all('tbody')[0].find_all('td')[4*k+2].get_text())year.append(movie_year)Box_office.append(soup.find_all('tbody')[0].find_all('td')[4*k+3].get_text())# 将list转化为dataframe
name_pd = pd.DataFrame(name)
year_pd = pd.DataFrame(year)
Box_office_pd = pd.DataFrame(Box_office)# 拼接
movie_Box_office_data = pd.concat([name_pd,year_pd,Box_office_pd],axis=1)
movie_Box_office_data.columns=['电影','年份','票房']movie_Box_office_data.head()# 数据预处理
## 提取数字部分
f = lambda x: re.search('[0-9]*(\.[0-9]*)?',x).group()
movie_Box_office_data['票房'] = movie_Box_office_data['票房'].apply(f)
## 缺失值填充为0
empty = movie_Box_office_data['票房'] == ''
movie_Box_office_data.loc[empty,'票房'] = 0
## 转化成浮点数
movie_Box_office_data['票房'] = movie_Box_office_data['票房'].apply(lambda x: float(x))# 输出
outputpath='c:/Users/zxw/Desktop/修身/与自己/数据分析/数据分析/爬虫/中国电影票房/movie_box_office.csv' ## 路径需要自己改!
movie_Box_office_data.to_csv(outputpath,sep=',',index=False,header=True,encoding='utf_8_sig')

需要注意的一点是,这里使用 beautifulsoup 里面的 find_all 函数来进行定位,应该是最简单的。这是对爬取的所有十个网页均适用的定位方法。其他 xpath 等方法,都不大行得通。
另外需要注意的是爬取的票房数据要进行预处理,因为票房数据中可能含有中文。

分析

前期准备:引入库,导入数据。

%matplotlib inline
import matplotlib.pyplot as plt
import seaborn
import pandas as pd
import numpy as np
from pylab import *
mpl.rcParams['font.sans-serif'] = ['SimHei'] #使得图片可以显示中文
data = pd.read_csv('movie_box_office.csv')

十年top10

先看一下这十年 top10的影片,(票房的单位是万

data.sort_values(by='票房',ascending=False).head(10)

这里有一个问题就是,电影芳华的数据明显出错了,没有加小数点。更改之后如下

data.iloc[2111,2]=142241.3
data.sort_values(by='票房',ascending=False).head(10).plot.bar(x='电影',y='票房',title='top 10')

年度top5

data[data['年份']==2010].sort_values(by='票房',ascending=False).head(5).plot.bar(x='电影',y='票房',title='2010 top 5')


类似可以得到其他年份的top5


每年电影数

groupby_year = data.groupby('年份').size()
groupby_year.plot.bar(title = '每年电影数')

注意到2013年上映电影数明显下降。事实上是因为这份网页在统计2013年电影数据时存在缺失。

每年总票房

data.groupby('年份')['票房'].sum().plot.bar(title = '每年总票房')

同样地,2013年电影票房明显下降。

二八原则

二八原则大概指的是,前20%的人,拥有了80%的资源。
电影票房是不是也符合二八原则呢?是不是爆款电影占据了电影市场大部分份额,而绝大多数的电影却成为了不为人知的炮灰呢?事实正是如此。
可以先看一下近两年的票房情况:

data[data['年份']==2019]['票房'].plot.hist()

data[data['年份']==2018]['票房'].plot.hist()

再看一下近十年,每年票房前20%电影所占全年票房总市场的份额:

percent = []
for k in range(10):Boxoffice=  data[data['年份']==(2010+k)]['票房']q80 = np.percentile(Boxoffice ,80)percent.append(Boxoffice[Boxoffice >= q80].sum()/ Boxoffice.sum())
percent

可以看到,每年票房前20%电影所占全年票房总市场的份额大于70%的,而且是逐年增加的,近四年甚至超过了90%!

代码与数据

最后附上完整的代码和数据:提取码 v9kh

python爬虫实战三:近十年中国电影票房数据爬取与分析相关推荐

  1. 项目三:近10年来中国电影票房数据爬取分析

    近10年来中国电影票房数据爬取分析 前言 数据采集与存储 数据清洗和简单分析 引入库,导入数据 近10年top 年度top5 每年电影数 每年总票房 结论 二八原则 end 点击跳转到总目录 前言 这 ...

  2. 十年电影票房数据爬取与分析 | 免费数据教程

    3月8日妇女节,我很期待的超级英雄电影<惊奇队长>上映了,票房表现很快过亿,但大众口碑却让人失望. 一个有趣且常见的现象是,隔壁获奖无数,口碑爆炸的<绿皮书>,票房却远远不如& ...

  3. Python爬虫入门【3】:美空网数据爬取

    美空网数据----简介 从今天开始,我们尝试用2篇博客的内容量,搞定一个网站叫做"美空网"网址为:http://www.moko.cc/, 这个网站我分析了一下,我们要爬取的图片在 ...

  4. 《python程序设计实践》课程设计报告(胡润百富榜数据爬取及分析)

    1 需求分析 随着科学技术的不断发展,信息流通日益方便,信息数据不断膨胀,充斥在各行各业.由于数据非常庞大,所以即使在搜索引擎存在的情况下,搜索结果的准确率也不高,这使得在网上查找关键有效信息也变为一 ...

  5. 手把手教你用Python爬中国电影票房数据

    我发现自学Python数据分析的一个难点是资料繁多,过于复杂.大部分网上的资料总是从Python语法教起,夹杂着大量Python开发的知识点,花了很多时间却始终云里雾里,不知道哪些知识才是真正有用的. ...

  6. 零基础入门python爬虫之《青春有你2》选手信息爬取

    零基础入门python爬虫之<青春有你2>选手信息爬取 完成<青春有你2>选手图片爬取,生成选手图片的绝对路径并输出,统计爬取的图片总数量.使用工具:requests模块.Be ...

  7. 网络爬虫分析实例:基于音悦台网站榜单的数据爬取与分析

    基于音悦台网站榜单的数据爬取与分析 本实验代码:进入 一.研究背景 在互联网发展初期,网站相对较少,信息查找比较容易.然而伴随互联网爆炸性的发展,普通网络用户想找到所需的资料简直如同大海捞针,这时为满 ...

  8. python网络数据爬取及分析从入门到精通pdf_Python网络数据爬取及分析从入门到精通...

    这是一套以实例为主.使用Python语言讲解网络数据爬虫及分析的实战指南.本套书通俗易懂,涵盖了Python基础知识.数据爬取.数据分析.数据预处理.数据可视化.数据存储.算法评估等多方面知识,每一部 ...

  9. CnOpenData中国电影票房数据简介

    目录 一.数据简介 二.样本时间 三.字段展示 四.样本数据 五.数据更新频率 六.联系我们 一.数据简介 随着社会经济发展,文化产业日益繁荣,根据美国电影协会发布的电影市场数据报告显示:仅在2016 ...

最新文章

  1. AVL树、splay树(伸展树)和红黑树比较
  2. 安装ftp连接linux服务器配置,Linux下FTP安装及配置(VSFTPD服务器安装配置、FTP客户端安装配置)...
  3. MongoDB GridFS——本质上是将一个文件分割为大小为256KB的chunks 每个chunk里会放md5标识 取文件的时候会将这些chunks合并为一个整体返回...
  4. win10下安装PHP_CodeSniffer 检查编码规范
  5. 事务注解 @Transactional
  6. movielens推荐系统_基于内容推荐(二)
  7. ejb jsf jpa_完整的WebApplication JSF EJB JPA JAAS –第1部分
  8. C语言逻辑运算符 - C语言零基础入门教程
  9. string matching(HDU-6629)
  10. Linux常用命令小结(一)
  11. vSphere vsan 6.5部署之一VCSA6.5安装
  12. Android开发20——单个监听器监听多个按钮点击事件
  13. Java Web三大组件
  14. SiT1602:SiTime低功耗单端有源晶振
  15. ADO的七个对象详情解读
  16. 【文献阅读】大脑中与音乐体验和与音乐错误(冲突)监测相关的神经激活
  17. synchronized,并发安全的守护神
  18. 人人商城互动直播(与通信服务器连接失败)
  19. 进行分词时,报错omw-1.4安装包未找到?
  20. 少儿重疾险排名的选择与注意事项

热门文章

  1. 扒取blob:https:// 格式的视频
  2. Matlab 求全要素生产率,关于使用DEAP2.1计算全要素生产率的问题
  3. SpringBoot专栏:集成mybatis以及restful风格样例演示(第8讲)
  4. 物联网卡就是不能打电话的电话卡?
  5. 问道神兵天降服务器维护,《问道》手游安卓/IOS服务器10月27日5:30维护公告
  6. 初识linux之shell外壳与基本权限
  7. c语言日元转换美元程序,USD to JPY
  8. Centos 7安装Quagga
  9. 工程流体力学笔记暂记14(平均旋转角速度)
  10. Keil MDK生成LIB库以及使用LIB库