1. 前言
在信息爆炸的时代,数据分析已成为各行各业的重要工具。特别是在电影行业,票房数据不仅反映了电影的市场表现,也是电影产业健康发展的关键指标。为了更好地理解和分析中国大陆电影市场的票房情况,本代码提供了一个自动化数据抓取和分析的解决方案。通过实时获取票房数据,我们可以对电影市场的趋势和动态有更深入的了解。
2. 介绍
本代码是一个基于 Python 的数据抓取和分析脚本,它通过访问艺恩娱数提供的API接口,获取中国大陆电影票房排行榜的数据。该脚本首先使用requests
库发起网络请求,抓取票房数据,并将其保存到CSV
文件中。随后,利用pandas
库对数据进行处理和分析,最后使用matplotlib
库绘制饼图和折线图,直观展示票房的年度占比和趋势。
代码的主要组成部分包括:
- 数据抓取:通过定义
main
函数,自动从指定API获取票房数据。 - 数据存储:将抓取到的数据以 CSV 格式保存,方便后续的数据分析和处理。
- 数据分析:
data_analyze
函数读取 CSV 文件,计算各年度票房占比,绘制趋势图,并找出平均票价最高和平均场次最高的电影。
本代码不仅适用于电影行业专业人士,也适合对数据分析感兴趣的任何人,它提供了一个实用的案例来展示如何将网络爬虫技术与数据分析相结合,以获取有价值的商业洞察。在使用本代码时,请确保遵守相关法律法规,并尊重数据提供方的版权和使用条款。
3. 代码解释
import requests
import csv
import pandas as pd
import matplotlib.pyplot as plt
import warnings
- 这些是导入必要的 Python 库,用于网络请求、数据处理、分析和绘图。
warnings.filterwarnings('ignore')
plt.rcParams['font.sans-serif'] = ['SimHei'] # 解决中文显示
plt.rcParams['axes.unicode_minus'] = False # 解决符号无法显示
- 忽略所有警告,这对于保持输出整洁很有用。
- 设置
matplotlib
的字体为SimHei
以支持中文显示,并确保负号(-
)能正确显示。
def main():
# ... 省略了函数内的代码
main
函数是程序的入口点,负责发起网络请求以获取数据,并将数据写入 CSV 文件。
def data_analyze():
# ... 省略了函数内的代码
data_analyze
函数用于读取 CSV 文件中的数据,进行数据分析,并绘制饼图和折线图来展示票房趋势,以及打印平均票价最高和平均场次最高的电影。
if __name__ == '__main__':
# 创建保存数据的csv文件
with open('../Analysis_Data.csv', 'w', encoding='utf-8', newline='') as f:
csvwriter = csv.writer(f)
# 添加文件表头
csvwriter.writerow(('排名', '电影名称', '上映时间', '总票房(万)', '平均票价', '平均场次'))
main()
# 数据分析
data_analyze()
- 当该脚本作为主程序运行时,会创建一个名为
Analysis_Data.csv
文件,并调用main
函数来填充数据,然后调用data_analyze
函数来分析数据。
4. 注意事项
- 在不违反目标网站
https://ys.endata.cn/enlib-api/api/home/getrank_mainland.do
其服务条款的情况下进行爬取。 - 代码中使用的
User-Agent
需要根据实际情况进行修改,以避免被目标网站识别为爬虫程序。 - 确保所有导入的库都已安装,如未安装可以使用如下命令进行安装。
pip install requests pandas matplotlib -i https://pypi.tuna.tsinghua.edu.cn/simple
- 文件路径
'../Analysis_Data.csv'
可根据自身需要进行调整。 - 如果网站结构或 API 发生变化,代码需要相应地进行调整。
5. 代码用途
以上代码的用途是:
- 通过HTTP POST请求从一个指定的API获取中国大陆电影票房排行榜的数据。
- 将获取的数据写入一个CSV文件中。
- 从CSV文件中读取数据,进行分析,包括:
- 计算各年度电影总票房占比,并绘制饼图。
- 绘制各年度电影总票房趋势的折线图。
- 打印平均票价最高的前十名电影。
- 打印平均场次最高的前十名电影。
通过这些步骤,代码提供了一个简单但完整的数据抓取和分析流程,用于理解中国大陆电影市场的票房趋势和电影表现。
6. 整体源码
import requests
import csv
import pandas as pd
import matplotlib.pyplot as plt
import warnings
"""
本次选取的网址是艺恩娱数,目标是爬取里面的票房榜数据,通过开发者工具抓包分析找到数据接口,然后开始编写代码进行数据抓取。
"""
warnings.filterwarnings('ignore')
plt.rcParams['font.sans-serif'] = ['SimHei'] # 解决中文显示
plt.rcParams['axes.unicode_minus'] = False # 解决符号无法显示
def main():
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36',}
data = {
'r': '0.9936776079863086',
'top': '50',
'type': '0',
}
resp = requests.post('https://ys.endata.cn/enlib-api/api/home/getrank_mainland.do', headers=headers, data=data)
data_list = resp.json()['data']['table0']
# print(data_list)
for item in data_list:
rank = item['Irank'] # 排名
MovieName = item['MovieName'] # 电影名称
ReleaseTime = item['ReleaseTime'] # 上映时间
TotalPrice = item['BoxOffice'] # 总票房(万)
AvgPrice = item['AvgBoxOffice'] # 平均票价
AvgAudienceCount = item['AvgAudienceCount'] # 平均场次
# 写入csv文件
csvwriter.writerow((rank,MovieName,ReleaseTime,TotalPrice,AvgPrice,AvgAudienceCount))
print(rank,MovieName,ReleaseTime,TotalPrice,AvgPrice,AvgAudienceCount)
def data_analyze():
# 读取数据
data = pd.read_csv('../07.csv')
# 从上映时间中提取出年份
data['年份'] = data['上映时间'].apply(lambda x: x.split('-')[0])
# 各年度上榜电影总票房占比
df1 = data.groupby('年份')['总票房(万)'].sum()
plt.figure(figsize=(6, 6))
plt.pie(df1, labels=df1.index.to_list(), autopct='%1.2f%%')
plt.title('各年度上榜电影总票房占比')
plt.show()
# 各个年份总票房趋势
df1 = data.groupby('年份')['总票房(万)'].sum()
plt.figure(figsize=(6, 6))
plt.plot(df1.index.to_list(), df1.values.tolist())
plt.title('各年度上榜电影总票房趋势')
plt.show()
# 平均票价最贵的前十名电影
print("\n\n平均票价最贵的前十名电影: ")
print(data.sort_values(by='平均票价', ascending=False)[['年份', '电影名称', '平均票价']].head(10))
# 平均场次最高的前十名电影
print("\n\n平均场次最高的前十名电影: ")
print(data.sort_values(by='平均场次', ascending=False)[['年份', '电影名称', '平均场次']].head(10))
if __name__ == '__main__':
# 创建保存数据的csv文件
with open('../07.csv', 'w', encoding='utf-8', newline='') as f:
csvwriter = csv.writer(f)
# 添加文件表头
csvwriter.writerow(('排名', '电影名称', '上映时间', '总票房(万)', '平均票价', '平均场次'))
main()
# 数据分析
data_analyze()