Python爬虫零基础入门:环境搭建与第一个抓取程序

阿麦
阿麦
发布时间:2026-10-29| 10人浏览过
原创

面向零基础读者的Python网络爬虫入门教程,涵盖运行原理、虚拟环境搭建、依赖库安装、第一个抓取脚本编写、数据解析及常见报错排查。

网络爬虫的核心任务是模拟客户端向指定服务器发送网络请求,获取目标网页的源码,并从中提取出有价值的数据。本文面向没有爬虫开发经验的读者,通过标准步骤完成 Python 运行环境的准备,安装核心库,编写并运行一个最小可用的网页抓取脚本,同时理清基础排错机制与合规边界。

一、网络爬虫的核心机制与请求交互

日常在浏览器中输入网址并按下回车时,浏览器会向目标服务器发送一个 HTTP GET 请求;服务器收到请求后返回对应的 HTML 网页代码,浏览器再将其渲染成图文并茂的页面。网络爬虫本质上是用程序替代人工操作,自动执行“发送请求 — 接收响应 — 提取数据”这套流程。

在这个过程中,Python 脚本扮演客户端角色。目标服务器并不直接感知背后是人还是代码,只要请求头、参数和行为特征符合 HTTP 协议规范,服务器就会如常返回网页源码。爬虫程序的关键步骤在于拿到响应文本后,通过文档对象模型(DOM)快速定位目标标签,截取所需字段。

Python爬虫零基础入门:环境搭建与第一个抓取程序
图1:网络爬虫的基本请求与响应闭环

二、开发环境搭建与基础依赖安装

编写爬虫前,需要保证操作系统中安装了 Python(建议 3.8 及以上版本),并在独立的虚拟环境中管理第三方库,防止不同项目的依赖版本相互干扰。

1. 确认 Python 与 pip 安装状态

打开终端(Windows 系统使用 PowerShell 或 CMD,macOS/Linux 使用 Terminal),执行以下命令验证 Python 版本:

python --version
pip --version

如果输出类似 Python 3.10.x 以及 pip 23.x,说明基础解释器与包管理工具已正常可用。

2. 创建隔离的工作虚拟环境

为当前项目新建一个独立的目录,并在其中创建名为 venv 的虚拟环境:

# 创建并进入项目目录
mkdir crawler_demo
cd crawler_demo

# 创建虚拟环境
python -m venv venv

# 激活虚拟环境 (Windows PowerShell)
.\venv\Scripts\Activate.ps1

# 激活虚拟环境 (macOS / Linux)
source venv/bin/activate

3. 安装核心抓取与解析依赖

入门阶段推荐使用两个经典的第三方库:

  • requests:专门负责发送 HTTP 网络请求,相比 Python 内置的 urllib,语法更加直观简炼。
  • beautifulsoup4:用于从返回的 HTML 文本中解析标签、提取文本与属性,适合处理静态网页结构。
pip install requests beautifulsoup4
Python爬虫零基础入门:环境搭建与第一个抓取程序
图2:从零准备 Python 爬虫运行环境

4. 导入测试与连通性验证

安装完成后,在终端中直接运行一行命令检验安装结果:

python -c "import requests, bs4; print('依赖环境安装就绪')"

若屏幕打印出 依赖环境安装就绪 且无报错退出,说明基础运行环境已经完全就绪。

三、编写第一个抓取程序:从抓取到解析

为便于合规学习与稳定复现,本文选用专为爬虫教学设计的合规站点 quotes.toscrape.com 作为目标。该站点展示名言名句,结构清晰,非常适合用来掌握提取规则。

1. 目标网页结构拆解

在浏览器中右键审查元素,可以看到每一条名言都包含在一个类名为 quote 的 <div> 容器内。名言文本在 <span class="text"> 中,作者名字在 <small class="author"> 中。

Python爬虫零基础入门:环境搭建与第一个抓取程序
图3:HTML 源码节点到 Python 字典结构的数据抽取模型

2. 编写完整抓取脚本

在项目目录中新建名为 first_crawler.py 的文件,写入以下完整代码:

import requests
from bs4 import BeautifulSoup

