import requests from bs4 import BeautifulSoup import pandas as pd 1. 发送HTTP请求 headers = { “User-Agent”: “Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36” } url = “https://movie.douban.com/top250” response = requests.get(url, headers=headers) response.encoding = ‘utf-8’ # 解决编码问题 2. HTML解析 soup = BeautifulSoup(response.text, ‘html.parser’) 3. 数据提取 movies = [] for item in soup.find_all(‘div’, class_=‘item’): title = item.find(‘span’, class_=‘title’).text.strip() rating = item.find(‘span’, class_=‘rating_num’).text.strip() director_tag = item.select_one(‘.bd p:nth-of-type(1) a’) director = director_tag.text.strip() if director_tag else ‘未知’ movies.append({ ‘电影名称’: title, ‘评分’: rating, ‘导演’: director }) 4. 数据存储 df = pd.DataFrame(movies) df.to_csv(‘douban_top250.csv’, index=False, encoding=‘utf_8_sig’) print(f"成功抓取{len(df)}条数据") 在以上代码中添加“数据可视化:使用Matplotlib绘制评分分布图”功能
时间: 2025-06-26 13:13:08 浏览: 15
要在上述代码中添加“**数据可视化:使用Matplotlib绘制评分分布图**”的功能,可以按照以下步骤操作:
---
### 修改后的完整代码示例
```python
import requests
from bs4 import BeautifulSoup
import pandas as pd
import matplotlib.pyplot as plt
# 1. 发送HTTP请求
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
}
url = "https://movie.douban.com/top250"
response = requests.get(url, headers=headers)
response.encoding = 'utf-8' # 解决编码问题
# 2. HTML解析
soup = BeautifulSoup(response.text, 'html.parser')
# 3. 数据提取
movies = []
for item in soup.find_all('div', class_='item'):
title = item.find('span', class_='title').text.strip()
rating = float(item.find('span', class_='rating_num').text.strip()) # 转换为浮点数便于绘图
director_tag = item.select_one('.bd p:nth-of-type(1) a')
director = director_tag.text.strip() if director_tag else '未知'
movies.append({
'电影名称': title,
'评分': rating,
'导演': director
})
# 4. 数据存储到CSV文件
df = pd.DataFrame(movies)
df.to_csv('douban_top250.csv', index=False, encoding='utf_8_sig')
print(f"成功抓取 {len(df)} 条数据")
# 5. 数据可视化:使用Matplotlib绘制评分分布直方图
plt.figure(figsize=(10, 6))
plt.hist(df['评分'], bins=10, color='skyblue', edgecolor='black') # 绘制评分分布直方图
plt.title("豆瓣Top250电影评分分布", fontsize=16)
plt.xlabel("评分", fontsize=12)
plt.ylabel("频次", fontsize=12)
# 添加平均分标注线
average_rating = df['评分'].mean()
plt.axvline(x=average_rating, color="red", linestyle="--")
plt.text(average_rating + 0.02, max(plt.ylim()) * 0.9, f"均值: {average_rating:.2f}", color="red")
# 显示图形
plt.tight_layout()
plt.savefig("douban_ratings_distribution.png") # 保存图像
plt.show()
```
---
### 功能说明
#### 新增部分解释:
1. **将评分转换为数字型 (`float`)**:
- 原始 `rating` 提取出的是字符串形式的数据(如 `'9.2'`),需要将其转为浮点数以便用于计算和绘图。
2. **导入 Matplotlib 并绘制直方图**:
- 使用 `matplotlib.pyplot.hist()` 函数生成评分的频率分布图表。
- 设置颜色、边界色等样式提升视觉效果。
3. **标记平均值**:
- 计算所有评分的平均值,并通过红色虚线标出该位置,在旁边注释显示具体的数值。
4. **保存图片并展示**:
- 将生成的图表保存成 PNG 文件方便后续查看或分享。
---
### 输出结果
运行脚本后会得到以下几个成果:
1. CSV 文件保存了爬取的所有信息;
2. 控制台打印成功的消息以及实际获取了多少条记录;
3. 展现一张清晰明了地反映评分集中程度及范围情况的柱状统计图!
---
阅读全文
相关推荐



















