在当今高度数据驱动的影视行业,精准把握地区票房表现是制片方、宣发团队和影院经理做出关键决策的基础。一部电影在北上广深的表现与二三线城市有何差异?哪种类型的电影在特定区域更受欢迎?回答这些问题,不能再依赖“拍脑袋”和经验主义,而需要真实、及时、细粒度的数据支撑。

猫眼专业版(piaofang.maoyan.com)和灯塔专业版(box.taobao.com)作为国内最权威的票房数据平台,每日发布包括全国、省、市乃至单个影院的多维度票房数据。这些数据是进行深度市场分析的宝藏。本文将详细介绍如何利用Python爬虫技术,自动化地从这些平台抓取各地区票房数据,并完成一次小规模的分析实践。

一、技术选型与思路分析

在开始编写代码之前,我们需要对目标和数据获取方式进行一番侦察。

  1. 目标网站分析:猫眼和灯塔专业版的数据部分为公开数据(如首页榜单)和非公开的详细数据(需登录账号)。本文将以猫眼专业版的日票房排行榜及其背后的单日影片地区票房明细作为抓取目标。这类数据通常通过XHR(Ajax)请求动态加载,而非直接渲染在HTML中,这决定了我们的技术路线。
  2. 反爬策略考虑:专业数据平台通常没有较强的反爬机制,如猫眼专业版,但我们会遵循道德爬虫的准则。灯塔作为阿里系产品,反爬机制可能更为严格(需要更复杂的请求头模拟、Cookie处理等),本文为简化流程,将以猫眼为例。
  3. 技术栈
    • 请求库**<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">requests</font>**,用于发送HTTP请求,简单易用。
    • 解析库**<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">json</font>**,因为数据接口返回的是JSON格式,直接解析即可,无需HTML解析器。
    • 数据存储**<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">pandas</font>****<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">csv</font>**,用于将爬取的数据结构化并存储到CSV文件中,方便后续分析。
    • 可视化**<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">pyecharts</font>**,一个非常强大的可视化库,可以生成交互式的、美观的图表。

核心思路

  1. 打开浏览器开发者工具(F12),切换到“网络(Network)”面板。
  2. 刷新猫眼专业版页面,筛选XHR请求。
  3. 逐个查看请求,找到返回票房数据的API接口。
  4. 分析该接口的URL、请求头(Headers)和请求参数(Payload)。
  5. 在Python代码中模拟这个请求,获取返回的JSON数据。
  6. 从JSON数据中提取我们需要的信息(日期、影片名、总票房、地区、地区票房等)。
  7. 将数据存储到CSV文件或数据库中。
  8. 利用**<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">pandas</font>**进行数据清洗和初步分析,并用**<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">pyecharts</font>**进行可视化。

二、代码实现过程

下面我们以抓取猫眼专业版某一天的影片地区票房明细为例。

步骤1:分析API接口

通过浏览器开发者工具分析,我们找到了获取地区票房数据的接口(注:接口地址和参数可能随时间变化,请以实际分析为准)。

一个典型的接口URL可能类似于:
**<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">https://piaofang.maoyan.com/movie/1281575/regionbox?date=2023-10-01</font>**

其中:

  • **<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">1281575</font>** 是影片的唯一ID(例如《志愿军:雄兵出击》)。
  • **<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">date=2023-10-01</font>** 指定了要查询的日期。

请求这个URL,服务器会返回一个JSON对象,其中**<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">data</font>**字段下的**<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">list</font>**包含了各个地区的详细票房数据。

步骤2:编写爬虫代码

首先,安装必要的库(如果尚未安装):

然后,开始编写代码:

