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

news2024/11/15 10:04:51

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. 代码用途

以上代码的用途是:

  1. 通过HTTP POST请求从一个指定的API获取中国大陆电影票房排行榜的数据。
  2. 将获取的数据写入一个CSV文件中。
  3. 从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('../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.coloradmin.cn/o/1940995.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Linux/Windows】Wireshark抓包工具下载、安装、使用、数据分析、常用知识点

文章目录 Linux版下载Windows版下载Wireshark使用Wireshark测试Tcp三次握手Wireshark常见过滤条件本篇小结 更多相关内容可查看 在一个阳光明媚的周五清晨,一起快乐的玩耍一下Wireshark Linux版下载 1.使用yum安装wireshark yum -y install wireshark2.使用yum安…

全网最简单的Mysql 8.3 安装及环境配置教程

Windows系统计算机环境配置 第一篇关于环境配置的文档之MySQL 8.3(msi版本和zip版本略有不同,本文档介绍msi版本,若zip版本有需求,请在评论区留言,我后续会出相关文档。) 前言 网上的MySQL配置教程非常多…

杰发科技AC7840——SENT数据解析及软件Sent发送的实现

0. 测试环境 AC7840官方Demo板; 图莫斯0503 DSlogic U2Basic 使用引脚 输出脚:PB1 时钟:PB2,其他引脚可以不初始化,不接线 1. 数据解析 以下是SENT数据的格式(1tick以3us为例)&#…

智能优化算法之灰狼优化算法(GWO)

智能优化算法是一类基于自然界中生物、物理或社会现象的优化技术。这些算法通过模拟自然界中的一些智能行为,如遗传学、蚁群觅食、粒子群体运动等,来解决复杂的优化问题。智能优化算法广泛应用于各种工程和科学领域,因其具有全局搜索能力、鲁…

Android Display Graphics #User APP的绘制与WMS

如果图片链接失败,请扫码查看文章详情。 Android Display Graphics系列文章-汇总 系列文章请扫关注公众号! 1、User APP的绘制 用户APP在调用ViewRootImpl#setView()方法时,首次请求VSync信号。之后进入loop循环,等待显示事件。…

【数据结构】:链表实现洗牌功能

此操作包含的基本功能有: 组牌:组建 52 张扑克牌 四种花色:“♥️”,“♠️”,“⬛️”,“♣️”每种花色 13 张牌:1~13 洗牌:将 52 张扑克牌打乱顺序发牌:给三个人每人发…

关于光伏电站监控数据

电站监控后台显示的发电量数据不能真实的反应不同逆变器方案的发电量差异。组串式逆变器由于交流线缆长,损耗的电量比集中式方案高1-2%左右。在通过监控后台显示的发电量衡量不同逆变器的差异时,需要减掉这部分差值。 光伏电站监控后台统计的发电量是从光…

桌面小宠物发布一周,第一次以独立开发者的身份赚到了100块

收入数据(AppStore一周收入统计) AppStore付费工具榜第七 应用简介 桌面新宠(NewPet),是我耗时半年开发的一款桌面宠物。我是被 QQ 宠物影响的那批人,上学时天天给 QQ 宠物喂食,很可惜它现在不在了。所以,我开发的初衷是想要在电…

图像分类算法概述:深度学习方法

图像分类算法概述:深度学习方法 图像分类是计算机视觉中的一个基本任务,近年来随着深度学习的发展,图像分类算法取得了巨大的进步。本文将概述主要的深度学习图像分类算法。 #mermaid-svg-fkTtkPLl9ahuVT6w {font-family:"trebuchet ms…

Linux(CentOS7)部署PHP-7.2.17源码包

PHP-7.2.17源码包部署 安装php1. 解压并进入php-7.2.17文件夹2. 编写php.sh脚本3. 执行php.sh 配置Apache与PHP1. 编写httpd.conf配置文件2. 编写php测试脚本 部署HTTPD-2.4.37源码包点击跳转 部署MySQL-5.6.31源码点击跳转 下载源码包和依赖的源码包,资源见文章顶…

TiDB实践—索引加速+分布式执行框架创建索引提升70+倍

作者: 数据源的TiDB学习之路 原文来源: https://tidb.net/blog/92d348c2 背景介绍 TiDB 采用在线异步变更的方式执行 DDL 语句,从而实现 DDL 语句的执行不会阻塞其他会话中的 DML 语句。按照是否需要操作 DDL 目标对象所包括的数据来划分…

linux学习week4+5

linux学习 十四.shell编程 9.单分支多分支 基本语法: if [ 条件 ] then代码 elif [ 条件 ] then代码 fi10.case语句 基本语法: case $变量名 in "值1") 程序1(如果变量的值等于值1,则执行程序1) ;; &q…

LeetCode刷题记录(第三天)55. 跳跃游戏

题目: 55. 跳跃游戏 标签:贪心 数组 动态规划 题目信息: 思路一:动态规划 确定dp数组含义: dp[i] 第[i]个位置能否达到确定递推公式: dp[i] 能不能达到,取决于前面d[i-j],d[i-j…

Linux TFTP服务搭建及使用

1、TFTP 服务器介绍 TFTP ( Trivial File Transfer Protocol )即简单文件传输协议是 TCP/IP 协议族中的一个用来在客户机与服务器之间进行简单文件传输的协议,提供不复杂、开销不大的文件传输服务。端口号为 69 2、TFTP 文件传输的特点 tftp…

【博主推荐】HTML5实现简洁的实用的个人网站、个人主页七个页面源码

文章目录 1.设计来源1.1 个人主页界面1.2 关于我界面1.3 我的技能界面1.4 我的经验界面1.5 我的教育界面1.6 我的项目界面1.7 联系我界面 2.效果和源码2.1 动态效果2.2 源代码 源码下载万套模板,程序开发,在线开发,在线沟通 作者:…

【MQTT(2)】开发一个客户端,ubuntu版本

基本流程如下,先生成Mosquitto的库,然后qt调用库进行开发界面。 文章目录 0 生成库1 有界面的QT版本2 无界面版本 0 生成库 下载源码:https://github.com/eclipse/mosquitto.git 编译ubuntu 版本很简单,安装官方说明直接make&am…

1分钟带你了解等保测评流程

常言道:“安全无小事,防患于未然。” 在信息化高速发展的今天,网络安全已成为国家安全的重要组成部分,等级保护(简称“等保”)测评作为网络安全防护的重要手段,对于确保信息系统安全、稳定运行…

总台数430!2023年度各省燃机台数及装机容量一览

重型燃气轮机发电作为清洁能源战略的核心,将持续被强化以推动“双碳”目标的达成。鉴于其高度复杂的设计与制造流程,它成为了国家高端制造水平的象征。近年来,在科技强国战略的推动下,我国重型燃气轮机行业正迈向自主研发、创新突…

Elasticsearch基础(五):使用Kibana Discover探索数据

文章目录 使用Kibana Discover探索数据 一、添加样例数据 二、数据筛选 三、保存搜索 使用Kibana Discover探索数据 一、添加样例数据 登录Kibana。在Kibana主页的通过添加集成开始使用区域,单击试用样例数据。 在更多添加数据的方式页面下方,单击…

AJAX复习总结

AJAX复习总结 AJAX即“Asynchronous JavaScript and XML”(异步的JavaScript与XML技术),是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术。简单来说,AJAX就是让网页变得更快、更灵活的一种方法 举个例子&#xff1a…