Python数据分析案例30——中国高票房电影分析(爬虫获取数据及分析可视化全流程)

06-15 1357阅读

案例背景

最近总看到《消失的她》票房多少多少,《孤注一掷》票房又破了多少多少.....

于是我就想自己爬虫一下获取中国高票房的电影数据,然后分析一下。

数据来源于淘票票:影片总票房排行榜 (maoyan.com)

Python数据分析案例30——中国高票房电影分析(爬虫获取数据及分析可视化全流程)

爬它就行。

不会爬虫的同学要这代码演示数据可以参考:数据

 


代码实现

首先爬虫获取数据:

数据获取

导入包

import requests; import pandas as pd
from bs4 import BeautifulSoup

 传入网页和请求头

url = 'https://piaofang.maoyan.com/rankings/year'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36 Edg/116.0.1938.62'}
response1 = requests.get(url,headers=headers)
response.status_code

Python数据分析案例30——中国高票房电影分析(爬虫获取数据及分析可视化全流程)

200表示获取网页文件成功

然后解析网页文件,获取电影信息数据

%%time
soup = BeautifulSoup(response.text, 'html.parser')
soup=soup.find('div', id='ranks-list')
movie_list = []
for ul_tag in soup.find_all('ul', class_='row'):
    movie_info = {}
    li_tags = ul_tag.find_all('li')
    movie_info['序号'] = li_tags[0].text
    movie_info['标题'] = li_tags[1].find('p', class_='first-line').text
    movie_info['上映日期'] = li_tags[1].find('p', class_='second-line').text
    movie_info['票房(亿)'] = f'{(float(li_tags[2].text)/10000):.2f}'
    movie_info['平均票价'] = li_tags[3].text
    movie_info['平均人次'] = li_tags[4].text
    movie_list.append(movie_info)

数据获取完成了! 查看字典数据:

 

movie_list

Python数据分析案例30——中国高票房电影分析(爬虫获取数据及分析可视化全流程)

可以,很标准,没什么问题,然后把它变成数据框,查看前三行

movies=pd.DataFrame(movie_list)
movies.head(3)

Python数据分析案例30——中国高票房电影分析(爬虫获取数据及分析可视化全流程)

对数据进行一定的清洗,我们看到上映日期里面的数据有“上映”两个字,我们要去掉,然后把它变成时间格式,票房,票价,人次都要变成数值型数据。

我们只取票房前250的电影,对应豆瓣250.,,,,中国票房250好叭

然后我们还需要从日期里面抽取年份和月份两列数据,方便后面分析。

#清洗
movies=movies.set_index('序号').loc[:'250',:]  
movies['上映日期']=pd.to_datetime(movies['上映日期'].str.replace('上映',''))
movies[['票房(亿)','平均票价','平均人次']]=movies.loc[:,['票房(亿)','平均票价','平均人次']].astype(float)
movies['年份']=movies['上映日期'].dt.year  ;   movies['月份']=movies['上映日期'].dt.month
movies.head(2)

Python数据分析案例30——中国高票房电影分析(爬虫获取数据及分析可视化全流程)

数据处理完毕,开始画图分析!


画图分析

导入画图包

import seaborn as sns
import matplotlib.pyplot as plt
plt.rcParams ['font.sans-serif'] ='SimHei'               #显示中文
plt.rcParams ['axes.unicode_minus']=False  

 对票房排名前20的电影画柱状图

top_movies = movies.nlargest(20, '票房(亿)')
plt.figure(figsize=(7, 4),dpi=128)
ax = sns.barplot(x='票房(亿)', y='标题', data=top_movies, orient='h',alpha=0.5)
#plt.xticks(rotation=80, ha='center')
# 在柱子上标注数值
for p in ax.patches:
    ax.annotate(f'{p.get_width():.2f}', (p.get_width(), p.get_y() + p.get_height() / 2.),
                va='center', fontsize=8, color='gray', xytext=(5, 0),
                textcoords='offset points')
plt.title('票房前20的电影')
plt.xlabel('票房数量(亿)')
plt.ylabel('电影名称')
plt.tight_layout()
plt.show()

Python数据分析案例30——中国高票房电影分析(爬虫获取数据及分析可视化全流程)

还不错,很好看,可以看到中国历史票房前20 的电影名称和他们的票房数量。

对平均票价和平均人次进行分析:

 

plt.figure(figsize=(7, 6),dpi=128)
# 绘制第一个子图:平均票价点图
plt.subplot(2, 2, 1)
sns.scatterplot(y='平均票价', x='年份', data=movies,c=movies['年份'],cmap='plasma')
plt.title('平均票价点图')
plt.ylabel('平均票价')
#plt.xticks([])
plt.subplot(2, 2, 2)
sns.boxplot(y='平均票价', data=movies)
plt.title('平均票价箱线图')
plt.xlabel('平均票价')
plt.subplot(2, 2, 3)
sns.scatterplot(y='平均人次', x='年份', data=movies,c=movies['年份'],cmap='plasma')
plt.title('平均人次点图')
plt.ylabel('平均人次')
plt.subplot(2, 2, 4)
sns.boxplot(y='平均人次', data=movies)
plt.title('平均人次箱线图')
plt.xlabel('平均人次')
plt.tight_layout()
plt.show()

Python数据分析案例30——中国高票房电影分析(爬虫获取数据及分析可视化全流程)

先看柱状图,可以看到平均票价和平均人次都是有一些离群点的,然后我们在左边画了他们和年份的的散点图,可以明细看到,随着年份越大,电影的平均人次越来越低,平均票价越来越高.....也就是最近的电影比起之前的电影来说,越来越贵,而且平均每场看的人越来越少......也侧面反映了我国电影业的一些“高票价”,‘幽灵剧场刷票房’ 等等乱象...

我注意到2000年之前有一个电影每场人次特别高,票价很低,它是什么电影我很好奇我就查看了一下:

movies[movies['年份']
VPS购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]