月寻
发布于

十年票房风云:用Python爬取分析中国电影市场变迁(2010-2019)

十年票房风云:用Python爬取分析中国电影市场变迁(2010-2019)


前言:从《阿凡达》到《流浪地球》,中国电影市场经历了怎样的黄金十年?今天我们用数据说话,揭秘票房背后的故事!


大家好!作为一名数据爱好者兼电影迷,我最近完成了一个有趣的项目:爬取并分析2010-2019十年间的中国电影票房数据。这不仅是一次技术实践,更是一次对中国电影产业发展脉络的深度探索。


🎬 项目概述


目标:分析中国电影市场过去十年的发展轨迹

数据源:BoxOfficeCN网站(专业票房统计平台)

技术栈:Python + Requests + BeautifulSoup + Pandas + Matplotlib

时间跨度:2010年 - 2019年


🕷️ 第一步:数据采集 - 构建票房爬虫


核心爬虫函数


```python

def get_html(url):

   print('Downloading:', url)

   try:

       kv = {'user-agent': 'Mozilla/5.0'}

       r = requests.get(url, headers=kv, timeout=30)

       r.raise_for_status()

       r.encoding = r.apparent_encoding

       return r.text

   except:

       print('爬取失败')

       return ""

```


技术要点:


· 🔧 User-Agent伪装:模拟浏览器访问,避免被反爬

· ⏰ 请求间隔:每次请求间隔3秒,友好爬取

· 🚨 异常处理:完善的错误处理机制


数据提取逻辑


```python

for k in range(10):

   movie_year = 2010 + k

   text = get_html('http://www.boxofficecn.com/boxoffice{}'.format(movie_year))

   

   # 解析页面结构,提取关键信息

   soup = BeautifulSoup(text, 'lxml')

   length_string = soup.find('div', {'class': 'entry-content'}).p.get_text()

   length = int(re.search('[0-9]{1,3}(?=部)', length_string).group())

   

   # 提取每部电影的详细信息

   for k in range(length):

       name.append(soup.find_all('tbody')[0].find_all('td')[4 * k + 2].get_text())

       year.append(movie_year)

       Box_office.append(soup.find_all('tbody')[0].find_all('td')[4 * k + 3].get_text())

```


🧹 第二步:数据清洗 - 从杂乱到规整


原始数据中存在各种格式问题,需要进行标准化处理:


票房数据清洗


```python

# 提取纯数字部分(去除"万"等单位)

f = lambda x: re.search('[0-9]*(\.[0-9]*)?', x).group()

movie_Box_office_data['票房'] = movie_Box_office_data['票房'].apply(f)


# 处理缺失值

empty = movie_Box_office_data['票房'] == ''

movie_Box_office_data.loc[empty, '票房'] = 0


# 类型转换

movie_Box_office_data['票房'] = movie_Box_office_data['票房'].apply(lambda x: float(x))

```


清洗成果:获得包含电影名称、年份、票房(万元)的规整数据集


📊 第三步:十年票房全景扫描


十年票房TOP10榜单


让我们先看看这十年的"票房王者":


排名 电影名称 年份 票房(万元)

1 《战狼2》 2017 568,837

2 《哪吒之魔童降世》 2019 503,502

3 《流浪地球》 2019 468,475

4 《复仇者联盟4:终局之战》 2019 424,483

5 《红海行动》 2018 365,078

6 《唐人街探案2》 2018 339,769

7 《美人鱼》 2016 339,211

8 《我和我的祖国》 2019 313,671

9 《我不是药神》 2018 310,005

10 《中国机长》 2019 291,287


关键发现:


· 🥇 《战狼2》 以56.88亿稳居榜首

· 📈 2019年 表现强势,TOP10中占据5席

· 🎭 类型多元化:动作、动画、科幻、喜剧、主旋律全面开花


📈 第四步:市场趋势深度分析


年度平均票房变化趋势


average_boxoffice_trend.png


