关键词: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)。

三、完整代码+逐行解析(核心环节)

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. 拓展学习方向

  • 学习findfind_all的区别:find返回第一个匹配的标签,find_all返回所有匹配的标签;
  • 学习XPath解析:替代BeautifulSoup的另一种解析方式,适合复杂页面;
  • 学习数据可视化:用matplotlib把评分前10的电影做成柱状图。

七、总结(核心要点回顾)

1. 爬虫核心流程

新手只需记住:发送请求(requests)→ 解析页面(BeautifulSoup)→ 提取数据 → 保存数据,这是所有爬虫的基础逻辑。

2. 新手必掌握的关键点

  • 必须设置User-Agent和编码,避免被拦截和乱码;
  • find/find_all提取标签,.text提取文字;
  • 数据先存入列表/字典,再批量保存,避免频繁文件操作。

3. 学习价值

豆瓣Top250是爬虫入门的“敲门砖”,掌握这个案例后,你可以举一反三爬取豆瓣图书Top250、IMDB电影榜等类似页面,为后续学习反爬绕过、异步爬虫打下基础。

这套教程全程避开复杂概念,逐行解析每一段代码,零基础的你只需跟着步骤操作,就能快速实现第一个爬虫项目,真正做到“入门即上手”。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