【Python】爬虫实战02:电影市场票房情况分析与可视化

news/2024/9/15 0:12:14 标签: python, 开发语言, 爬虫, requests

1. 前言

在信息爆炸的时代,数据分析已成为各行各业的重要工具。特别是在电影行业,票房数据不仅反映了电影的市场表现,也是电影产业健康发展的关键指标。为了更好地理解和分析中国大陆电影市场的票房情况,本代码提供了一个自动化数据抓取和分析的解决方案。通过实时获取票房数据,我们可以对电影市场的趋势和动态有更深入的了解。

2. 介绍

本代码是一个基于 Python 的数据抓取和分析脚本,它通过访问艺恩娱数提供的API接口,获取中国大陆电影票房排行榜的数据。该脚本首先使用requests库发起网络请求,抓取票房数据,并将其保存到CSV文件中。随后,利用pandas库对数据进行处理和分析,最后使用matplotlib库绘制饼图和折线图,直观展示票房的年度占比和趋势。

代码的主要组成部分包括:

  • 数据抓取:通过定义main函数,自动从指定API获取票房数据。
  • 数据存储:将抓取到的数据以 CSV 格式保存,方便后续的数据分析和处理。
  • 数据分析:data_analyze函数读取 CSV 文件,计算各年度票房占比,绘制趋势图,并找出平均票价最高和平均场次最高的电影。
    本代码不仅适用于电影行业专业人士,也适合对数据分析感兴趣的任何人,它提供了一个实用的案例来展示如何将网络爬虫技术与数据分析相结合,以获取有价值的商业洞察。在使用本代码时,请确保遵守相关法律法规,并尊重数据提供方的版权和使用条款。

3. 代码解释

python">import requests
import csv
import pandas as pd
import matplotlib.pyplot as plt
import warnings
  • 这些是导入必要的 Python 库,用于网络请求、数据处理、分析和绘图。
python">warnings.filterwarnings('ignore')
plt.rcParams['font.sans-serif'] = ['SimHei']    # 解决中文显示
plt.rcParams['axes.unicode_minus'] = False   # 解决符号无法显示
  • 忽略所有警告,这对于保持输出整洁很有用。
  • 设置 matplotlib 的字体为 SimHei 以支持中文显示,并确保负号(-)能正确显示。
python">def main():
    # ... 省略了函数内的代码
  • main 函数是程序的入口点,负责发起网络请求以获取数据,并将数据写入 CSV 文件。
python">def data_analyze():
    # ... 省略了函数内的代码
  • data_analyze 函数用于读取 CSV 文件中的数据,进行数据分析,并绘制饼图和折线图来展示票房趋势,以及打印平均票价最高和平均场次最高的电影。
python">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. 代码用途

以上代码的用途是:

  1. 通过HTTP POST请求从一个指定的API获取中国大陆电影票房排行榜的数据。
  2. 将获取的数据写入一个CSV文件中。
  3. 从CSV文件中读取数据,进行分析,包括:
    • 计算各年度电影总票房占比,并绘制饼图。
    • 绘制各年度电影总票房趋势的折线图。
    • 打印平均票价最高的前十名电影。
    • 打印平均场次最高的前十名电影。

通过这些步骤,代码提供了一个简单但完整的数据抓取和分析流程,用于理解中国大陆电影市场的票房趋势和电影表现。

6. 整体源码

python">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('../Analysis_Data.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('../Analysis_Data.csv', 'w', encoding='utf-8', newline='') as f:

        csvwriter = csv.writer(f)

        # 添加文件表头

        csvwriter.writerow(('排名', '电影名称', '上映时间', '总票房(万)', '平均票价', '平均场次'))

        main()

    # 数据分析

    data_analyze()

7. 整体效果

7.1 生成的 CSV 文件

在这里插入图片描述

7.2 绘制的饼状图

在这里插入图片描述

7.3 绘制的折线图

在这里插入图片描述

7.4 分析平均票价最高的前十名电影

在这里插入图片描述

7.5 分析平均场次最高的前十名电影

在这里插入图片描述

以上只是数据分析和可视化的简单示例,可结合上文理解自行扩展更多其他的操作


http://www.niftyadmin.cn/n/5561293.html

相关文章

科普文:微服务之Apollo配置中心

1. 基本概念 由于Apollo 概念比较多,刚开始使用比较复杂,最好先过一遍概念再动手实践尝试使用。 1.1、背景 随着程序功能的日益复杂,程序的配置日益增多,各种功能的开关、参数的配置、服务器的地址……对程序配置的期望值也越来…

【博士每天一篇文献-算法】连续学习算法之HNet:Continual learning with hypernetworks

阅读时间:2023-12-26 1 介绍 年份:2019 作者:Johannes von Oswald,Google Research;Christian Henning,EthonAI AG;Benjamin F. Grewe,苏黎世联邦理工学院神经信息学研究所 期刊&a…

我在vue2重生之vite加强版

1. 在不影响功能的情况下升级vue和vite版本 升级vue到2.7.16版本,npm install vue2.7.16升级vite到4.0.0以上,npm install vite4 升级插件的主要目的是: ① 解决项目中通过import方式引入的json文件无法build成功;②rollup/plugin-commonj…

线程安全(七)ReentrantLock 简介、Condition 条件变量、锁的工作原理、synchronized 与 Lock 的区别

目录 一、ReentrantLock 简介1.1 Reentrant 的特性:1.2 基本语法1.3 ReentrantLock 的主要方法:1.4 lock()、tryLock()、lockInterruptibly() 的区别:二、Condition 条件变量2.1 什么是 Condition 条件变量?2.2 Condition 的核心方法:2.3 Condition 使用示例1:等待与唤醒…

AGI 之 【Hugging Face】 的【零样本和少样本学习】之一 [构建标记任务] / [ 基线模型 ] 的简单整理

AGI 之 【Hugging Face】 的【零样本和少样本学习】之一 [构建标记任务] / [ 基线模型 ] 的简单整理 目录 AGI 之 【Hugging Face】 的【零样本和少样本学习】之一 [构建标记任务] / [ 基线模型 ] 的简单整理 一、简单介绍 二、零样本学习 (Zero-shot Learning) 和少样本学习…

08. Hibernate Session (会话对象)

1. 前言 本节课程将和大家一起聊聊 Hibernate 的核心组件之一: Session 对象。 通过本节课程,你将了解到: 创建 Session 对象的 2 个方法;线程上下文的作用。 2. 创建 Session 对象 Session 是 Hibernate 的重要组件之一&…

C++代码_让室友坑我

引子 今天古文波在外地上C集训营,结果却被一起学习的室友坑了。啊,好气,我要报复室友。 所以,我写出了死亡代码。 如果你也想报复某些人,可以看下去。 代码构造: 头文件 想要使用一些函数,如…

昇思25天学习打卡营第21天|DCGAN生成漫画头像

DCGAN原理 DCGAN(深度卷积对抗生成网络,Deep Convolutional Generative Adversarial Networks)是GAN的直接扩展。不同之处在于,DCGAN会分别在判别器和生成器中使用卷积和转置卷积层。 它最早由Radford等人在论文Unsupervised Re…