跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Python算法

Python 爬虫从零入门:豆瓣电影数据抓取实战指南

综述由AI生成Python 网络爬虫的基础概念与开发流程。内容涵盖环境搭建、依赖库安装、以及基于 urllib 和 BeautifulSoup 库实现的豆瓣 Top250 电影数据抓取实战。文章提供了完整的源代码,并对请求伪装、HTML 解析、正则匹配及数据保存(Excel)等关键步骤进行了逐行解析。此外,还补充了关于异常处理、Robots 协议遵守、爬取频率控制及现代替代方案(requests/pandas)的进阶建议,旨在帮助零基础学习者系统掌握爬虫技术并规范使用。

颠三倒四发布于 2025/2/6更新于 2026/6/221 浏览
Python 爬虫从零入门:豆瓣电影数据抓取实战指南

Python 爬虫从零入门:豆瓣电影数据抓取实战指南

1. 什么是网络爬虫

网络爬虫(Web Crawler),又称网页蜘蛛或网络机器人,是一种按照一定规则自动抓取互联网信息的程序。它模拟浏览器发送 HTTP 请求,接收服务器响应,并解析返回的数据。原则上,只要是浏览器能做的事情,爬虫理论上都能做。

在互联网大数据时代,信息获取虽然自由,但海量数据中往往夹杂着大量无效垃圾信息。通过爬虫技术收集相关内容并进行分析筛选,是获取精准有效信息的关键手段。该技术广泛应用于生活服务、出行旅行、金融投资及各类制造业的产品市场需求分析等领域。

2. 开发环境准备

虽然多种语言(如 PHP, Java, C#)均可用于爬虫开发,但 Python 因其语法简洁、库丰富且功能齐全,成为首选。

2.1 安装 Python

建议下载官方最新稳定版本(如 Python 3.8+)。安装时请注意勾选 "Add Python to PATH"。

2.2 代码编辑器

推荐使用 PyCharm 或 VS Code。PyCharm 对 Python 支持良好,适合大型项目;VS Code 轻量灵活。

2.3 依赖库安装

运行爬虫通常需要以下第三方库,可通过 pip 命令安装:

pip install beautifulsoup4 xlwt

*注:urllib 和 re 为 Python 标准库,无需额外安装。

核心库说明:*

  • BeautifulSoup: 网页解析,提取数据。
  • re: 正则表达式,进行复杂文本匹配。
  • urllib.request: 制定 URL,获取网页原始数据。
  • xlwt: 将数据写入 Excel 文件(旧版 .xls)。
  • sqlite3: 可选,用于本地数据库存储。

3. 项目实战:抓取豆瓣 Top250 电影

本项目目标是爬取豆瓣电影 Top250 的详细信息,包括:电影详情链接、图片链接、影片中文名、外国名、评分、评价数、概况及相关信息。

3.1 完整代码实现

# -*- coding: utf-8 -*-
from bs4 import BeautifulSoup
import re
import urllib.request
import urllib.error
import xlwt

# 定义正则表达式对象
findLink = re.compile(r'<a href="(.*?)">')
findImgSrc = re.compile(r'<img.*src="(.*?)"', re.S)
findTitle = re.compile(r'<span class="title">(.*)</span>')
findRating = re.compile(r'<span class="rating_num" property="v:average">(.*)</span>')
findJudge = re.compile(r'<span>(\d*)人评价</span>')
findInq = re.compile(r'<span class="inq">(.*)</span>')
findBd = re.compile(r'<p class="">(.*?)</p>', re.S)

def main():
    baseurl = "https://movie.douban.com/top250?start="
    # 1. 爬取网页
    datalist = getData(baseurl)
    savepath = "豆瓣电影 Top250.xls"
    # 2. 保存数据
    saveData(datalist, savepath)
    print("爬取完毕!")

def getData(baseurl):
    datalist = []
    for i in range(0, 10):  # 每页 25 条,共 10 页
        url = baseurl + str(i * 25)
        html = askURL(url)
        soup = BeautifulSoup(html, "html.parser")
        for item in soup.find_all('div', class_="item"):
            data = []
            item_str = str(item)
            
            # 提取链接
            link = re.findall(findLink, item_str)[0]
            data.append(link)
            
            # 提取图片
            imgSrc = re.findall(findImgSrc, item_str)[0]
            data.append(imgSrc)
            
            # 提取标题
            titles = re.findall(findTitle, item_str)
            if len(titles) == 2:
                ctitle = titles[0]
                otitle = titles[1].replace("/", "")
                data.append(ctitle)
                data.append(otitle)
            else:
                data.append(titles[0])
                data.append(' ')
            
            # 提取评分
            rating = re.findall(findRating, item_str)[0]
            data.append(rating)
            
            # 提取评价数
            judgeNum = re.findall(findJudge, item_str)[0]
            data.append(judgeNum)
            
            # 提取简介
            inq = re.findall(findInq, item_str)
            if len(inq) != 0:
                inq = inq[0].replace("。", "")
                data.append(inq)
            else:
                data.append(" ")
            
            # 提取相关信息
            bd = re.findall(findBd, item_str)[0]
            bd = re.sub('<br(\s+)?/>(\s+)?', "", bd)
            bd = re.sub('/', "", bd)
            data.append(bd.strip())
            
            datalist.append(data)
    return datalist

def askURL(url):
    head = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36"
    }
    request = urllib.request.Request(url, headers=head)
    html = ""
    try:
        response = urllib.request.urlopen(request)
        html = response.read().decode("utf-8")
    except urllib.error.URLError as e:
        if hasattr(e, "code"):
            print(f"错误代码:{e.code}")
        if hasattr(e, "reason"):
            print(f"错误原因:{e.reason}")
    return html

