Python爬虫零基础入门:环境搭建与第一个网页抓取示例

星野
星野
发布时间:2026-10-31| 9人浏览过
原创

面向初学者的Python网络爬虫入门教程,系统讲解爬虫工作机制、虚拟环境配置、必备库安装,并提供完整且可运行的网页抓取示例与常见问题排查方案。

网络爬虫本质上是一套自动发送网络请求、接收服务响应并从中提取目标信息的程序脚本。本文将从零开始带你配置 Python 爬虫开发环境,安装主流抓取与解析组件,并通过一个可以直接运行的实例抓取网页标题和结构化文本,帮助你建立清晰的爬虫运行逻辑与排错经验。

一、网络爬虫的核心工作机制

在编写代码之前,需要理解浏览器与网站服务器交互的实质过程。当你在浏览器输入网址并回车时,浏览器会向目标服务器发送一个 HTTP 请求(Request),服务器处理完成后返回对应的 HTTP 响应(Response),其中通常包含页面的 HTML 源代码。浏览器负责将这些源代码渲染成可视化的网页画面。

Python 爬虫则是用程序模拟浏览器的请求过程。爬虫的工作闭环通常包含三个环节:通过网络请求模块(如 requests)获取服务器返回的原始 HTML 文本;使用文本解析器(如 BeautifulSoup)从庞大的 DOM 节点中精准定位目标元素;最后将获取到的标题、正文、链接等数据清洗并持久化存储。

Python爬虫零基础入门:环境搭建与第一个网页抓取示例
图 1:网络爬虫的基本工作机制与 HTTP 请求/响应数据流模型

二、开发环境搭建与必备库安装

要编写 Python 爬虫,必须具备 Python 解释器以及专门处理网络通信与 HTML 解析的第三方库。建议在独立的虚拟环境中进行开发,避免不同项目依赖版本冲突。

1. 确认 Python 解释器环境

打开系统的命令行终端(Windows 用户打开 PowerShell 或 CMD,macOS/Linux 用户打开 Terminal),输入以下命令检查 Python 版本:

python3 --version
# 或在部分 Windows 环境中直接执行
python --version

终端应返回形如 Python 3.10.x 或更高版本的字样。若未检测到命令,需先从 Python 官方网站下载并安装 3.8 及以上版本,安装时务必勾选“Add Python to PATH”。

2. 创建并激活虚拟环境

在你的工作目录下,创建一个名为 crawler_env 的独立虚拟环境,并将其激活:

# 创建工作目录并进入
mkdir my_first_spider && cd my_first_spider

# 创建虚拟环境
python3 -m venv crawler_env

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

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

当命令行提示符前出现 (crawler_env) 标识时,说明虚拟环境已经激活成功。

3. 安装基础网络爬虫依赖库

初学者最常使用的核心组合是 requests 与 beautifulsoup4。前者负责网络请求,后者负责标签解析:

pip install requests beautifulsoup4

安装完成后,可在终端进入 Python 交互界面测试是否安装成功:

python -c "import requests, bs4; print('环境准备就绪,requests版本:', requests.__version__)"
Python爬虫零基础入门:环境搭建与第一个网页抓取示例
图 2:Python 爬虫开发环境搭建与工具链验证全流程

三、第一个网页抓取示例:从请求到解析

在入门练习时,推荐使用专为网络测试设计的标准网页,如国际公认的 http://example.com/。该网页结构精炼、网络稳定且无繁杂的防爬策略,非常适合用来验证爬虫完整流程。

1. 完整示例代码

在工作目录下新建一个名为 first_spider.py 的文件,输入以下完整代码:

import requests
from bs4 import BeautifulSoup