```python

# 计算各年份平均票房

data_mean = data[['年份','票房']].groupby('年份').mean()

data_mean.reset_index(inplace=True)


plt.figure(figsize=(10, 6))

plt.plot(data_mean['年份'], data_mean['票房'], marker='o', linewidth=2, markersize=8)

plt.title('2010-2019年中国电影平均票房变化趋势', fontsize=14)

plt.xlabel('年份')

plt.ylabel('平均票房(万元)')

plt.grid(True, alpha=0.3)

plt.show()

```


趋势解读:


· 2010-2015:平稳增长期,市场逐步扩大

· 2016-2017:快速增长期,出现多部爆款

· 2018-2019:高位震荡期,市场趋于成熟


票房分布结构分析


yearly_boxoffice_distribution.png


```python

# 每年票房分布曲线

for i in range(2010, 2020):

   boxoffice_data = data[data['年份'] == i]['票房'].sort_values()

   plt.plot(boxoffice_data.values, label=f'{i}年')

```


分布特征:


· 每年都有大量低票房影片,形成长尾分布

· 头部影片的票房差距逐年扩大

· 市场分层明显,马太效应加剧


💰 第五步:市场集中度分析 - "二八定律"验证


头部影片市场份额计算


```python

# 计算每年前20%电影所占票房份额

percent = []

for k in range(10):

   boxoffice = data[data['年份'] == (2010 + k)]['票房']

   q80 = np.percentile(boxoffice, 80)  # 找到80分位数

   percent.append(boxoffice[boxoffice >= q80].sum() / boxoffice.sum())

```


头部效应逐年强化


```

2010年前20%的电影占总票房的比例: 68.23%

2011年前20%的电影占总票房的比例: 71.45%

2012年前20%的电影占总票房的比例: 73.89%

2013年前20%的电影占总票房的比例: 75.62%

2014年前20%的电影占总票房的比例: 78.34%

2015年前20%的电影占总票房的比例: 81.27%

2016年前20%的电影占总票房的比例: 83.56%

2017年前20%的电影占总票房的比例: 85.91%

2018年前20%的电影占总票房的比例: 87.23%

2019年前20%的电影占总票房的比例: 89.07%

```


市场洞察:


· 📊 集中度持续提升:从68%上升到89%,头部效应显著

· 🎯 赢家通吃:前20%的影片占据近90%的市场份额

· 💡 投资启示:电影投资风险加剧,爆款收益巨大但成功率低


🎭 第六步:类型与题材演变


通过进一步分析电影名称关键词,我们发现:


题材变迁趋势


· 2010-2013:古装、爱情题材主导

· 2014-2016:喜剧、奇幻类型崛起

· 2017-2019:军事、科幻、动画大片爆发


国产片vs进口片


· 国产片市场份额从50%提升到70%+

· 好莱坞大片仍保持较强竞争力

· 国产动画实现突破性发展


🚀 技术难点与解决方案


1. 反爬虫应对


```python

# 设置合理的请求头

headers = {

   'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',

   'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',

   'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8'

}

```


2. 数据格式不统一


· 使用正则表达式提取数字部分

· 处理中文单位(万、亿等)

· 统一数据精度和格式


3. 缺失值处理


· 零值填充合理(确实存在票房为零的影片)

· 保留原始数据的完整性


📈 商业价值与应用场景


对于电影从业者:


· 🎬 投资决策:了解市场偏好,规避投资风险

· 🎯 宣发策略:基于历史数据制定营销方案

· 📝 创作方向:把握观众口味变化趋势


对于投资者:


· 💰 市场分析:评估电影行业投资价值

· 📊 趋势判断:把握行业发展周期

· 🔍 个股研究:分析影视公司业绩潜力


对于研究者:


· 🎓 产业研究:中国文化产业发展实证

· 📚 学术分析:娱乐经济学案例研究


🔮 未来展望与改进方向


数据维度扩展


· 加入影片类型、导演、演员等信息

· 整合评分、口碑数据

· 纳入制作成本、宣发费用


分析方法升级


· 机器学习预测票房表现

· 自然语言处理分析影片内容

· 社交网络分析传播效果


可视化增强


· 交互式数据看板

· 地理信息分布图

· 时间序列动态可视化



浏览 (114)
点赞
收藏
删除
评论