如何用 Python 爬取豆瓣电影 Top 250?
前言
豆瓣电影 Top 250 是影迷们寻找经典好片的常用榜单。作为 Python 爱好者,我们可以利用 Python 爬虫 技术将该榜单的所有电影标题抓取下来,并在本地保存或分析。本文将详细介绍如何实现这个目标。
1. 工具与环境
在实现爬取的过程中,我们主要会用到以下工具:
- Python 3.x:主语言。
- requests 库:用于发送 HTTP 请求。
- BeautifulSoup4 库:用于解析网页内容。
- 豆瓣 Top 250 页面:分页展示电影榜单,每页 25 条,共 10 页。
2. 爬虫实现步骤
2.1 页面结构分析
打开 豆瓣电影 Top 250 页面,按 F12 查看网页源代码:
- 每个电影标题包含在:
<span class="title">电影名称</span>
- 每页显示 25 部电影,共 10 页,URL 格式如下:
https://movie.douban.com/top250?start=0 https://movie.douban.com/top250?start=25 https://movie.douban.com/top250?start=50 ...
2.2 爬虫代码
下面是完整的代码,包含分页爬取、标题提取和去重处理:
from bs4 import BeautifulSoup
import requests
# 设置请求头,模拟浏览器访问
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36"
}
# 电影标题列表
all_movies = []
# 逐页爬取,每页 25 条,总共 10 页
for page in range(10):
url = f"https://movie.douban.com/top250?start={page * 25}"
response = requests.get(url, headers=headers)
# 确保请求成功
if response.status_code == 200:
content = response.text
soup = BeautifulSoup(content, "html.parser")
# 提取标题并过滤外文名
titles = soup.findAll("span", attrs={"class": "title"})
for link in titles:
title = link.text
if "/" not in title: # 过滤掉外文名
all_movies.append(title)
else:
print(f"请求失败,状态码: {response.status_code}, 页面: {url}")
break
# 输出所有电影标题
for idx, movie in enumerate(all_movies, 1):
print(f"{idx}. {movie}")
# 验证数量
print(f"\n总共爬取到 {len(all_movies)} 部电影")
3. 代码解析
-
设置请求头
模拟浏览器访问,防止网站反爬机制拦截请求:headers = { "User-Agent": "Mozilla/5.0 ..." }
-
分页请求
通过循环逐页爬取,每次请求对应页面:for page in range(10): url = f"https://movie.douban.com/top250?start={page * 25}"
-
HTML 解析
使用BeautifulSoup
提取所有包含电影标题的<span>
标签:titles = soup.findAll("span", attrs={"class": "title"})
-
去除外文名
豆瓣的标题中有时包含外文名(例如:肖申克的救赎 / The Shawshank Redemption),通过简单判断过滤掉:if "/" not in title: all_movies.append(title)
-
结果输出
打印所有电影标题,并验证爬取数量是否正确。
4. 运行结果
运行代码后,会输出类似以下结果:
1. 肖申克的救赎
2. 霸王别姬
3. 阿甘正传
4. 这个杀手不太冷
5. 美丽人生
...
250. 教父2
总共爬取到 250 部电影
5. 注意事项
-
反爬机制:
- 添加 User-Agent 头部信息,模拟正常用户访问。
- 若请求频繁,建议增加访问间隔,例如
time.sleep(1)
。
-
HTML 结构变化:
豆瓣可能随时更新页面结构,需要重新检查标签选择器。 -
数据存储:
爬取的数据可存储为文件,如 CSV、TXT、JSON 格式,便于后续分析。
6. 进阶优化
- 多线程爬取:使用多线程提高爬取速度。
- 数据存储:将结果保存到数据库(如 SQLite)。
- 图表分析:用 Matplotlib 绘制电影排名分析图。
总结
通过本文的学习,你已掌握了如何使用 Python 和 BeautifulSoup 爬取豆瓣电影 Top 250 榜单。这不仅帮助你加深了对网页爬虫的理解,也为进一步数据分析和项目开发打下了基础。
如果你感兴趣,可以尝试扩展爬取电影的评分、简介、导演等信息,做更深入的数据分析。
代码已提供,动手实践是最好的学习方式! 🚀
如果喜欢这篇博客,请点赞、分享或者留言交流!😊