import requests from bs4 import BeautifulSoup import pandas as pd # 定义函数用于抓取单页数据 def fetch_page_data(page_url): headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 " "(KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36" } response = requests.get(page_url, headers=headers) response.encoding = 'utf-8' # 解决编码问题 soup = BeautifulSoup(response.text, 'html.parser') 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 }) return movies # 主程序开始 base_url = "https://movie.douban.com/top250?start={}&filter=" all_movies = [] for page in range(10): # 遍历第1到第10页 start_index = page * 25 # 每页有25部电影 url = base_url.format(start_index) page_data = fetch_page_data(url) all_movies.extend(page_data) # 将数据存储为CSV文件 df = pd.DataFrame(all_movies) df.to_csv('douban_top250.csv', index=False, encoding='utf_8_sig') # 使用utf_8_sig避免乱码 print(f"成功抓取{len(df)}条数据并保存至 douban_top250.csv") 修改以上代码,6.实现数据可视化,使用Matplotlib绘制评分分布图。
时间: 2025-06-26 20:05:52 浏览: 35
以下是基于您提供的代码,并添加了使用 Matplotlib 实现评分分布图的功能后的完整版本:
```python
import requests
from bs4 import BeautifulSoup
import pandas as pd
import matplotlib.pyplot as plt
# 定义函数用于抓取单页数据
def fetch_page_data(page_url):
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 "
"(KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"
}
response = requests.get(page_url, headers=headers)
response.encoding = 'utf-8' # 解决编码问题
soup = BeautifulSoup(response.text, 'html.parser')
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
})
return movies
# 主程序开始
base_url = "https://movie.douban.com/top250?start={}&filter="
all_movies = []
for page in range(10): # 遍历第1到第10页
start_index = page * 25 # 每页有25部电影
url = base_url.format(start_index)
page_data = fetch_page_data(url)
all_movies.extend(page_data)
# 将数据存储为CSV文件
df = pd.DataFrame(all_movies)
df.to_csv('douban_top250.csv', index=False, encoding='utf_8_sig') # 使用utf_8_sig避免乱码
# 数据可视化部分
ratings = df['评分'].values # 获取所有评分值
plt.hist(ratings, bins=10, color='blue', edgecolor='black') # 绘制直方图
plt.title("豆瓣Top250电影评分分布") # 设置标题
plt.xlabel("评分") # X轴标签
plt.ylabel("频次") # Y轴标签
plt.grid(axis='y', linestyle='--', alpha=0.7) # 添加网格线
plt.show()
print(f"成功抓取{len(df)}条数据并保存至 douban_top250.csv")
```
### 修改说明:
1. **将评分转换为浮点数**:为了便于统计分析,在 `fetch_page_data` 函数中对评分进行了类型转换 (`float`)。
2. **引入 Matplotlib 库**:通过导入 `matplotlib.pyplot` 来完成绘图功能。
3. **生成直方图**:利用 `plt.hist()` 方法绘制评分分布的直方图。
运行此代码后,除了会生成 CSV 文件外,还会弹出一个窗口显示评分分布图。
---
阅读全文
相关推荐


