def crawl_quotes():
    # 1. 目标地址
    url = "https://quotes.toscrape.com/"
    
    # 2. 设置合法的 User-Agent 请求头,表明客户端身份
    headers = {
        "User-Agent": (
            "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
            "AppleWebKit/537.36 (KHTML, like Gecko) "
            "Chrome/118.0.0.0 Safari/537.36"
        )
    }
    
    try:
        # 3. 发送网络请求,设置超时时间为 10 秒
        response = requests.get(url, headers=headers, timeout=10)
        
        # 4. 检查 HTTP 状态码,若非 200 会主动抛出异常
        response.raise_for_status()
        
        # 显式指定编码,防止中文字符解析乱码
        response.encoding = response.apparent_encoding
        
        # 5. 实例化 BeautifulSoup 对象
        soup = BeautifulSoup(response.text, "html.parser")
        
        # 6. 查询所有包含 quote 类名的 div 块
        quote_elements = soup.find_all("div", class_="quote")
        print(f"成功抓取网页,共找到 {len(quote_elements)} 条名言内容:\n")
        
        # 7. 遍历解析单个块中的文本与作者
        results = []
        for index, item in enumerate(quote_elements, start=1):
            text_el = item.find("span", class_="text")
            author_el = item.find("small", class_="author")
            
            # 安全取值,避免某些页面缺少字段导致空指针异常
            quote_text = text_el.get_text(strip=True) if text_el else "无内容"
            author = author_el.get_text(strip=True) if author_el else "未知作者"
            
            results.append({"author": author, "text": quote_text})
            print(f"[{index}] {author}: {quote_text}")
            
        return results

    except requests.exceptions.Timeout:
        print("错误:请求目标站点超时,请检查网络连接状态。")
    except requests.exceptions.HTTPError as err:
        print(f"错误:HTTP 响应状态码异常 - {err}")
    except requests.exceptions.RequestException as err:
        print(f"错误:请求发生未预期异常 - {err}")
    return []

if __name__ == "__main__":
    crawl_quotes()

3. 执行脚本与输出验证

在终端中直接执行:

python first_crawler.py

终端中将输出提取到的名言内容(示例输出格式如下):

成功抓取网页,共找到 10 条名言内容:

[1] Albert Einstein: “The world as we have created it is a process of our thinking. It cannot be changed without changing our thinking.”
[2] J.K. Rowling: “It is our choices, Harry, that show what we truly are, far more than our abilities.”
[3] Albert Einstein: “There are only two ways to live your life. One is as though nothing is a miracle. The other is as though everything is a miracle.”
...

四、新手常见报错与关键防坑措施

初学者在编写爬虫时经常遇到请求被拒或程序崩溃的情况。理解以下四点可以解决绝大部分入门阻碍:

现象 / 报错 核心产生原因 直接解决措施
HTTP 403 Forbidden 服务器检测到 Python 默认的 User-Agent: python-requests/x.x 并直接拦截。 在 requests.get() 中传入包含主流浏览器标识的 headers 字典。
AttributeError: 'NoneType' object has no attribute 'get_text' 网页上某个选择器没有匹配到标签,find() 返回了 None,直接调用方法导致崩溃。 先判断对象是否为 None,或改用 item.find(...) if ... else ... 三元条件判断。
抓取内容为乱码(如出现问号或乱字符) 网页实际编码(如 GBK、GB2312)与 response.text 默认解码方式不一致。 在读取 text 前添加 response.encoding = response.apparent_encoding。
脚本运行长时间无响应并卡住 目标服务器无响应或网络丢包,且请求未设置超时上限。 调用时务必显式传入超时限制:requests.get(url, timeout=10)。
注意:网络请求务必使用 try...except 包裹 requests.exceptions.RequestException。任何网络环境都存在不可控的波动,避免脚本因为单次网络错误导致整个运行中断。

五、知识梳理与爬虫合规建议

完成环境搭建和第一个抓取程序只是爬虫学习的起点。在后续编写更复杂的抓取逻辑时,需要牢记三项基本准则:

  • 遵守目标站点的 robots.txt:多数网站在根目录设有 /robots.txt,明确声明了允许与禁止爬取的路径。
  • 限制并发与请求频率:切勿使用死循环高频请求服务器。每次请求间使用 time.sleep(1) 适当休眠,避免对目标服务器造成过大负载。
  • 尊重隐私与数据安全:严禁抓取涉及个人隐私、用户凭据、商业未公开数据或破坏系统鉴权的内容。
Python爬虫零基础入门:环境搭建与第一个抓取程序
图4:从基础抓取到工程化进阶的完整知识脉络
相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。