Python爬取网页的详细步骤与代码实例教程

咖啡半糖
咖啡半糖
发布时间:2026-10-15 | 39人浏览过
原创

编写一个网络爬虫,本质上就是写程序模拟浏览器向服务器发起请求,接收返回的网页源代码,并从中筛选提取出我们需要的数据。本文将使用 Python 中经典的 requests 与 BeautifulSoup4 库,带你按标准流程完成从网络请求到本地数据持久化的完整闭环,掌握最通用、可靠的静态网页爬取方法。

一、爬虫运行的基本工作流与技术选型

在开始写代码之前,我们需要理清一次网页爬取任务究竟包含哪几个阶段。无论是抓取新闻标题、商品价格还是天气数据,标准的爬虫流程都可以拆解为四大核心环节:确定目标并构造请求、获取响应内容、定位并解析节点,最后将清洗好的数据保存下来。

Python爬取网页的详细步骤与代码实例教程
图 1:Python 基础爬虫执行操作步骤流程图

在工具选择上,我们选用 Python 生态中最成熟易用的组合:

  • Requests:用于网络通信。相比 Python 自带的 urllib,它的 API 设计更加人性化,能够轻松处理编码、会话和 Header 配置。
  • BeautifulSoup4:用于文档解析。它能够将凌乱的 HTML 字符串转换为树状结构,支持通过标签名、CSS 类选择器等直观方式定位元素。

二、前期准备:安装依赖环境

在你的终端(Terminal 或命令提示符)中执行以下命令,安装爬取和解析所需的第三方模块:

pip install requests beautifulsoup4

如果使用的是 Jupyter Notebook 或虚拟环境,请确保安装命令执行在对应的解释器环境中。安装完成后,可以在 Python 交互环境中输入 import requests, bs4 验证是否安装无误,未报错即表示就绪。

三、核心步骤拆解

1. 伪装请求头(Headers)与发送 HTTP 请求

绝大多数网站都有基础的防抓取机制,其中最直接的一种是检查 HTTP 请求头中的 User-Agent。如果使用 requests.get() 而不提供任何头部信息,默认的标识为类似 python-requests/2.x.x 的字符串,很多服务器会直接拒绝响应(返回 403 Forbidden)。

因此,第一步也是最关键的基础细节,是在请求中带上主流浏览器的 User-Agent 字符串:

import requests

url = "https://quotes.toscrape.com/"
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36"
}

response = requests.get(url, headers=headers, timeout=10)
print(f"响应状态码: {response.status_code}")
注意:超时配置不可省略
timeout=10 参数表示若目标服务器在 10 秒内未响应则主动中断并抛出异常。如果不设置该参数,一旦网络阻塞或目标挂起,你的程序可能会永久卡在等待响应的步骤。

2. 解析 HTML 结构与节点匹配

当服务器返回 200 成功代码后,我们可以通过 response.text 获取完整的网页 HTML 文本。随后将其送入 BeautifulSoup 构建解析对象。

网页在浏览器中呈现的内容,在底层是一层层嵌套的 DOM 树。我们需要根据目标数据在页面中的位置,找到包含目标特征的标签名(tag)、类名(class)或属性(attribute)。

Python爬取网页的详细步骤与代码实例教程
图 2:HTML 树状 DOM 结构与定位层级映射原理

在解析时,有两个最基础且频繁使用的方法:

  • find():查找符合条件的第一个元素,返回单个 Tag 对象;未找到则返回 None。
  • find_all():查找符合条件的所有元素,返回一个列表(可直接通过循环遍历)。

3. 提取属性与清洗数据

定位到具体节点后,通常需要取出其包含的文字内容或特定属性值(如超链接 href 或图片地址 src):

  • 使用 element.get_text(strip=True) 提取纯文本并剔除前后空格及换行。
  • 使用字典取值方式 element["href"] 获取标签的属性。

4. 数据结构化与存储为 CSV

提取出的数据通常以字典形式组织,每行一条记录。利用 Python 内置的 csv 模块中的 csv.DictWriter,可以轻松把字典列表写入标准的 CSV 表格文件中,供后续在 Excel 或数据库中处理。

四、完整实战代码实例

我们以面向爬虫学习的公开练习网站 https://quotes.toscrape.com/ 为例,完整编写一个采集名言、作者、作者介绍链接并保存至 CSV 文件的爬虫脚本。

