新手必看!Python爬虫零基础入门:爬取豆瓣Top250电影(逐行解析代码)
Win64;BASE_URL:豆瓣Top250的基础网址,后续拼接分页参数即可访问不同页面;HEADERS:请求头,核心是User-Agent,告诉豆瓣服务器“我是浏览器,不是爬虫”,避免被拦截(新手可直接复制这个UA,无需修改);all_movies:空列表,用于存储所有爬取到的电影数据,相当于“数据仓库”。start= {:定义函数,
关键词:Python爬虫零基础、豆瓣Top250爬取、逐行解析代码、爬虫入门实战、BeautifulSoup使用
创作声明:本文专为Python爬虫新手打造,从环境搭建到代码实现,逐行解析爬取豆瓣Top250电影的完整流程,全程避开复杂概念,用最通俗的语言和最基础的代码,让零基础的你也能轻松掌握爬虫核心逻辑,最终得到结构化的电影数据并保存为Excel。
一、核心需求复述
你希望从零开始学习Python爬虫,核心目标是通过爬取豆瓣Top250电影这个经典入门案例,理解爬虫的基本原理、HTTP请求、页面解析、数据提取与保存的完整流程,并且通过逐行解析代码,掌握每一行代码的作用和意义,为后续学习更复杂的爬虫打下基础。
二、爬取前准备(零基础友好版)
1. 为什么选豆瓣Top250?
- 反爬机制弱:豆瓣Top250页面结构清晰,无复杂验证码、加密接口,适合新手;
- 数据结构化:电影排名、名称、评分、简介等信息位置固定,易提取;
- 实用性强:爬取的数据可用于后续数据分析、可视化等拓展学习。
2. 技术栈选型(仅用基础库)
| 工具/库 | 核心作用 | 零基础说明 |
|---|---|---|
| requests | 发送HTTP请求,获取网页源码 | Python最基础的请求库,语法简单 |
| BeautifulSoup4 | 解析HTML页面,提取目标数据 | 专门用于网页解析的入门级库,易上手 |
| pandas | 数据整理并保存为Excel(可选) | 新手可先保存为TXT,后续再学Excel保存 |
3. 环境安装(复制即用)
打开电脑的命令提示符(CMD)/终端,输入以下命令安装依赖:
# 安装核心库(一行命令搞定)
pip install requests==2.31.0 beautifulsoup4==4.12.3 pandas==2.2.2
新手提示:如果提示“pip不是内部命令”,说明Python未添加到系统环境变量,可重新安装Python并勾选“Add Python to PATH”。
4. 前置知识(零基础必看)
- 爬虫基本逻辑:模拟浏览器向网站服务器发送请求 → 服务器返回网页源码 → 解析源码提取目标数据 → 保存数据;
- 豆瓣Top250页面规律:
- 基础URL:
https://movie.douban.com/top250 - 分页参数:第1页
?start=0、第2页?start=25、第3页?start=50(每页25条,start=页数×25-25)。
- 基础URL:
三、完整代码+逐行解析(核心环节)
1. 完整代码(可直接复制运行)
# 第一步:导入需要的库
import requests
from bs4 import BeautifulSoup
import pandas as pd
# 第二步:定义全局变量(方便后续修改)
# 豆瓣Top250基础URL
BASE_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/120.0.0.0 Safari/537.36"
}
# 存储所有电影数据的列表
all_movies = []
# 第三步:定义函数,爬取单页数据
def crawl_single_page(start):
"""
爬取单页豆瓣Top250电影数据
:param start: 分页参数,如0、25、50
"""
# 构造当前页的URL
url = f"{BASE_URL}?start={start}&filter="
try:
# 发送GET请求,获取网页源码
response = requests.get(url, headers=HEADERS)
# 设置编码为utf-8,避免中文乱码
response.encoding = "utf-8"
# 检查请求是否成功(状态码200表示成功)
if response.status_code == 200:
# 用BeautifulSoup解析网页源码
soup = BeautifulSoup(response.text, "html.parser")
# 提取所有电影条目(每个条目对应一个电影)
movie_items = soup.find_all("div", class_="item")
# 遍历每个电影条目,提取详细信息
for item in movie_items:
# 1. 提取排名(如1、2、3)
rank = item.find("em", class_="").text
# 2. 提取电影名称(如《肖申克的救赎》)
title = item.find("span", class_="title").text
# 3. 提取评分(如9.7)
score = item.find("span", class_="rating_num").text
# 4. 提取评价人数(如189万人评价)
comment_num = item.find("span", class_="").text.split("人评价")[0].strip()
# 5. 提取简介(如导演、主演、类型等)
intro = item.find("p", class_="").text.strip().replace("\n", "").replace(" ", " ")
# 将提取的数据存入字典
movie_info = {
"排名": rank,
"电影名称": title,
"评分": score,
"评价人数": comment_num,
"简介": intro
}
# 将字典添加到总列表
all_movies.append(movie_info)
print(f"第{start//25 + 1}页数据爬取完成!")
else:
print(f"请求失败,状态码:{response.status_code}")
except Exception as e:
print(f"爬取第{start//25 + 1}页时出错:{e}")
# 第四步:批量爬取所有页面(共10页,250条数据)
if __name__ == "__main__":
# 遍历10页,start从0到225,步长25
for start in range(0, 250, 25):
crawl_single_page(start)
# 第五步:保存数据(两种方式,新手可选其一)
# 方式1:保存为TXT文件(最简单)
with open("豆瓣Top250电影.txt", "w", encoding="utf-8") as f:
for movie in all_movies:
f.write(f"排名:{movie['排名']} | 名称:{movie['电影名称']} | 评分:{movie['评分']}\n")
# 方式2:保存为Excel文件(更实用,推荐)
df = pd.DataFrame(all_movies)
df.to_excel("豆瓣Top250电影.xlsx", index=False)
print(f"全部数据爬取完成!共{len(all_movies)}条,已保存为文件。")
2. 逐行解析(零基础吃透每一行)
(1)导入库环节
import requests
from bs4 import BeautifulSoup
import pandas as pd
import requests:导入请求库,作用是模拟浏览器向豆瓣服务器发送请求,获取网页内容;from bs4 import BeautifulSoup:从bs4库中导入解析模块,作用是把杂乱的网页源码转换成可提取数据的结构;import pandas as pd:导入pandas库并简写为pd,作用是后续将数据保存为Excel(新手可先注释这行,只学TXT保存)。
(2)定义全局变量环节
BASE_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/120.0.0.0 Safari/537.36"
}
all_movies = []
BASE_URL:豆瓣Top250的基础网址,后续拼接分页参数即可访问不同页面;HEADERS:请求头,核心是User-Agent,告诉豆瓣服务器“我是浏览器,不是爬虫”,避免被拦截(新手可直接复制这个UA,无需修改);all_movies:空列表,用于存储所有爬取到的电影数据,相当于“数据仓库”。
(3)定义爬取单页函数环节
def crawl_single_page(start):
url = f"{BASE_URL}?start={start}&filter="
def crawl_single_page(start)::定义函数,start是参数,代表分页的起始值(如0对应第1页,25对应第2页);url = f"{BASE_URL}?start={start}&filter=":拼接当前页的完整URL,比如start=0时,URL就是https://movie.douban.com/top250?start=0&filter=。
response = requests.get(url, headers=HEADERS)
response.encoding = "utf-8"
requests.get(url, headers=HEADERS):发送GET请求,url是目标地址,headers是请求头,返回的response就是服务器返回的内容;response.encoding = "utf-8":强制设置编码为utf-8,解决中文乱码问题(新手必加,否则爬取的中文会变成“???”)。
if response.status_code == 200:
soup = BeautifulSoup(response.text, "html.parser")
movie_items = soup.find_all("div", class_="item")
response.status_code == 200:状态码200表示请求成功,其他状态码(如403、500)表示失败;BeautifulSoup(response.text, "html.parser"):把网页源码(response.text)转换成BeautifulSoup对象,html.parser是Python内置的解析器,无需额外安装;soup.find_all("div", class_="item"):提取所有class="item"的div标签,每个标签对应一部电影的完整信息(新手提示:class_加下划线是因为class是Python关键字,避免冲突)。
for item in movie_items:
rank = item.find("em", class_="").text
title = item.find("span", class_="title").text
score = item.find("span", class_="rating_num").text
comment_num = item.find("span", class_="").text.split("人评价")[0].strip()
intro = item.find("p", class_="").text.strip().replace("\n", "").replace(" ", " ")
for item in movie_items::遍历每一个电影条目;item.find("em", class_="").text:在当前电影条目中找到em标签(无class),.text提取标签内的文字,即电影排名;item.find("span", class_="title").text:提取电影名称(核心名称,无外文);item.find("span", class_="rating_num").text:提取评分;comment_num:提取评价人数,先找到对应标签的文字,用split("人评价")分割,取前面的数字部分,strip()去除空格;intro:提取简介,replace("\n", "")去掉换行符,replace(" ", " ")去掉多余空格,让简介更整洁。
movie_info = {
"排名": rank,
"电影名称": title,
"评分": score,
"评价人数": comment_num,
"简介": intro
}
all_movies.append(movie_info)
- 把提取的单个电影数据存入字典(键值对形式,方便后续读取);
all_movies.append(movie_info):把单个电影数据添加到总列表,逐步积累250条数据。
(4)批量爬取+保存数据环节
if __name__ == "__main__":
for start in range(0, 250, 25):
crawl_single_page(start)
if __name__ == "__main__"::Python入口函数,代码从这里开始执行;range(0, 250, 25):生成0、25、50…225的序列,对应10页数据,每次调用crawl_single_page爬取一页。
# 方式1:保存为TXT
with open("豆瓣Top250电影.txt", "w", encoding="utf-8") as f:
for movie in all_movies:
f.write(f"排名:{movie['排名']} | 名称:{movie['电影名称']} | 评分:{movie['评分']}\n")
# 方式2:保存为Excel
df = pd.DataFrame(all_movies)
df.to_excel("豆瓣Top250电影.xlsx", index=False)
- 方式1:用Python内置的文件操作保存为TXT,
encoding="utf-8"避免中文乱码,\n换行; - 方式2:用pandas把列表转换成DataFrame,
to_excel保存为Excel,index=False不保存行号(新手提示:如果报错,检查pandas是否安装成功)。
四、运行结果与验证(新手必看)
1. 运行代码
- 把代码复制到PyCharm/VS Code/IDLE中,直接运行;
- 控制台会输出:
第1页数据爬取完成!第2页数据爬取完成!… 最终输出全部数据爬取完成!共250条,已保存为文件。; - 代码所在文件夹会生成两个文件:
豆瓣Top250电影.txt和豆瓣Top250电影.xlsx。
2. 验证数据
- TXT文件内容示例:
排名:1 | 名称:肖申克的救赎 | 评分:9.7 排名:2 | 名称:霸王别姬 | 评分:9.6 排名:3 | 名称:阿甘正传 | 评分:9.5 - Excel文件会包含“排名、电影名称、评分、评价人数、简介”5列,250行完整数据。
五、新手常见问题与解决(避坑指南)
| 问题现象 | 原因分析 | 解决方案 |
|---|---|---|
| 运行报错“ModuleNotFoundError” | 未安装对应的库 | 重新执行pip install requests beautifulsoup4 pandas,确保命令行无报错 |
| 中文乱码 | 未设置编码或编码错误 | 必加response.encoding = "utf-8",保存文件时指定encoding="utf-8" |
| 请求失败,状态码403 | User-Agent未设置或被识别为爬虫 | 复制代码中的HEADERS,或更换新的User-Agent(可百度“Chrome User-Agent”) |
| 爬取的数据少于250条 | 分页逻辑错误或请求频率过快 | 检查range(0, 250, 25)是否正确,可在循环中添加time.sleep(1)(需导入time) |
| Excel保存报错 | 缺少openpyxl依赖 | 执行pip install openpyxl(pandas保存Excel需要这个依赖) |
六、零基础拓展(巩固学习)
1. 小修改:添加电影类型提取
在提取简介后,新增一行代码提取电影类型(新手可尝试):
# 从简介中提取类型(示例:简介中包含“剧情/犯罪”)
type_str = intro.split("类型:")[-1].split("片长:")[0].strip()
# 把类型添加到字典
movie_info["类型"] = type_str
2. 小优化:添加请求延迟
避免高频请求被豆瓣限制,在crawl_single_page函数中添加延迟:
import time # 先导入time库
time.sleep(1) # 每次爬取一页后暂停1秒
3. 拓展学习方向
- 学习
find和find_all的区别:find返回第一个匹配的标签,find_all返回所有匹配的标签; - 学习XPath解析:替代BeautifulSoup的另一种解析方式,适合复杂页面;
- 学习数据可视化:用matplotlib把评分前10的电影做成柱状图。
七、总结(核心要点回顾)
1. 爬虫核心流程
新手只需记住:发送请求(requests)→ 解析页面(BeautifulSoup)→ 提取数据 → 保存数据,这是所有爬虫的基础逻辑。
2. 新手必掌握的关键点
- 必须设置
User-Agent和编码,避免被拦截和乱码; - 用
find/find_all提取标签,.text提取文字; - 数据先存入列表/字典,再批量保存,避免频繁文件操作。
3. 学习价值
豆瓣Top250是爬虫入门的“敲门砖”,掌握这个案例后,你可以举一反三爬取豆瓣图书Top250、IMDB电影榜等类似页面,为后续学习反爬绕过、异步爬虫打下基础。
这套教程全程避开复杂概念,逐行解析每一段代码,零基础的你只需跟着步骤操作,就能快速实现第一个爬虫项目,真正做到“入门即上手”。
更多推荐



所有评论(0)