def saveData(datalist, savepath):
    book = xlwt.Workbook(encoding="utf-8", style_compression=0)
    sheet = book.add_sheet('豆瓣电影 Top250', cell_overwrite_ok=True)
    col = ("电影详情链接", "图片链接", "影片中文名", "影片外国名", "评分", "评价数", "概况", "相关信息")
    
    # 写入表头
    for i in range(0, 8):
        sheet.write(0, i, col[i])
    
    # 写入数据
    for i in range(0, 250):
        data = datalist[i]
        for j in range(0, 8):
            sheet.write(i + 1, j, data[j])
    
    book.save(savepath)

if __name__ == "__main__":
    main()

3.2 代码逻辑详解

第一步:构建请求与伪装身份

在 askURL 函数中,我们设置了 User-Agent 头部信息。如果不设置,某些网站会识别出这是脚本请求而非真实浏览器访问,从而拒绝服务(例如返回 HTTP 418 I'm a teapot 错误)。伪装成主流浏览器(如 Chrome)可以有效避免被反爬机制拦截。

第二步:解析 HTML 结构

使用 BeautifulSoup 加载网页源码后,通过 find_all 定位包含电影信息的 div.item 标签。随后结合正则表达式从字符串中提取具体字段。正则表达式模式需根据目标网页的实际 HTML 结构动态调整。

第三步:数据存储

本示例使用 xlwt 库将数据保存为 .xls 格式。若需处理更复杂的表格或新版 Excel,可考虑使用 openpyxl 或 pandas 库。此外,数据也可存入 SQLite 等本地数据库,便于后续查询与分析。

4. 进阶优化与注意事项

4.1 异常处理与重试机制

实际生产中,网络波动可能导致请求失败。建议在 askURL 中加入重试逻辑(Retry),当遇到超时或连接错误时自动重试几次。

4.2 遵守 Robots 协议

在编写爬虫前,务必检查目标网站的 robots.txt 文件(如 https://movie.douban.com/robots.txt),确认是否允许抓取该页面。尊重版权和网站规则是爬虫开发者的基本素养。

4.3 控制爬取频率

频繁请求会给服务器带来压力,甚至导致 IP 被封禁。建议在每次请求间加入 time.sleep() 延时,模拟人类操作节奏。

4.4 现代替代方案

虽然本教程使用标准库 urllib 教学原理,但在实际开发中,requests 库更为常用,其 API 设计更人性化。同时,数据分析阶段推荐使用 pandas 代替 xlwt,效率更高且支持更多格式。

5. 总结

本文详细讲解了 Python 爬虫的基础概念、环境搭建及一个完整的豆瓣电影数据抓取案例。通过掌握 urllib、BeautifulSoup 和正则表达式,读者可以构建自己的数据采集工具。记住,技术本身是中性的,请始终在法律和道德允许的范围内使用爬虫技术,保护用户隐私与数据安全。

目录

  1. Python 爬虫从零入门:豆瓣电影数据抓取实战指南
  2. 1. 什么是网络爬虫
  3. 2. 开发环境准备
  4. 2.1 安装 Python
  5. 2.2 代码编辑器
  6. 2.3 依赖库安装
  7. 3. 项目实战:抓取豆瓣 Top250 电影
  8. 3.1 完整代码实现
  9. -- coding: utf-8 --
  10. 定义正则表达式对象
  11. 3.2 代码逻辑详解
  12. 第一步:构建请求与伪装身份
  13. 第二步:解析 HTML 结构
  14. 第三步:数据存储
  15. 4. 进阶优化与注意事项
  16. 4.1 异常处理与重试机制
  17. 4.2 遵守 Robots 协议
  18. 4.3 控制爬取频率
  19. 4.4 现代替代方案
  20. 5. 总结
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • ElementUI 表格固定列遮挡滚动条的 CSS 修复方案
  • 利用 AI 工具快速构建电商系统核心模块(商品、购物车、订单)
  • MIT 电机混合扭矩模式控制详解
  • C++ STL 常用容器实战指南
  • C++ list 介绍及常用接口模拟实现
  • C++ 核心三基石:引用、内联与 nullptr 深度解析
  • 基于 WebGIS 与百度天气接口的复古天气预报系统构建
  • PHP 实现长轮询消息实时推送功能
  • Flutter for OpenHarmony 集成 dart_openai 接入 AI 大模型
  • Qwen3-VL-WEBUI 多模态工具快速生成电商素材方案
  • OpenClaw 接入 QVeris 实现 AI 实时数据查询
  • 操作系统智能助手 OS Copilot 新功能测评
  • 浏览器桌面通知功能从零实现指南
  • 大语言模型与图结构融合:推荐系统新兴范式
  • OpenClaw 接入飞书机器人与 Ollama 本地大模型实战
  • 基于 Copilot 的 VS Code 与 Android Studio Android 源码阅读方案
  • Meta Quest VR 开机无法自动重连 WiFi 的解决方法
  • 渗透测试人员必备工具:Kali Linux、Nmap、Metasploit 等 10 款核心软件详解
  • GPEN 批量处理断点续传功能设计与实现
  • 滑动窗口与哈希表实战:串联所有单词子串与最小覆盖子串

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online