import csv
import requests
from bs4 import BeautifulSoup

def scrape_quotes():
    # 1. 目标地址与配置
    base_url = "https://quotes.toscrape.com"
    target_url = f"{base_url}/"
    headers = {
        "User-Agent": (
            "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
            "AppleWebKit/537.36 (KHTML, like Gecko) "
            "Chrome/122.0.0.0 Safari/537.36"
        )
    }

    print(f"正在请求页面: {target_url}")
    
    # 2. 发起 HTTP GET 请求
    try:
        response = requests.get(target_url, headers=headers, timeout=10)
        # 确保编码正确,如果网页乱码,可使用 response.apparent_encoding
        response.encoding = response.apparent_encoding
        response.raise_for_status()  # 若状态码不是 200,触发 HTTPError 异常
    except requests.exceptions.RequestException as e:
        print(f"请求失败: {e}")
        return

    # 3. 解析页面
    soup = BeautifulSoup(response.text, "html.parser")
    
    # 找到所有包含名言卡片的 div 容器
    quote_blocks = soup.find_all("div", class_="quote")
    
    collected_data = []

    # 4. 遍历提取字段
    for block in quote_blocks:
        # 提取名言文本
        text_el = block.find("span", class_="text")
        text = text_el.get_text(strip=True) if text_el else ""

        # 提取作者
        author_el = block.find("small", class_="author")
        author = author_el.get_text(strip=True) if author_el else ""

        # 提取作者详情页相对链接并拼接为完整 URL
        link_el = block.find("a")
        author_link = f"{base_url}{link_el['href']}" if (link_el and "href" in link_el.attrs) else ""

        collected_data.append({
            "quote": text,
            "author": author,
            "author_link": author_link
        })

    print(f"成功解析出 {len(collected_data)} 条记录。")

    # 5. 持久化存储到 CSV 文件
    csv_file = "scraped_quotes.csv"
    with open(csv_file, mode="w", encoding="utf-8-sig", newline="") as f:
        fieldnames = ["quote", "author", "author_link"]
        writer = csv.DictWriter(f, fieldnames=fieldnames)
        
        writer.writeheader()
        writer.writerows(collected_data)

    print(f"数据已成功写入到 {csv_file}")

if __name__ == "__main__":
    scrape_quotes()

代码运行与预期输出

在安装好依赖并运行该脚本后,控制台将输出如下运行日志(示例输出):

正在请求页面: https://quotes.toscrape.com/
成功解析出 10 条记录。
数据已成功写入到 scraped_quotes.csv

在当前目录下生成的 scraped_quotes.csv 可以使用 Excel 或任意文本编辑器打开,内部包含了规整的表头和 10 条提取好的名言与作者数据。

五、健壮性考量:异常处理机制

初学者编写爬虫常遇到的一个困扰是“爬了几页突然崩溃报错退出”。网络环境具有高度不确定性,服务器也可能随时出现 500 错误、丢包或超时。编写可用于实际生产环境的爬虫,必须建立分层防御机制。

Python爬取网页的详细步骤与代码实例教程
图 3:爬虫运行中的双层异常防御结构

六、爬虫进阶与全景总结

掌握了基础静态网页的抓取后,在面对更复杂的实际场景时,爬虫技术栈会面临不同的技术分流:

  • 动态渲染页面:如果网页内容是通过 JavaScript 异步请求(Ajax)生成的,直接请求 HTML 源码可能看不到具体数据。此时优先打开浏览器 F12 开发者工具的 Network 面板抓取实际的 JSON 数据接口;若接口加密极其复杂,再考虑使用 Playwright 或 Selenium 进行浏览器自动化渲染。
  • 爬取礼仪与频控:在批量爬取多页内容时,务必在循环中加入 time.sleep(1) 等延时,避免瞬间向目标服务器发送过多并发请求,造成服务器负载过大甚至导致 IP 被封禁。
Python爬取网页的详细步骤与代码实例教程
图 4:Python 网页爬虫关键技术矩阵与执行要点总结

只要严格遵循“构造请求头发送请求 → 验证状态码获取源码 → 层级定位元素提取数据 → 空指针防御与持久化保存”这一标准化步骤,绝大部分静态网页的数据采集任务都可以按此逻辑快速、稳定地实现。

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表