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


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

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

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

  • 相关阅读:
    搜维尔科技:Movella Xsens和scalefit携手推进高精度人体工程学分析
    leetcode-aboutString
    Apache JMeter进行TCP并发压力测试初尝试
    【C++】结构体、类和引用
    【Linux】动静态库
    shell_39.Linux参数测试
    $attrs 和 $listeners (vue2&&vue3)
    kubeadm升级k8s集群
    面试题--SpringBoot
    【LeetCode热题100】--48.找到字符串中所有字母异位词
  • 原文地址:https://blog.csdn.net/qq_45856698/article/details/134491944