python利用requests库和html.parser爬取豆瓣top250首页电影的名字和评分并保存成csv文件
时间: 2025-06-12 15:07:06 浏览: 17
<think>好的,我现在需要帮助用户解决如何使用Python的requests库和html.parser模块爬取豆瓣Top250首页的电影名称和评分,并将结果保存为CSV文件的问题。首先,我需要回顾用户提供的引用内容,确保回答符合他们的需求,并且正确引用相关信息。
首先,用户提到他们想使用requests和html.parser,所以我需要确保不使用其他解析库如BeautifulSoup,尽管引用中提到了它,但用户可能希望用更基础的模块。不过,html.parser其实是BeautifulSoup的一个解析器,用户可能指的是使用BeautifulSoup的html.parser解析方式。需要确认这一点,可能用户混淆了模块名称,但根据常见用法,正确的做法是使用BeautifulSoup并指定解析器为html.parser。
接下来,步骤分解:
1. 发送HTTP请求获取网页内容:使用requests.get,但需要注意豆瓣可能有反爬机制,所以需要设置User-Agent头。引用[2]中提到使用fake-useragent来模拟浏览器访问,这里可能需要生成合适的headers。不过用户可能希望简单处理,直接手动添加一个User-Agent。
2. 解析HTML内容:使用BeautifulSoup,选择器方面需要找到每部电影的条目。查看豆瓣Top250的结构,每个电影都在class为“item”的div中,电影名称可能在class为“title”的span里,评分可能在class为“rating_num”的span里。需要验证这一点,可能需要检查页面结构。
3. 提取数据:循环每个电影条目,提取名称和评分。注意处理可能的缺失数据,但豆瓣页面结构通常比较规整,但最好加入异常处理。
4. 保存为CSV:使用csv模块,引用[3]中提到写入CSV时处理编码和空行问题,所以需要设置encoding为utf-8-sig,以及newline参数为空字符串。同时使用DictWriter写入标题和行。
现在需要检查引用内容是否相关。引用[1]、[2]、[3]、[4]中,引用[2]和[3]特别相关,因为它们提到了爬取豆瓣Top250并保存到CSV的步骤。用户可能希望代码示例参考这些引用中的方法。
可能的注意事项:
- 分页处理:用户只需要第一页,所以URL是https://movie.douban.com/top250?start=0。
- 反爬措施:需要设置headers,否则可能返回403。引用[2]提到使用fake-useragent,但这里可以手动设置一个常见的User-Agent。
- 数据清洗:评分可能带有多余字符,比如引用[4]中处理评分去掉了“分”字,但当前页面中评分可能只是数字,如“9.5”,需要确认是否需要处理。假设当前页面中的评分是纯数字,但需要检查。
现在编写代码的步骤:
1. 导入必要的库:requests, csv, BeautifulSoup。
2. 设置请求头,包括User-Agent。
3. 发送GET请求,获取响应内容。
4. 使用BeautifulSoup解析内容,指定html.parser。
5. 查找所有电影条目,可能使用soup.find_all('div', class_='item')。
6. 对于每个条目,提取电影名称和评分:
- 名称可能在<span class="title">中,且第一个是该电影的中文名。
- 评分可能在<span class="rating_num">中。
7. 将数据存入列表。
8. 写入CSV文件,处理编码和换行问题。
测试过程中可能会遇到的问题:
- 豆瓣返回的不是200状态码,可能需要更真实的User-Agent。
- HTML结构变化,导致选择器失效。
- 编码问题,确保写入CSV时正确显示中文。
现在需要验证每个步骤是否正确,特别是选择器的部分。假设用户提供的引用中有正确的选择器,但需要根据实际情况调整。例如,电影名称可能位于<div class="hd">中的<a>标签内的第一个<span class="title">,而评分在<div class="star">中的<span class="rating_num">。
例如,对于每个item:
title = item.find('span', class_='title').text.strip()
rating = item.find('span', class_='rating_num').text.strip()
最后,保存到CSV,确保字段名为“电影名称”和“评分”,并正确写入每行数据。
总结步骤,编写代码,并加入注释解释各部分功能。同时,在回答中引用相关的引用内容,如处理CSV的编码问题参考引用[3],设置User-Agent参考引用[2]。</think>### 分步解答
#### 1. 安装依赖库
确保已安装`requests`和`beautifulsoup4`:
```bash
pip install requests beautifulsoup4
```
#### 2. 编写爬虫代码
```python
import requests
from bs4 import BeautifulSoup
import csv
# 设置请求头模拟浏览器访问(引用[2]提到的反爬策略)
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"
}
# 发送请求获取第一页内容
url = "https://movie.douban.com/top250?start=0"
response = requests.get(url, headers=headers)
response.encoding = "utf-8"
# 解析HTML内容
soup = BeautifulSoup(response.text, "html.parser")
movies = soup.find_all("div", class_="item")
# 提取电影名称和评分
data = []
for movie in movies:
title = movie.find("span", class_="title").text.strip() # 提取电影名
rating = movie.find("span", class_="rating_num").text.strip() # 提取评分
data.append({"电影名称": title, "评分": rating})
# 写入CSV文件(引用[3]的编码和换行处理)
with open("douban_top250_page1.csv", "w", newline="", encoding="utf-8-sig") as f:
writer = csv.DictWriter(f, fieldnames=["电影名称", "评分"])
writer.writeheader()
writer.writerows(data)
print("数据已保存为douban_top250_page1.csv")
```
#### 3. 代码说明
1. **请求头设置**:通过`User-Agent`伪装浏览器访问,避免被豆瓣反爬拦截[^2]。
2. **解析逻辑**:
- 使用`find_all("div", class_="item")`定位电影条目。
- 通过`find("span", class_="title")`和`find("span", class_="rating_num")`提取名称和评分。
3. **文件保存**:使用`utf-8-sig`编码解决中文乱码,`newline=""`避免空行[^3]。
#### 4. 运行结果
生成的CSV文件包含字段`电影名称`和`评分`,例如:
```
电影名称,评分
肖申克的救赎,9.7
霸王别姬,9.6
阿甘正传,9.5
...
```
阅读全文
相关推荐

