def fetch_example_page():
    # 1. 确定目标 URL
    target_url = "http://example.com/"

    # 2. 构造基础请求头,标明标准浏览器身份
    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"
        )
    }

    print(f"[正在发送请求] 目标网址: {target_url}")

    try:
        # 3. 发送 GET 请求,设置 10 秒超时
        response = requests.get(target_url, headers=headers, timeout=10)

        # 4. 检查 HTTP 状态码
        print(f"[响应状态] 状态码: {response.status_code}")
        if response.status_code != 200:
            print(f"[错误] 服务器返回异常状态码: {response.status_code}")
            return

        # 5. 确保编码解析正确
        response.encoding = response.apparent_encoding

        # 6. 使用 BeautifulSoup 解析 HTML 文本
        soup = BeautifulSoup(response.text, "html.parser")

        # 7. 提取页面核心数据
        page_title = soup.title.string.strip() if soup.title else "未找到标题"
        h1_text = soup.find("h1").text.strip() if soup.find("h1") else "未找到h1"
        first_p_text = soup.find("p").text.strip() if soup.find("p") else "未找到段落"

        print("\n======== 抓取结果 ========")
        print(f"页面 title 标签内容 : {page_title}")
        print(f"正文 h1 标签内容    : {h1_text}")
        print(f"首个 p 标签内容     : {first_p_text}")
        print("==========================\n")

    except requests.exceptions.Timeout:
        print("[错误] 请求超时,请检查网络连接。")
    except requests.exceptions.RequestException as err:
        print(f"[网络请求错误] {err}")

if __name__ == "__main__":
    fetch_example_page()

2. 运行脚本与示例输出

在激活了虚拟环境的终端中执行该脚本:

python first_spider.py

当网络畅通时,控制台将显示类似以下的示例输出:

[示例输出]
[正在发送请求] 目标网址: http://example.com/
[响应状态] 状态码: 200

======== 抓取结果 ========
页面 title 标签内容 : Example Domain
正文 h1 标签内容    : Example Domain
首个 p 标签内容     : This domain is for use in illustrative examples in documents. You may use this domain in literature without prior coordination or asking for permission.
==========================
Python爬虫零基础入门:环境搭建与第一个网页抓取示例
图 3:代码执行阶段、数据流转与核心方法拆解

四、常见问题排查与注意事项

在实际抓取不同网站时,初学者往往会遇到请求被拒、页面乱码或内容为空等情况。以下为三类最基础也最核心的问题排查方案:

1. HTTP 403 Forbidden 错误

现象:response.status_code 返回 403,终端提示无权限或拒绝访问。
原因:许多网站为了防止恶意刷量,会默认拦截没有携带标准浏览器 User-Agent 头的请求。如果不传递 headers 参数,requests 默认携带的标识为 python-requests/x.x.x,会被服务器识别并直接封锁。
解决:在请求时始终添加规范的 headers 字典,至少包含常见的操作系统与现代浏览器 User-Agent 字符串。

2. 中文页面乱码问题

现象:抓取到的中文内容显示为 一 或乱码字符(如 实例)。
原因:requests 默认通过 HTTP 标头推测编码,有时推测不准(例如服务器未标明 charset 时默认为 ISO-8859-1)。
解决:在读取 response.text 前加入自动编码推断:response.encoding = response.apparent_encoding,或者在已知目标站点编码时显式赋值 response.encoding = 'utf-8' 或 'gbk'。

3. soup.find() 返回 None 报错 AttributeError

现象:执行 soup.find("h1").text 时报 AttributeError: 'NoneType' object has no attribute 'text'。
原因:页面中可能没有该标签,或者页面内容是通过 JavaScript 异步加载渲染的(单页面应用 SPA),导致 requests 获取的静态源码中并不包含目标元素。
解决:在取值前先判断节点是否存在,或通过浏览器右键“查看网页源代码”(非检查元素)确认目标数据是否包含在原始 HTML 中。如果为异步加载,需切换为抓取底层接口或借助浏览器自动化工具。

五、规范总结与进阶检查清单

编写爬虫不仅要关注技术实现,更要遵守技术规范与网络礼仪。规范的爬虫设计有助于保证程序长期稳定运行,同时减少对目标站点的负荷影响。

Python爬虫零基础入门:环境搭建与第一个网页抓取示例
图 4:Python 网络爬虫核心要素与工程排查自检清单

完成上述基础练习后,你已经掌握了 Python 爬虫最核心的“请求-接收-解析-提取”链路。接下来可以进一步探索多页列表的分页翻页逻辑、利用 CSS 选择器(soup.select())定位更复杂的页面元素,以及将提取到的数据写入 CSV 或 JSON 格式文件中进行存储。

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

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 算法库。