地區電影市場分析:用Python爬蟲抓取貓眼_燈塔專業版各地區票房

在當今高度數據驅動的影視行業,精準把握地區票房表現是制片方、宣發團隊和影院經理做出關鍵決策的基礎。一部電影在北上廣深的表現與二三線城市有何差異?哪種類型的電影在特定區域更受歡迎?回答這些問題,不能再依賴“拍腦袋”和經驗主義,而需要真實、及時、細粒度的數據支撐。

貓眼專業版(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…