中国电影票房排行数据爬取及分析可视化

      大家好,我是带我去滑雪!

      对中国电影票房排行数据的爬取和分析可视化具有多方面的用处:例如了解电影市场的历史趋势,包括不同类型电影的受欢迎程度、票房的季节性波动。识别观众对于不同类型电影的偏好,为电影制片方提供指导,以选择更有市场潜力的题材和类型。本期使用python爬取中国电影票房排行数据,并进行数据分析。

目录

一、爬取中国电影票房排行数据

(1) 传入网页和请求头

(2)解析网页和获取信息

(3)部分数据爬取结果展示

(4)数据清洗

二、数据分析

(1)绘制排行榜前10的柱状图

(2) 对平均票价和平均人次进行分析

(3) 绘制词云图


一、爬取中国电影票房排行数据

(1) 传入网页和请求头

import requests; import pandas as pd
from flask import request
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'}
response= requests1.get(url,headers=headers)
response.status_code

(2)解析网页和获取信息

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_info1)
    movie_list
    movies=pd.DataFrame(movie_list)
movies.head(10)

(3)部分数据爬取结果展示

序号标题上映日期票房(亿)平均票价
01长津湖2021-09-30 上映57.7546.38389622
12战狼22017-07-27 上映56.9535.59427337
23你好,李焕英2021-02-12 上映54.1344.75656524
34哪吒之魔童降世2019-07-26 上映50.3635.69246723
45流浪地球2019-02-05 上映46.8744.5969829
56满江红2023-01-22 上映45.4449.51214624
67唐人街探案32021-02-12 上映45.2447.6025729
78复仇者联盟4:终局之战2019-04-24 上映42.5048.95809623
89长津湖之水门桥2022-02-01 上映40.6749.28668219
910流浪地球22023-01-22 上映40.2950.79231621

(4)数据清洗

       数据清洗(Data Cleaning)是数据分析过程中至关重要的一步,其目的是确保数据的准确性、完整性和一致性。为了方便后续的数据分析,对爬取的数据进行清洗。

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(5)

       清洗后数据部分展示:

序号标题上映日期票房(亿)平均票价平均人次年份月份
1长津湖2021-09-3057.7546.38389622.020219
2战狼22017-07-2756.9535.59427337.020177
3你好,李焕英2021-02-1254.1344.75656524.020212
4哪吒之魔童降世2019-07-2650.3635.69246723.020197
5流浪地球2019-02-0546.8744.59698029.02019

二、数据分析

(1)绘制排行榜前10的柱状图

import seaborn as sns
import matplotlib.pyplot as plt
plt.rcParams ['font.sans-serif'] ='SimHei'               #显示中文
plt.rcParams ['axes.unicode_minus']=False  
top_movies = movies.nlargest(10, '票房(亿)')
plt.figure(figsize=(7, 4),dpi=128)
ax = sns.barplot(x='票房(亿)', y='标题', data=top_movies, orient='h',alpha=0.5)

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('票房前10的电影')
plt.xlabel('票房数量(亿)')
plt.ylabel('电影名称')
plt.tight_layout()
plt.savefig("squares.png",
            bbox_inches ="tight",
            pad_inches = 1,
            transparent = True,
            facecolor ="w",
            edgecolor ='w',
            dpi=300,
            orientation ='landscape')

      输出结果:

(2) 对平均票价和平均人次进行分析

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.savefig("squares1.png",
            bbox_inches ="tight",
            pad_inches = 1,
            transparent = True,
            facecolor ="w",
            edgecolor ='w',
            dpi=300,
            orientation ='landscape')

     输出结果:

(3) 绘制词云图

import numpy as np
def randomcolor():
    colorArr = ['1','2','3','4','5','6','7','8','9','A','B','C','D','E','F']
    color ="#"+''.join([np.random.choice(colorArr) for i in range(6)])
    return color
[randomcolor() for i in range(3)]
from wordcloud import WordCloud
from matplotlib import colors
from imageio.v2 import imread 
mask = imread('底板.png')  
word_freq = dict(zip(movies['标题'], movies['票房(亿)']))
color_list=[randomcolor() for i in range(20)]
 
wordcloud = WordCloud(width=500, height=500, background_color='white',font_path='simhei.ttf',
                      max_words=250, max_font_size=250,random_state=42,mask = mask,
                          colormap=colors.ListedColormap(color_list)).generate_from_frequencies(word_freq)
 
plt.figure(figsize=(10, 5),dpi=300)
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis('off')
plt.savefig("squares1.png",
            bbox_inches ="tight",
            pad_inches = 1,
            transparent = True,
            facecolor ="w",
            edgecolor ='w',
            dpi=300,
            orientation ='landscape')

       输出结果: 


更多优质内容持续发布中,请移步主页查看。

若有问题可邮箱联系:1736732074@qq.com 

博主的WeChat:TCB1736732074

   点赞+关注,下次不迷路!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

带我去滑雪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值