文章目录

  • 一、项目介绍
  • 二、开发环境
  • 三、项目展示
  • 四、代码展示
  • 五、项目总结


一、项目介绍

随着互联网的普及,人们越来越依赖于网络来获取信息和娱乐。电影作为一种重要的娱乐形式,也在网络上得到了广泛的传播。然而,如何有效地获取和分析电影数据仍然是一个挑战。因此,开发一个基于Python的影片数据爬取统计分析系统是非常有必要的。

本文的研究目的是开发一个基于Python的影片数据爬取统计分析系统,该系统可以从多个电影网站获取数据,并对数据进行清洗、处理和可视化分析,以便用户更好地了解电影市场的趋势和变化。

该系统的主要功能包括:

爬取电影数据:系统可以从多个电影网站获取电影数据,包括电影名称、导演、演员、上映日期、评分等。
数据清洗:系统可以对获取的数据进行清洗,以去除重复和无效的数据。
数据处理:系统可以对数据进行处理,例如计算平均评分、排名等。
可视化分析:系统可以对数据进行可视化分析,例如绘制电影评分分布图、电影排名变化图等。

该系统的意义在于:

帮助用户更好地了解电影市场的趋势和变化。
帮助用户更好地了解电影的演员和导演,以便他们更好地选择电影。
帮助用户更好地了解电影的评分和排名,以便他们更好地评估电影的质量和价值。
帮助用户更好地了解电影的票房和口碑,以便他们更好地预测电影的票房和口碑。

总之,该系统的开发对于电影行业的研究和分析具有重要的意义,可以为电影制作、发行和营销等方面提供有力的支持。

二、开发环境

  • 开发语言:Python
  • 数据库:MySQL
  • 系统架构:B/S
  • 后端:Django
  • 前端:Vue+HTML+CSS+JavaScript+jQuery
  • 工具:PyCharm

三、项目展示

注册登录页面:

数据分析实战电影榜单数据分析_python


管理员模块:

数据分析实战电影榜单数据分析_java_02

数据分析实战电影榜单数据分析_spring boot_03


数据分析实战电影榜单数据分析_python_04


数据分析实战电影榜单数据分析_spring boot_05


用户模块:

四、代码展示

import pandas as pd
from pyecharts.charts import Page  # 导入Page库
from pyecharts import options as opts
from pyecharts.charts import Bar
from pyecharts.charts import Pie
import jieba  # 中文分词库,自动识别句子里面的中文单词
from nltk import FreqDist  # 使用nltk库统计中文词语出现的频率
from pyecharts.charts import WordCloud

# 数据的读取
data = pd.read_csv("rawData.csv", encoding='utf-8')

# 按照评分人数对数据进行排序,并选取前10个作为绘制对象
df = data.sort_values(by='评分人数', ascending=False).iloc[:10]

# 绘制柱状图
bar = Bar(init_opts=opts.InitOpts(width='800px', height='400px'))  # 设置画布大小

bar.add_xaxis(df['电影名称'].tolist())
bar.add_yaxis('评分人数', df['评分人数'].tolist(),
              itemstyle_opts={'color': '#1E90FF'})  # 设置柱状图颜色

bar.set_global_opts(
    title_opts=opts.TitleOpts(title='电影评价人数', pos_left='left',
                              title_textstyle_opts=opts.TextStyleOpts(font_size = 16)),  # 设置标题位置及样式
    xaxis_opts=opts.AxisOpts(name='片名', axislabel_opts={'rotate': 20, 'interval': 0}),  # 设置x轴标签倾斜角度和间隔
    yaxis_opts=opts.AxisOpts(name='人数', name_gap=30, axislabel_opts=opts.LabelOpts(font_size=14)),
    datazoom_opts=[opts.DataZoomOpts(), opts.DataZoomOpts(type_='inside')],  # 添加滚动条
    toolbox_opts=opts.ToolboxOpts(orient='vertical',
                                  pos_top='middle',
                                  pos_left='right',
                                  feature=opts.ToolBoxFeatureOpts(save_as_image=None,
                                                                  data_view=None,
                                                                  magic_type=None,
                                                                  brush=None)),  # 设置工具箱位置及样式
).set_colors(['#1E90FF'])

# 按照评分对数据进行分组计数,并按照评分进行升序排序
count_by_rating = data.groupby(['电影评分'])['电影名称'].count().sort_index()

# 定义饼图颜色
colors = ['#1980C0', '#4EB3D3', '#7AC2D6', '#A3B1CF', '#BFA0BE',
          '#D68AA0', '#E67377', '#EE4F5F', '#F42955', '#FF0000']

# 设置全局样式
global_style = {
    'legend': {
        'type': 'scroll',
        'orient': 'vertical',
        'right': '3%',
        'top': '20%',
        'itemWidth': 16,
        'itemHeight': 16,
        'textStyle': {'color': '#333', 'fontSize': 14},
        'backgroundColor': 'rgba(0,0,0,0.5)',
        'borderRadius': 4,
        'padding': 10,
    },
    'series': {
        'label': {'formatter': '{b}\n{d:.2f}%'},
    },
    'toolbox': {
        'orient': 'vertical',
        'top': 'middle',
        'right': '3%',
    },
}

