深圳网站建设服务电话,网站通栏设计素材,windows系统安装wordpress,网站头部固定案例背景
最近总看到《消失的她》票房多少多少#xff0c;《孤注一掷》票房又破了多少多少.....
于是我就想自己爬虫一下获取中国高票房的电影数据#xff0c;然后分析一下。
数据来源于淘票票#xff1a;影片总票房排行榜 (maoyan.com) 爬它就行。 代码实现
首先爬虫获…案例背景
最近总看到《消失的她》票房多少多少《孤注一掷》票房又破了多少多少.....
于是我就想自己爬虫一下获取中国高票房的电影数据然后分析一下。
数据来源于淘票票影片总票房排行榜 (maoyan.com) 爬它就行。 代码实现
首先爬虫获取数据
数据获取
导入包
import requests; import pandas as pd
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}
response1 requests.get(url,headersheaders)
response.status_code 200表示获取网页文件成功
然后解析网页文件获取电影信息数据
%%time
soup BeautifulSoup(response.text, html.parser)
soupsoup.find(div, idranks-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].textmovie_info[标题] li_tags[1].find(p, class_first-line).textmovie_info[上映日期] li_tags[1].find(p, class_second-line).textmovie_info[票房(亿)] f{(float(li_tags[2].text)/10000):.2f}movie_info[平均票价] li_tags[3].textmovie_info[平均人次] li_tags[4].textmovie_list.append(movie_info)
数据获取完成了 查看字典数据
movie_list 可以很标准没什么问题然后把它变成数据框查看前三行
moviespd.DataFrame(movie_list)
movies.head(3) 对数据进行一定的清洗我们看到上映日期里面的数据有“上映”两个字我们要去掉然后把它变成时间格式票房票价人次都要变成数值型数据。
我们只取票房前250的电影对应豆瓣250.,,,,中国票房250好叭
然后我们还需要从日期里面抽取年份和月份两列数据方便后面分析。
#清洗
moviesmovies.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(2) 数据处理完毕开始画图分析 画图分析
导入画图包
import seaborn as sns
import matplotlib.pyplot as plt
plt.rcParams [font.sans-serif] SimHei #显示中文
plt.rcParams [axes.unicode_minus]False 对票房排名前20的电影画柱状图
top_movies movies.nlargest(20, 票房(亿))
plt.figure(figsize(7, 4),dpi128)
ax sns.barplot(x票房(亿), y标题, datatop_movies, orienth,alpha0.5)
#plt.xticks(rotation80, hacenter)# 在柱子上标注数值
for p in ax.patches:ax.annotate(f{p.get_width():.2f}, (p.get_width(), p.get_y() p.get_height() / 2.),vacenter, fontsize8, colorgray, xytext(5, 0),textcoordsoffset points)plt.title(票房前20的电影)
plt.xlabel(票房数量亿)
plt.ylabel(电影名称)
plt.tight_layout()
plt.show() 还不错很好看可以看到中国历史票房前20 的电影名称和他们的票房数量。 对平均票价和平均人次进行分析
plt.figure(figsize(7, 6),dpi128)
# 绘制第一个子图平均票价点图
plt.subplot(2, 2, 1)
sns.scatterplot(y平均票价, x年份, datamovies,cmovies[年份],cmapplasma)
plt.title(平均票价点图)
plt.ylabel(平均票价)
#plt.xticks([])plt.subplot(2, 2, 2)
sns.boxplot(y平均票价, datamovies)
plt.title(平均票价箱线图)
plt.xlabel(平均票价)plt.subplot(2, 2, 3)
sns.scatterplot(y平均人次, x年份, datamovies,cmovies[年份],cmapplasma)
plt.title(平均人次点图)
plt.ylabel(平均人次)plt.subplot(2, 2, 4)
sns.boxplot(y平均人次, datamovies)
plt.title(平均人次箱线图)
plt.xlabel(平均人次)
plt.tight_layout()
plt.show() 先看柱状图可以看到平均票价和平均人次都是有一些离群点的然后我们在左边画了他们和年份的的散点图可以明细看到随着年份越大电影的平均人次越来越低平均票价越来越高.....也就是最近的电影比起之前的电影来说越来越贵而且平均每场看的人越来越少......也侧面反映了我国电影业的一些“高票价”‘幽灵剧场刷票房’ 等等乱象...
我注意到2000年之前有一个电影每场人次特别高票价很低它是什么电影我很好奇我就查看了一下
movies[movies[年份]2000] 原来是国民级别的《泰坦尼克号》,那没事了名副实归。 不同年份的高票房电影数量
plt.figure(figsize(7, 3), dpi128)
year_count movies[年份].value_counts().sort_index()
sns.lineplot(xyear_count.index, yyear_count.values, markero, lw1.5, markersize3)
plt.fill_between(year_count.index, 0, year_count, colorlightblue, alpha0.8)
plt.title(不同年份高票房电影数量)
plt.xlabel(年份)
plt.ylabel(电影数量)
# 在每个数据点上标注数值
for x, y in zip(year_count.index, year_count.values):plt.text(x, y0.2, str(y), hacenter, vabottom, fontsize8)plt.tight_layout()
plt.show() 可以看到我国高票房的电影从2010年开始高速增长到2017年到达峰值著名的《战狼2》就是2017年上映的然后2018和2019略微下降2020年断崖下跌为什么懂得懂得疫情原因嘛。
对高票房电影不同月份的占比百分比分析
plt.figure(figsize(4, 4),dpi128)
month_count movies[月份].value_counts(normalizeTrue).sort_index()
# 绘制饼图
sns.set_palette(Set3)
plt.pie(month_count, labelsmonth_count.index, autopct%.1f%%, startangle140, counterclockFalse,wedgeprops{alpha: 0.9})
plt.axis(equal) # 保证饼图是正圆形
plt.text(-0.3,1.2,不同月份高票房电影数量,fontsize8)
plt.tight_layout()
plt.show() 我们可以看到高票房电影主要集中在2月7月12月三个月份区间。
理由也很简单2月春节7月暑假12月跨年.....电影都喜欢这三个时间段上映。 自定义评价指标
我们上面都是之间拿票房进行分析的我们发现票房高的电影真的是反映了看的人多嘛它真的是受观众喜欢的好电影嘛
数据有限虽然我们无法剔除宣传时间热点导演社会风气等等影响因素但是我们可以把票价进行一定的控制。因为票房高的电影也有可能是票价过高造成的所以我们用‘票房/平均票价’然后和‘平均人次’进行一个加权求和。
票房/平均票价 表示看电影的人群量给7成权重平均人次 给一个3层的权重然后都进行标准化统一数据单位加起来就成为我们自己的评价指标 为了方便标准化我们先导入一个机器学习库里面sklearn的标准化函数
from sklearn.preprocessing import StandardScaler
scaler StandardScaler() 计算指标
movies[我的评价指标](movies[票房(亿)].astype(float)/movies[平均票价].astype(float))
data1scaler.fit_transform(movies[[我的评价指标, 平均人次]])
movies[我的评价指标]0.7*data1[:,0]0.3*data1[:,1]
moviesmovies.sort_values(by我的评价指标,ascendingFalse)
画图查看
my_top_movies movies.nlargest(20, 我的评价指标)
plt.figure(figsize(7, 4),dpi128)
ax sns.barplot(x我的评价指标, y标题, datamy_top_movies, orienth,alpha0.6,paletterainbow_r)
#plt.xticks(rotation80, hacenter)# 在柱子上标注数值
for p in ax.patches:ax.annotate(f{p.get_width():.2f}, (p.get_width(), p.get_y() p.get_height() / 2.),vacenter, fontsize8, colorgray, xytext(5, 0),textcoordsoffset points)plt.title(前20电影)
plt.xlabel(我的评价指标)
plt.ylabel(电影名称)
plt.tight_layout()
plt.show() 和之前的最高票房前20 的作对比这样我们能比较哪些是票房过高的电影哪些是可能被低估的电影。
def get_unique_elements(list1, list2):# 获取每个列表中的唯一元素set1 set(list1) ; set2 set(list2)unique_to_list1 list(set1 - set2)unique_to_list2 list(set2 - set1)common_elements list(set1 set2)return unique_to_list1, common_elements, unique_to_list2
票价过高的电影,确实是好电影,被低估的电影get_unique_elements(top_movies[标题].to_list(), my_top_movies[标题].to_list()) 这个函数的作用是选出第一个列表特有的元素两个列表共有的元素第二个列表特有的元素。
若这个电影在票房前20里面也在我们的评价指标前20里面那么就是好电影。若它在在票房前20里面不在我们的评价指标前20里面那可能就是票价过高的“水分电影”。
print(f票价过高的电影:{票价过高的电影},\n\n确实是好电影:{确实是好电影},\n\n低估的电影:{被低估的电影}) 票价过高的电影:[八佰, 我和我的家乡, 独行月球, 流浪地球2],emmmm
这几个电影我都没怎么深入了解就不评价了...... 总结
本次演示了从数据爬虫获取到清洗整理再到计算和可视化分析的全流程再多加点图和文字分析角度加点模型作为大多数的本科生的论文算是差不多的工作量了。