文章目录
- 一、项目介绍
- 二、开发环境
- 三、项目展示
- 四、代码展示
- 五、项目总结
一、项目介绍
随着互联网的普及,人们越来越依赖于网络来获取信息和娱乐。电影作为一种重要的娱乐形式,也在网络上得到了广泛的传播。然而,如何有效地获取和分析电影数据仍然是一个挑战。因此,开发一个基于Python的影片数据爬取统计分析系统是非常有必要的。
本文的研究目的是开发一个基于Python的影片数据爬取统计分析系统,该系统可以从多个电影网站获取数据,并对数据进行清洗、处理和可视化分析,以便用户更好地了解电影市场的趋势和变化。
该系统的主要功能包括:
爬取电影数据:系统可以从多个电影网站获取电影数据,包括电影名称、导演、演员、上映日期、评分等。
数据清洗:系统可以对获取的数据进行清洗,以去除重复和无效的数据。
数据处理:系统可以对数据进行处理,例如计算平均评分、排名等。
可视化分析:系统可以对数据进行可视化分析,例如绘制电影评分分布图、电影排名变化图等。
该系统的意义在于:
帮助用户更好地了解电影市场的趋势和变化。
帮助用户更好地了解电影的演员和导演,以便他们更好地选择电影。
帮助用户更好地了解电影的评分和排名,以便他们更好地评估电影的质量和价值。
帮助用户更好地了解电影的票房和口碑,以便他们更好地预测电影的票房和口碑。
总之,该系统的开发对于电影行业的研究和分析具有重要的意义,可以为电影制作、发行和营销等方面提供有力的支持。
二、开发环境
- 开发语言:Python
- 数据库:MySQL
- 系统架构:B/S
- 后端:Django
- 前端:Vue+HTML+CSS+JavaScript+jQuery
- 工具:PyCharm
三、项目展示
注册登录页面:
管理员模块:
用户模块:
四、代码展示
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的网络爬虫技术从选定的电影网站抓取电影数据,然后使用数据清洗技术去除重复和无效数据,以提供准确和可靠的数据基础。
在数据处理阶段,系统采用了各种数据处理算法,例如平均值计算、排序和分类,以便用户可以更好地理解电影数据。这些处理后的数据可以反映电影的评分分布,票房表现,口碑状况等。
最后,通过数据可视化技术,将处理后的数据以图表形式呈现,使用户可以更直观地理解电影数据,比如电影评分随时间的变化,或者电影票房与口碑的关系等。
在此过程中,本文也讨论了遇到的一些主要挑战,包括如何选择合适的爬虫技术以避免网站的防爬虫机制,如何清洗和处理异常数据以保证数据的准确性,以及如何选择合适的可视化技术以有效地传达数据信息。
总的来说,本系统提供了一个全面和高效的方法来获取和分析电影数据,对于电影行业的研究和分析具有重要的应用价值。尽管有一些技术和挑战在开发过程中出现,但这些问题都被有效地解决,从而保证了系统的稳定性和准确性。该系统的成功实现和部署,无论是对电影行业从业者还是对普通观众来说,都将是一个有力的工具,有助于他们更好地理解和把握电影市场的动态。