当前位置:   article > 正文

中国电影票房排行数据爬取及分析可视化_爬取中国电影票房保存csv并可视化

爬取中国电影票房保存csv并可视化

      大家好,我是带我去滑雪

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

目录

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

(1) 传入网页和请求头

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

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

(4)数据清洗

二、数据分析

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

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

(3) 绘制词云图


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

(1) 传入网页和请求头

  1. import requests; import pandas as pd
  2. from flask import request
  3. from bs4 import BeautifulSoup
  4. url = 'https://piaofang.maoyan.com/rankings/year'
  5. 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'}
  6. response= requests1.get(url,headers=headers)
  7. response.status_code

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

  1. soup = BeautifulSoup(response.text, 'html.parser')
  2. soup=soup.find('div', id='ranks-list')
  3. movie_list = []
  4. for ul_tag in soup.find_all('ul', class_='row'):
  5. movie_info = {}
  6. li_tags = ul_tag.find_all('li')
  7. movie_info['序号'] = li_tags[0].text
  8. movie_info['标题'] = li_tags[1].find('p', class_='first-line').text
  9. movie_info['上映日期'] = li_tags[1].find('p', class_='second-line').text
  10. movie_info['票房(亿)'] = f'{(float(li_tags[2].text)/10000):.2f}'
  11. movie_info['平均票价'] = li_tags[3].text
  12. movie_info['平均人次'] = li_tags[4].text
  13. movie_list.append(movie_info1)
  14. movie_list
  15. movies=pd.DataFrame(movie_list)
  16. 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)是数据分析过程中至关重要的一步,其目的是确保数据的准确性、完整性和一致性。为了方便后续的数据分析,对爬取的数据进行清洗。

  1. movies=movies.set_index('序号').loc[:'250',:]
  2. movies['上映日期']=pd.to_datetime(movies['上映日期'].str.replace('上映',''))
  3. movies[['票房(亿)','平均票价','平均人次']]=movies.loc[:,['票房(亿)','平均票价','平均人次']].astype(float)
  4. movies['年份']=movies['上映日期'].dt.year ; movies['月份']=movies['上映日期'].dt.month
  5. 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的柱状图

  1. import seaborn as sns
  2. import matplotlib.pyplot as plt
  3. plt.rcParams ['font.sans-serif'] ='SimHei' #显示中文
  4. plt.rcParams ['axes.unicode_minus']=False
  5. top_movies = movies.nlargest(10, '票房(亿)')
  6. plt.figure(figsize=(7, 4),dpi=128)
  7. ax = sns.barplot(x='票房(亿)', y='标题', data=top_movies, orient='h',alpha=0.5)
  8. for p in ax.patches:
  9. ax.annotate(f'{p.get_width():.2f}', (p.get_width(), p.get_y() + p.get_height() / 2.),
  10. va='center', fontsize=8, color='gray', xytext=(5, 0),
  11. textcoords='offset points')
  12. plt.title('票房前10的电影')
  13. plt.xlabel('票房数量(亿)')
  14. plt.ylabel('电影名称')
  15. plt.tight_layout()
  16. plt.savefig("squares.png",
  17. bbox_inches ="tight",
  18. pad_inches = 1,
  19. transparent = True,
  20. facecolor ="w",
  21. edgecolor ='w',
  22. dpi=300,
  23. orientation ='landscape')

      输出结果:

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

  1. plt.figure(figsize=(7, 6),dpi=128)
  2. plt.subplot(2, 2, 1)
  3. sns.scatterplot(y='平均票价', x='年份', data=movies,c=movies['年份'],cmap='plasma')
  4. plt.title('平均票价点图')
  5. plt.ylabel('平均票价')
  6. #plt.xticks([])
  7. plt.subplot(2, 2, 2)
  8. sns.boxplot(y='平均票价', data=movies)
  9. plt.title('平均票价箱线图')
  10. plt.xlabel('平均票价')
  11. plt.subplot(2, 2, 3)
  12. sns.scatterplot(y='平均人次', x='年份', data=movies,c=movies['年份'],cmap='plasma')
  13. plt.title('平均人次点图')
  14. plt.ylabel('平均人次')
  15. plt.subplot(2, 2, 4)
  16. sns.boxplot(y='平均人次', data=movies)
  17. plt.title('平均人次箱线图')
  18. plt.xlabel('平均人次')
  19. plt.tight_layout()
  20. plt.savefig("squares1.png",
  21. bbox_inches ="tight",
  22. pad_inches = 1,
  23. transparent = True,
  24. facecolor ="w",
  25. edgecolor ='w',
  26. dpi=300,
  27. orientation ='landscape')

     输出结果:

(3) 绘制词云图

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

       输出结果: 


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

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

博主的WeChat:TCB1736732074

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/371910
推荐阅读
相关标签
  

闽ICP备14008679号