python使用requests库和html.parser爬取豆瓣top250首页电影的信息并保存到本地csv
时间: 2025-06-12 20:07:10 浏览: 15
<think>嗯,用户想用Python的requests库和html.parser模块来爬取豆瓣Top250的第一页电影信息,然后保存到CSV文件。首先,我需要回忆一下豆瓣Top250页面的结构。之前有相关的引用提到过,引用[2]和[3]都提到了用BeautifulSoup和正则表达式来解析数据,但用户这次想用html.parser,也就是Python自带的解析器,可能不需要第三方库如BeautifulSoup?
不过,仔细想想,html.parser其实是Python标准库中html模块的一部分,而BeautifulSoup是一个第三方库,但通常会和html.parser一起使用,作为解析器。用户可能指的是使用html.parser作为解析引擎,而不是用BeautifulSoup?或者用户可能混淆了这两个概念?需要确认一下。
根据用户的问题描述,他们想用requests库获取网页内容,然后用html.parser模块解析。可能他们指的是使用html.parser来解析HTML,而不用BeautifulSoup?但Python自带的html.parser模块通常需要自己处理解析,可能比较麻烦。比如,使用html.parser的HTMLParser类来手动处理标签,这需要编写较多的代码,不如BeautifulSoup方便。
不过,可能用户是希望使用标准库中的html.parser而不安装其他库。这时候可能需要用html.parser结合其他方法,比如正则表达式,或者使用内置的模块如xml.etree.ElementTree来处理HTML?但通常处理HTML用BeautifulSoup更方便,而且引用[2]和[4]提到使用BeautifulSoup和正则表达式,所以可能用户希望用requests获取页面,然后用html.parser作为解析器,但结合BeautifulSoup?
这时候可能需要确认用户的具体需求,但根据问题描述,用户可能希望使用html.parser模块,而不是BeautifulSoup。这种情况下,可能需要用其他方式,比如正则表达式来提取数据,或者用html.parser的解析器。
但考虑到用户可能混淆了html.parser模块和BeautifulSoup的解析器类型,比如在BeautifulSoup中可以选择解析器为html.parser,这样可能更合理。例如,使用BeautifulSoup时指定parser='html.parser',这样就不需要安装lxml等其他解析库。这可能才是用户的实际需求,即使用requests获取页面,然后用BeautifulSoup配合html.parser来解析,而不是用第三方解析器如lxml。
所以,可能需要按照以下步骤:
1. 使用requests发送HTTP GET请求获取页面内容,注意设置UA头部,防止被豆瓣拒绝,如引用[4]提到的设置UA进行伪装。
2. 使用BeautifulSoup来解析HTML内容,并指定使用html.parser作为解析器,这样不需要安装额外的解析库。
3. 分析豆瓣Top250页面的HTML结构,找到每个电影项的容器,然后提取其中的标题、评分、评价人数、简介等信息。
4. 将提取的数据存入CSV文件,使用Python内置的csv模块来处理。
然后,用户可能还需要处理分页,但问题中只提到第一页,所以可能只需要处理第一页的URL,即https://movie.douban.com/top250?start=0。
此外,需要注意反爬机制,比如豆瓣可能会检查请求头中的Referer、User-Agent等,所以需要正确设置请求头,如引用[4]中提到的设置UA。
接下来,具体的代码步骤可能是:
导入必要的库:requests、csv、以及BeautifulSoup。
发送请求,获取页面内容:
url = 'https://movie.douban.com/top250?start=0'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) ...'}
response = requests.get(url, headers=headers)
然后检查响应状态码是否为200。
用BeautifulSoup解析内容:
soup = BeautifulSoup(response.text, 'html.parser')
找到所有电影项,根据页面结构,可能每个电影项都在class为'item'的div中:
items = soup.find_all('div', class_='item')
然后遍历每个item,提取信息:
对于每个item,标题可能在class为'title'的span中,比如<span class="title">标题</span>
评分在class为'rating_num'的span中,评价人数在class为'star'的span中的最后一个span,或者用正则表达式提取数字。
简介可能在class为'quote'的span中的class为'inq'的文本。
但需要具体查看页面结构,比如可能每个电影项的HTML结构大致如下:
<div class="item">
...
<span class="title">肖申克的救赎</span>
...
<div class="star">
<span class="rating_num">9.7</span>
<span>...人评价</span>
</div>
<span class="inq">希望让人自由。</span>
...
</div>
所以,具体提取方式可能需要根据实际HTML结构调整。比如:
标题:item.find('span', class_='title').text.strip()
评分:item.find('span', class_='rating_num').text.strip()
评价人数:item.find('div', class_='star').find_all('span')[-1].text.strip().replace('人评价', '')
简介:item.find('span', class_='inq').text.strip() if item.find('span', class_='inq') else ''
然后,将这些数据存储到列表中,再写入CSV文件。
最后,使用csv.writer来写入CSV文件,设置表头为['标题', '评分', '评价人数', '简介'],然后逐行写入数据。
需要注意的是,豆瓣可能有反爬措施,比如频繁请求会导致IP被封,所以需要设置适当的请求间隔,或者在代码中添加time.sleep()。但用户只需要第一页,所以可能问题不大。
总结步骤:
1. 导入库:requests, csv, BeautifulSoup。
2. 设置请求头和URL。
3. 发送请求,获取响应。
4. 解析HTML,提取数据。
5. 写入CSV文件。
可能遇到的问题:
- 豆瓣返回403 Forbidden,这时需要检查User-Agent是否正确设置。
- 提取数据时,某些字段可能不存在,比如有些电影可能没有简介,需要处理None的情况,避免程序崩溃。
- CSV写入时的编码问题,可能需要指定编码格式为utf-8-sig,以兼容Excel。
因此,代码的大致结构如下:
import requests
from bs4 import BeautifulSoup
import csv
url = 'https://movie.douban.com/top250?start=0'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'}
response = requests.get(url, headers=headers)
if response.status_code == 200:
soup = BeautifulSoup(response.text, 'html.parser')
items = soup.find_all('div', class_='item')
data = []
for item in items:
title = item.find('span', class_='title').text.strip()
rating = item.find('span', class_='rating_num').text.strip()
# 评价人数可能在class为star的div下的span中的最后一个元素
star_div = item.find('div', class_='star')
# 例如:<span>12345人评价</span>
# 使用find_all('span')获取所有span,然后取最后一个的文本
votes = star_div.find_all('span')[-1].text.strip().replace('人评价', '')
# 简介,可能不存在
inq = item.find('span', class_='inq')
summary = inq.text.strip() if inq else ''
data.append([title, rating, votes, summary])
# 写入CSV
with open('douban_top250.csv', 'w', newline='', encoding='utf-8-sig') as f:
writer = csv.writer(f)
writer.writerow(['标题', '评分', '评价人数', '简介'])
writer.writerows(data)
else:
print('请求失败,状态码:', response.status_code)
但需要验证这个代码是否有效,特别是选择器是否正确。比如,标题可能有多个span,比如中文标题和英文标题,可能需要处理。例如,豆瓣Top250的电影标题可能有多个span,比如:
<span class="title">肖申克的救赎</span>
<span class="title"> / The Shawshank Redemption</span>
<span class="other"> / 月黑高飞(港) / 刺激1995(台)</span>
所以,如果只取第一个span class="title",会得到中文标题,但可能还有其他标题。用户是否需要全部?根据引用[2]提到的需要电影标题,可能中文名和外国名,可能需要处理。但用户的问题可能只需要中文标题,所以可能取第一个class为title的span。
另外,评分部分是正确的,rating_num是正确的class。评价人数可能需要用正则表达式提取数字,比如:
评价人数的文本可能是“2000000人评价”,所以替换掉“人评价”即可得到数字。
简介部分,可能有的电影没有,所以在代码中做了处理。
此外,CSV的编码问题,使用utf-8-sig可以避免在Excel中打开时乱码。
现在,用户的问题提到要使用html.parser模块,而上述代码中的BeautifulSoup就是使用html.parser作为解析器,所以符合要求。
总结起来,这个代码应该可以完成任务,但需要注意实际HTML结构是否有变化,以及反爬措施。</think>以下是通过Python的`requests`库和`html.parser`解析豆瓣Top250首頁电影信息并导出至CSV的完整步骤:
---
### **步骤1:导入库**
```python
import requests
from bs4 import BeautifulSoup
import csv
```
---
### **步骤2:发送请求并获取HTML**
设置请求头伪装浏览器访问,避免被反爬拦截:
```python
url = "https://movie.douban.com/top250"
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(url, headers=headers)
```
---
### **步骤3:解析HTML并提取数据**
使用`html.parser`解析页面内容,提取电影标题、评分、评价人数和简介:
```python
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()
# 评价人数(通过正则提取数字)
votes = movie.find("div", class_="star").find_all("span")[-1].text.replace("人评价", "")
# 简介(部分电影可能缺失)
inq_tag = movie.find("span", class_="inq")
summary = inq_tag.text.strip() if inq_tag else "无简介"
data.append([title, rating, votes, summary])
```
---
### **步骤4:保存数据到CSV**
```python
with open("douban_top250.csv", "w", newline="", encoding="utf-8-sig") as file:
writer = csv.writer(file)
writer.writerow(["标题", "评分", "评价人数", "简介"])
writer.writerows(data)
```
---
### **注意事项**
1. **反爬机制**:豆瓣可能限制频繁请求,建议添加`time.sleep(2)`避免被封IP[^4]。
2. **字段扩展**:若需提取导演、年份等信息,需进一步解析其他标签[^2]。
3. **多页爬取**:修改URL参数`?start=25`可爬取第二页,循环遍历即可[^3]。
---
阅读全文
相关推荐



















