Python爬取豆瓣电影数据与可视化分析实战

Python爬取豆瓣电影数据与可视化分析实战

1. 项目概述

最近在做一个挺有意思的小项目——用Python爬取豆瓣电影数据并进行可视化分析。这个项目特别适合想学习Python数据分析的新手,也适合需要快速构建数据看板的职场人士。整个过程涉及数据采集、清洗、分析和可视化四个核心环节,完整走下来能掌握一套实用的数据分析工作流。

我选择豆瓣电影作为数据源,主要是因为它结构清晰、数据质量高,而且不需要复杂的反爬策略就能获取到丰富的电影信息。通过这个项目,我们不仅能分析电影评分分布、类型占比等基础数据,还能挖掘导演作品评分趋势、演员票房号召力等深层信息。

2. 技术选型与准备

2.1 开发环境配置

我推荐使用Anaconda来管理Python环境,它自带了数据分析常用的库,省去了很多安装麻烦。具体版本选择Python 3.8+,这个版本对各类库的兼容性最好。核心需要安装的库有:

  • requests:用于网页请求
  • BeautifulSoup:网页解析
  • pandas:数据处理
  • matplotlib/seaborn:基础可视化
  • pyecharts:交互式可视化

注意:安装pyecharts时建议指定版本,最新版可能存在兼容性问题。可以用pip install pyecharts==1.9.1

2.2 数据采集方案设计

豆瓣电影的数据获取有两种方式:

  1. 直接爬取网页:适合小规模数据采集
  2. 使用官方API:需要申请API key,但更稳定

考虑到项目规模,我选择了网页爬取方案。主要采集以下字段:

  • 电影名称
  • 评分
  • 评价人数
  • 导演
  • 主演
  • 类型
  • 上映时间
  • 片长

3. 核心实现过程

3.1 数据爬取实现

爬虫部分的核心代码如下:

import requests from bs4 import BeautifulSoup import pandas as pd import time def get_movie_data(start=0): headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit...' } url = f'https://movie.douban.com/top250?start={start}' response = requests.get(url, headers=headers) soup = BeautifulSoup(response.text, 'html.parser') movies = [] for item in soup.find_all('div', class_='item'): title = item.find('span', class_='title').text rating = float(item.find('span', class_='rating_num').text) # 其他字段解析... movies.append([title, rating]) time.sleep(2) # 礼貌爬取 return movies

重要提示:务必设置合理的爬取间隔(建议2-3秒),避免给豆瓣服务器造成压力

3.2 数据清洗与处理

原始数据需要经过以下处理步骤:

  1. 缺失值处理:用中位数填充缺失的评分
  2. 异常值处理:剔除评分人数少于100的电影
  3. 数据转换:将上映时间转换为datetime格式
  4. 特征工程:从类型字段中提取主类型
# 示例:处理评分异常值 df = df[df['rating_count'] > 100] df['rating'] = df['rating'].fillna(df['rating'].median())

3.3 可视化分析实现

3.3.1 基础分布分析

使用seaborn绘制评分分布直方图:

import seaborn as sns import matplotlib.pyplot as plt plt.figure(figsize=(10,6)) sns.histplot(data=df, x='rating', bins=20, kde=True) plt.title('豆瓣电影评分分布') plt.show()
3.3.2 高级可视化

使用pyecharts制作交互式图表:

from pyecharts.charts import Bar from pyecharts import options as opts # 按年份统计电影数量 year_count = df.groupby('year').size() bar = ( Bar() .add_xaxis(list(year_count.index)) .add_yaxis("电影数量", list(year_count.values)) .set_global_opts(title_opts=opts.TitleOpts(title="各年份电影数量")) ) bar.render("year_count.html")

4. 分析案例与洞见

4.1 电影类型分析

通过分析发现:

  • 剧情片占比最高(约35%)
  • 喜剧和动作片次之
  • 纪录片平均评分最高(8.2分)

4.2 导演作品分析

对导演作品进行聚合分析,可以发现:

  • 某些导演的作品评分标准差很小,风格稳定
  • 部分导演早期作品评分高于近期作品
  • 少数导演所有作品评分都在8分以上

5. 常见问题与优化

5.1 爬虫被封怎么办?

解决方案:

  1. 使用代理IP轮换
  2. 降低请求频率
  3. 模拟浏览器行为(添加更多headers)

5.2 可视化图表不清晰?

优化建议:

  1. 调整图表尺寸(figsize参数)
  2. 简化数据(减少显示的数据点)
  3. 选择合适的图表类型(避免过度复杂的可视化)

5.3 数据分析效率低?

性能优化技巧:

  1. 使用pandas的向量化操作替代循环
  2. 对大数据集使用dask替代pandas
  3. 将中间结果缓存到本地

6. 项目扩展方向

这个基础项目可以进一步扩展:

  1. 加入情感分析:分析影评情感倾向
  2. 构建推荐系统:基于用户评分历史推荐电影
  3. 时间序列分析:预测电影评分变化趋势
  4. 社交网络分析:分析导演-演员合作网络

我在实际项目中最大的体会是:数据质量比算法复杂度更重要。花时间做好数据清洗和特征工程,往往比直接上复杂模型效果更好。另外,可视化不仅是展示结果的手段,更是发现数据问题的重要工具 - 很多数据异常都是在画图时才发现的。