import requests
import pandas as pd
from pyecharts.charts import Bar, Map
from pyecharts import options as opts
from pyecharts.globals import ThemeType
import json
import time
import csv# 代理配置信息
proxyHost = "www.16yun.cn"
proxyPort = "5445"
proxyUser = "16QMSOML"
proxyPass = "280651"# 代理服务器
proxyMeta = f"http://{proxyUser}:{proxyPass}@{proxyHost}:{proxyPort}"proxies = {"http": proxyMeta,"https": proxyMeta,
}# 定义一个请求头,模拟浏览器行为,避免被简单的反爬机制拦截
headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36','Accept': 'application/json, text/plain, */*','Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8','Connection': 'keep-alive',# 'Cookie': '你的Cookie(如果需要的话)', # 猫眼这个接口通常不需要Cookie'Referer': 'https://piaofang.maoyan.com/'
}def fetch_movie_list(date):"""获取某一天的票房排行榜,从而得到电影ID列表"""# 这是一个获取单日大盘数据的接口,返回榜单url = f"https://piaofang.maoyan.com/box-office?date={date}&type=1"try:response = requests.get(url, headers=headers, proxies=proxies, timeout=15)response.raise_for_status() # 如果状态码不是200,抛出异常data = response.json()# 解析JSON,获取电影列表# 实际路径需要根据返回的JSON结构调整movie_list = data['data']['list']print(f"成功获取{date}日票房榜单,共{len(movie_list)}部电影")return movie_listexcept requests.exceptions.ProxyError as e:print(f"代理连接失败: {e}")return []except requests.exceptions.RequestException as e:print(f"请求电影列表失败: {e}")return []except json.JSONDecodeError as e:print(f"解析电影列表JSON失败: {e}")return []def fetch_movie_region_boxoffice(movie_id, movie_name, date):"""获取单一电影在指定日期的地区票房明细"""url = f"https://piaofang.maoyan.com/movie/{movie_id}/regionbox?date={date}"try:response = requests.get(url, headers=headers, proxies=proxies, timeout=15)response.raise_for_status()data = response.json()region_list = data['data']['list']data_to_save = []for region in region_list:# 提取每个地区的信息region_data = {'date': date,'movie_id': movie_id,'movie_name': movie_name,'region': region.get('regionName'),'box_office': region.get('boxInfo'), # 票房,单位通常是万元'box_office_ratio': region.get('boxRate'), # 票房占比'avg_price': region.get('avgViewBox'), # 平均票价'attendance': region.get('attendance'), # 场均人次}data_to_save.append(region_data)print(f"成功获取电影《{movie_name}》在{date}的地区票房数据,共{len(region_list)}个地区")return data_to_saveexcept requests.exceptions.ProxyError as e:print(f"代理连接失败(电影《{movie_name}》): {e}")return []except requests.exceptions.RequestException as e:print(f"请求电影《{movie_name}》的地区票房失败: {e}")return []except json.JSONDecodeError as e:print(f"解析电影《{movie_name}》的地区票房JSON失败: {e}")return []except KeyError as e:print(f"JSON数据结构异常(电影《{movie_name}》): {e}")return []def main():target_date = "2023-10-05" # 指定要抓取的日期all_region_data = [] # 存储所有电影的地区数据# 测试代理连接try:test_response = requests.get("http://httpbin.org/ip", proxies=proxies, timeout=10)print(f"代理连接测试成功,当前IP: {test_response.json()['origin']}")except Exception as e:print(f"代理连接测试失败: {e}")print("请检查代理配置信息是否正确,网络是否通畅")return# 1. 获取当天的电影排行榜movies = fetch_movie_list(target_date)if not movies:print("未获取到电影列表,程序退出")return# 2. 遍历榜单中的每一部电影,获取其地区明细for movie in movies:movie_id = movie.get('movieId')movie_name = movie.get('movieName')if not movie_id:continue# 暂停一小段时间,避免请求过于频繁time.sleep(1.5)  # 稍微延长等待时间,避免触发反爬single_movie_data = fetch_movie_region_boxoffice(movie_id, movie_name, target_date)if single_movie_data:all_region_data.extend(single_movie_data)# 3. 将所有数据保存到CSV文件if all_region_data:df = pd.DataFrame(all_region_data)filename = f'maoyan_region_boxoffice_{target_date}.csv'df.to_csv(filename, index=False, encoding='utf-8-sig') # utf-8-sig支持Excel直接打开显示中文print(f"所有数据已保存到文件: {filename}")print(f"共爬取{len(all_region_data)}条地区票房记录")# 这里可以调用数据分析函数# analyze_data(df, target_date)else:print("未获取到任何地区票房数据")if __name__ == '__main__':main()

步骤3:数据清洗与存储

上述代码已经将数据存储为CSV文件。**<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">pandas</font>**库使得数据清洗变得非常简单。例如,票房数据可能是字符串“12.3万”,我们需要将其转换为浮点数**<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">123000.0</font>**以便于计算。

# 在analyze_data函数或单独进行数据清洗
def clean_data(df):# 示例:清洗票房数据(假设原始数据是'1.2万'的形式)def convert_box_office(val):if '万' in val:return float(val.replace('万', '')) * 10000else:return float(val)df['box_office_clean'] = df['box_office'].apply(convert_box_office)# 类似地,可以清洗其他列...return df

三、数据分析与可视化示例

数据抓取和清洗完成后,我们就可以进行分析了。假设我们想分析《志愿军:雄兵出击》在2023年国庆档期间在全国各省的票房分布。

def analyze_data(df, date):# 假设我们只分析一部特定的电影target_movie = "志愿军:雄兵出击"df_movie = df[df['movie_name'] == target_movie].copy()if df_movie.empty:print(f"未找到电影《{target_movie}》的数据")return# 1. 绘制全国票房分布地图# 准备地图数据:列表,元素为[省份名称,票房值] map_data = [[row['region'], row['box_office_clean']] for _, row in df_movie.iterrows()]map_chart = (Map(init_opts=opts.InitOpts(theme=ThemeType.ROMA, width="1200px", height="600px")).add(series_name="票房",data_pair=map_data,maptype="china",is_map_symbol_show=False,).set_global_opts(title_opts=opts.TitleOpts(title=f"{target_movie} {date} 全国各省票房分布(元)"),visualmap_opts=opts.VisualMapOpts(max_=max(df_movie['box_office_clean']), # 视觉映射的最大值is_piecewise=False, # 是否为分段型range_text=['高', '低'],),).set_series_opts(label_opts=opts.LabelOpts(is_show=True)) # 显示省份名称)map_chart.render(f"{target_movie}_{date}_票房地图.html")# 2. 绘制票房TOP10省份柱状图df_sorted = df_movie.sort_values(by='box_office_clean', ascending=False).head(10)regions = df_sorted['region'].tolist()box_offices = df_sorted['box_office_clean'].tolist()bar_chart = (Bar(init_opts=opts.InitOpts(theme=ThemeType.LIGHT)).add_xaxis(regions).add_yaxis("票房(元)", box_offices).set_global_opts(title_opts=opts.TitleOpts(title=f"{target_movie} {date} 省份票房TOP10"),xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=45)), # 旋转x轴标签避免重叠yaxis_opts=opts.AxisOpts(name="票房"),))bar_chart.render(f"{target_movie}_{date}_票房TOP10.html")print(f"可视化图表已生成完毕。")

运行上述代码后,将会生成两个交互式的HTML图表文件:一个是中国地图,颜色深浅代表票房高低;另一个是柱状图,直观展示票房最高的10个省份。

四、总结与展望

通过本文的技术讲解和代码实现,我们成功地构建了一个可以自动抓取、解析、存储和分析猫眼专业版地区票房数据的Python爬虫。这套方法不仅可以用于单日分析,稍加改造(如循环日期)即可用于分析时间序列数据,研究电影票房在不同地区的生命周期和走势。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/93820.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/93820.shtml
英文地址,请注明出处:http://en.pswp.cn/web/93820.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spark03-RDD02-常用的Action算子

一、常用的Action算子 1-1、countByKey算子 作用&#xff1a;统计key出现的次数&#xff0c;一般适用于K-V型的RDD。 【注意】&#xff1a; 1、collect()是RDD的算子&#xff0c;此时的Action算子&#xff0c;没有生成新的RDD&#xff0c;所以&#xff0c;没有collect()&…

[Android] 显示的内容被导航栏这挡住

上图中弹出的对话框的按钮“Cancel/Save”被导航栏遮挡了部分显示&#xff0c;影响了使用。Root cause: Android 应用的主题是 Theme.AppCompat.Light1. 修改 AndroidManifest.xml 将 application 标签的 android:theme 属性指向新的自定义主题&#xff1a;<applicationandr…

分贝单位全指南:从 dB 到 dBm、dBc

引言在射频、音频和通信工程中&#xff0c;我们经常会在示波器、频谱仪或测试报告里看到各种各样的dB单位&#xff0c;比如 dBm、dBc、dBV、dBFS 等。它们看起来都带个 dB&#xff0c;实则各有不同的定义和参考基准&#xff1a;有的表示相对功率&#xff0c;有的表示电压电平&a…

怎么确定mysql 链接成功了呢?

asyncio.run(test_connection()) ✗ Connection failed: cryptography package is required for sha256_password or caching_sha2_password auth methods 根据你提供的错误信息,问题出现在 MySQL 的认证插件和加密连接配置上。以下是几种解决方法: 1. 安装 cryptography 包…

(5)软件包管理器 yum | Vim 编辑器 | Vim 文本批量化操作 | 配置 Vim

Ⅰ . Linux 软件包管理器 yum01 安装软件在 Linux 下安装软件并不像 Windows 下那么方便&#xff0c;最通常的方式是去下载程序的源代码并进行编译&#xff0c;从而得到可执行程序。正是因为太麻烦&#xff0c;所以有些人就把一些常用的软件提前编译好并做成软件包&#xff0c;…

VGG改进(3):基于Cross Attention的VGG16增强方案

第一部分&#xff1a;交叉注意力机制解析1.1 注意力机制基础注意力机制的核心思想是模拟人类的选择性注意力——在处理信息时&#xff0c;对重要部分分配更多"注意力"。在神经网络中&#xff0c;这意味着模型可以学习动态地加权输入的不同部分。传统的自注意力(Self-…

代理ip平台哪家好?专业代理IP服务商测评排行推荐

随着互联网的深度发展&#xff0c;通过网络来获取全球化的信息资源&#xff0c;已成为企业与机构在竞争中保持优势的一大举措。但想要获取其他地区的信息&#xff0c;可能需要我们通过代理IP来实现。代理IP平台哪家好&#xff1f;下文就让我们从IP池资源与技术优势等细节&#…

PWA》》以京东为例安装到PC端

如果访问 浏览器右侧出现 安装 或 点击这个 也可以完成安装桌面 会出现 如下图标

Linux系统:C语言进程间通信信号(Signal)

1. 引言&#xff1a;从"中断"到"信号"想象一下&#xff0c;你正在书房专心致志地写代码&#xff0c;这时厨房的水烧开了&#xff0c;鸣笛声大作。你会怎么做&#xff1f;你会暂停&#xff08;Interrupt&#xff09; 手头的工作&#xff0c;跑去厨房关掉烧水…

LoRa 网关组网方案(二)

LoRa 网关组网方案 现有需求&#xff1a;网关每6秒接收不同节点的数据&#xff0c;使用SX1262芯片。 以下是完整的组网方案&#xff1a;1. 网络架构设计 采用星型拓扑&#xff1a; 网关&#xff1a;作为中心节点&#xff0c;持续监听多个信道节点&#xff1a;分布在网关周围&am…

服装外贸系统软件怎么用才高效防风险?

服装外贸系统软件概述 服装外贸系统软件&#xff0c;如“艾格文ERP”&#xff0c;是现代外贸企业不可或缺的管理工具。它整合了订单处理、库存管理、客户资源保护、财务控制等多功能模块&#xff0c;旨在全面提升业务运营效率。通过系统化的管理方式&#xff0c;艾格文ERP能够从…

【沉浸式解决问题】peewee.ImproperlyConfigured: MySQL driver not installed!

目录一、问题描述二、原因分析三、解决方案✅ 推荐&#xff1a;安装 pymysql&#xff08;纯 Python&#xff0c;跨平台&#xff0c;安装简单&#xff09;✅ 可选&#xff1a;安装 mysqlclient&#xff08;更快&#xff0c;但需要本地编译环境&#xff09;✅ 总结四、mysql-conn…

C++进阶-----C++11

作者前言 &#x1f382; ✨✨✨✨✨✨&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f382; ​&#x1f382; 作者介绍&#xff1a; &#x1f382;&#x1f382; &#x1f382; &#x1f389;&#x1f389;&#x1f389…

(论文速读)航空轴承剩余寿命预测:多生成器GAN与CBAM融合的创新方法

论文题目&#xff1a;Remaining Useful Life Prediction Approach for Aviation Bearings Based on Multigenerator Generative Adversarial Network and CBAM&#xff08;基于多发生器生成对抗网络和CBAM的航空轴承剩余使用寿命预测方法&#xff09;期刊&#xff1a;IEEE TRAN…

3ds Max 流体模拟终极指南:从创建到渲染,打造真实液体效果

流体模拟是提升 3D 场景真实感的重要技术之一。无论是模拟飞瀑流泉、杯中溢出的饮料&#xff0c;还是黏稠的蜂蜜或熔岩&#xff0c;熟练掌握流体动力学无疑能为你的作品增色不少。本文将以 3ds Max 为例&#xff0c;系统讲解流体模拟的创建流程与渲染方法&#xff0c;帮助你实现…

《算法导论》第 35 章-近似算法

大家好&#xff01;今天我们深入拆解《算法导论》第 35 章 ——近似算法。对于 NP 难问题&#xff08;如旅行商、集合覆盖&#xff09;&#xff0c;精确算法在大规模数据下往往 “力不从心”&#xff0c;而近似算法能在多项式时间内给出 “足够好” 的解&#xff08;有严格的近…

系统架构设计师-操作系统-避免死锁最小资源数原理模拟题

写在前面&#xff1a;银行家算法的核心目标是确保系统始终处于“安全状态”。一、5个进程各需2个资源&#xff0c;至少多少资源避免死锁&#xff1f; 解题思路 根据死锁避免的资源分配公式&#xff0c;不发生死锁的最少资源数为&#xff1a; 最少资源数k(n−1)1 \text{最少资源…

Preprocessing Model in MPC 2 - 背景、基础原语和Beaver三元组

参考论文&#xff1a;SoK: Multiparty Computation in the Preprocessing Model MPC (Secure Multi-Party Computation) 博士生入门资料。抄袭必究。 本系列教程将逐字解读参考论文(以下简称MPCiPPM)&#xff0c;在此过程中&#xff0c;将论文中涵盖的40篇参考文献进行梳理与讲…

ACCESS/SQL SERVER保存软件版本号为整数类型,转成字符串

在 Access 中&#xff0c;若已将版本号&#xff08;如1.3.15&#xff09;转换为整数形式&#xff08;如10315&#xff0c;即1*10000 3*100 15&#xff09;&#xff0c;可以通过 SQL 的数学运算反向解析出原始版本号格式&#xff08;主版本.次版本.修订号&#xff09;。实现思…

编程语言学习

精通 Java、Scala、Python、Go、Rust、JavaScript ✅ 1. Java 面向对象编程&#xff08;OOP&#xff09;、异常处理、泛型JVM 原理、内存模型&#xff08;JMM&#xff09;、垃圾回收&#xff08;GC&#xff09;多线程与并发&#xff08;java.util.concurrent&#xff09;Java 8…