# 绘制饼状图
num = count_by_rating.tolist()
lab = count_by_rating.index.tolist()
pie = (
    Pie(init_opts=opts.InitOpts(width='800px', height='600px'))
    .add(series_name='', data_pair=[(i, j) for i, j in zip(lab, num)])
    .set_colors(colors)  # 设置饼图颜色
    .set_global_opts(
        title_opts=opts.TitleOpts(title="电影评分分布", pos_top=None, pos_left="left"),
    )
)

country_all = data['类型'].str.replace(",", " ").str.split(" ", expand=True)
country_all = country_all.apply(pd.value_counts).fillna(0).astype("int")
country_all['count'] = country_all.apply(lambda x: x.sum(), axis=1)
country_all.sort_values('count', ascending=False)
data2 = country_all['count'].sort_values(ascending=False).head(10)

country_counts = data2
country_counts.columns = ['类型', '数量']
country_counts = country_counts.sort_values(ascending=True)
bar2 = (
    Bar(init_opts=opts.InitOpts(width='800px', height='400px'))
    .add_xaxis(list(country_counts.index)[-10:])
    .add_yaxis('影片类型数量', country_counts.values.tolist()[-10:])
    .reversal_axis()
    .set_global_opts(
        title_opts=opts.TitleOpts(title='影片类型数量', pos_left='left',
                                  title_textstyle_opts=opts.TextStyleOpts(font_size=16)),
        yaxis_opts=opts.AxisOpts(name='类型'),
        xaxis_opts=opts.AxisOpts(name='数量'),
    )
    .set_series_opts(label_opts=opts.LabelOpts(position="right"))
)

country_all = data['国家'].str.replace(",", " ").str.split(" ", expand=True)
country_all = country_all.apply(pd.value_counts).fillna(0).astype("int")
country_all['count'] = country_all.apply(lambda x: x.sum(), axis=1)
country_all.sort_values('count', ascending=False)
data1 = country_all['count'].sort_values(ascending=False).head(10)

country_counts = data1
country_counts.columns = ['国家', '数量']
country_counts = country_counts.sort_values(ascending=True)

bar3 = (
    Bar(init_opts=opts.InitOpts(width='800px', height='400px'))
    .add_xaxis(list(country_counts.index)[-10:])
    .add_yaxis('地区上映数量', country_counts.values.tolist()[-10:])
    .reversal_axis()
    .set_global_opts(
        title_opts=opts.TitleOpts(title='地区上映电影数量', pos_left='left',
                                  title_textstyle_opts=opts.TextStyleOpts(font_size=16)),
        yaxis_opts=opts.AxisOpts(name='国家'),
        xaxis_opts=opts.AxisOpts(name='上映数量'),
    )
    .set_series_opts(label_opts=opts.LabelOpts(position="right"))
)

# 词云图
# 数据清洗操作:删除重复操作
data = data.drop_duplicates()
# 读取电影名称那一列的数据,转换为字符串类型
com_str = str(data["电影名称"].values)
# print(com_str)
cut_words = jieba.lcut(com_str)
# print(cut_words)

freq_list = FreqDist(cut_words)
# print(freq_list)
most_common_words = freq_list.most_common()
# print(most_common_words)

# 词云图的绘制
w = (
    WordCloud(init_opts=opts.InitOpts(width='800px', height='400px'))
    .add("", most_common_words, word_size_range=[15, 20])
    .set_global_opts(title_opts=opts.TitleOpts(title="电影名称WordCloudPicture",
                                               pos_left='left',
                                               title_textstyle_opts=opts.TextStyleOpts(font_size=16)),
                     )
)

page = Page(layout=Page.SimplePageLayout)
page.add(pie, bar, bar2, bar3, w)
page.render("result.html")

五、项目总结

本文详述了一个基于Python的影片数据爬取统计分析系统的设计和实现过程。该系统旨在从多个电影网站自动获取、处理和分析电影数据,从而帮助用户更好地了解电影市场的趋势和变化。

该系统首先通过Python的网络爬虫技术从选定的电影网站抓取电影数据,然后使用数据清洗技术去除重复和无效数据,以提供准确和可靠的数据基础。

在数据处理阶段,系统采用了各种数据处理算法,例如平均值计算、排序和分类,以便用户可以更好地理解电影数据。这些处理后的数据可以反映电影的评分分布,票房表现,口碑状况等。

最后,通过数据可视化技术,将处理后的数据以图表形式呈现,使用户可以更直观地理解电影数据,比如电影评分随时间的变化,或者电影票房与口碑的关系等。

在此过程中,本文也讨论了遇到的一些主要挑战,包括如何选择合适的爬虫技术以避免网站的防爬虫机制,如何清洗和处理异常数据以保证数据的准确性,以及如何选择合适的可视化技术以有效地传达数据信息。

总的来说,本系统提供了一个全面和高效的方法来获取和分析电影数据,对于电影行业的研究和分析具有重要的应用价值。尽管有一些技术和挑战在开发过程中出现,但这些问题都被有效地解决,从而保证了系统的稳定性和准确性。该系统的成功实现和部署,无论是对电影行业从业者还是对普通观众来说,都将是一个有力的工具,有助于他们更好地理解和把握电影市场的动态。