接口自动化框架基础:requests 库全方位指南,从入门到实战

作者:c_chun 发布时间: 2025-09-20 阅读量:8 评论数:0

在 Python 爬虫、API 开发、自动化测试等场景中,发送 HTTP 请求是高频需求。而 requests 库 凭借其简洁的语法、完善的功能和极佳的兼容性,成为了开发者处理 HTTP 请求的首选工具。它彻底解决了 Python 内置 urllib 库语法繁琐、操作复杂的痛点,让 “发送一个请求” 这件事变得像写英语句子一样简单。

本文将从基础到进阶,带大家全面掌握 requests 库的使用 —— 从环境安装到核心方法,从参数配置到实战案例,再到性能优化技巧,帮你快速上手并灵活应对各类业务场景。

一、为什么选择 requests 库?—— 它的核心优势

在学习使用前,我们先明确一个问题:Python 自带 urllib 库,为什么还要用 requests?答案藏在它的三大核心优势里:

  1. 语法极简,上手成本低

发送一个 GET 请求,urllib 需要构建 Request 对象、处理 URL 编码、捕获异常,而 requests 只需一行代码:requests.get(url),语义化的方法名(get/post/put)让代码可读性大幅提升。

  1. 功能全面,覆盖所有 HTTP 场景

支持 GET/POST/PUT/DELETE/HEAD/PATCH 等所有 HTTP 方法,内置 cookie 管理、会话保持、文件上传、代理设置、SSL 验证等功能,无需额外封装工具类。

  1. 异常处理友好,调试效率高

内置 HTTPError、ConnectionError 等细分异常类型,配合响应对象的 status_code(状态码)、text(响应内容)、headers(响应头)等属性,能快速定位请求问题(如 404 页面不存在、500 服务器错误)。

二、环境准备:5 分钟完成安装与验证

requests 是第三方库,需先通过包管理工具安装,支持 Windows/macOS/Linux 全平台。

1. 安装方式(二选一)

  • 使用 pip(推荐,Python 自带)

打开终端 / 命令提示符,输入以下命令,等待安装完成:

pip install requests

如果提示 “pip 不是内部命令”,需先配置 Python 环境变量(或使用 python -m pip install requests)。

  • 使用 Anaconda(适合数据分析用户)

若已安装 Anaconda,输入以下命令:

conda install requests

2. 验证安装是否成功

安装完成后,在终端输入 python 进入交互模式,执行以下代码:

import requests

response = requests.get("https://www.baidu.com")

print("请求状态码:", response.status_code)  # 输出 200 表示安装成功且请求正常

若输出 请求状态码:200,说明 requests 库已正确安装并能正常发送请求。

三、核心功能详解:掌握 90% 场景的用法

requests 库的核心是围绕 HTTP 方法 设计的,不同方法对应不同的业务需求(如获取数据用 GET,提交数据用 POST)。下面我们逐一讲解高频用法。

1. 基础请求:GET 与 POST(最常用)

(1)GET 请求:获取数据(如爬取页面、调用查询类 API)

GET 请求的参数通常拼接在 URL 后(如 https://search.baidu.com/s?wd=python 中的 wd=python),requests 支持通过 params 参数自动拼接,无需手动处理 URL 编码。

示例:调用百度搜索 API(模拟搜索 “python”)

import requests
# 1. 定义请求 URL 和参数

url = "https://search.baidu.com/s"

params = {

    "wd": "python",  # 搜索关键词

    "pn": 0          # 分页参数(0 表示第 1 页,10 表示第 2 页,以此类推)

}

# 2. 发送 GET 请求

response = requests.get(url, params=params)

# 3. 处理响应结果

print("请求的完整 URL:", response.url)  # 查看参数是否自动拼接(输出:https://search.baidu.com/s?wd=python&pn=0)

print("响应状态码:", response.status_code)  # 200 表示成功

print("响应内容(前 500 字符):", response.text[:500])  # 获取页面 HTML 内容

(2)POST 请求:提交数据(如登录、表单提交、上传文件)

POST 请求的参数通常放在请求体(Body)中,不暴露在 URL 里,安全性更高。根据服务器要求,参数格式可能是 form-data(表单)或 json(API 常用)。

场景 1:提交表单数据(form-data 格式)

import requests
url = "https://example.com/login"  # 模拟登录接口

data = {

    "username": "test_user",

    "password": "123456"

}

# 发送 POST 请求(data 参数自动以 form-data 格式提交)

response = requests.post(url, data=data)

print("登录响应:", response.text)

场景 2:提交 JSON 数据(API 接口常用)

很多现代 API(如 RESTful API)要求请求体为 JSON 格式,此时需用 json 参数(requests 会自动设置 Content-Type: application/json 头):

import requests

url = "https://api.example.com/user"  # 模拟用户注册 API

user_info = {

    "name": "张三",

    "age": 25,

    "email": "zhangsan@example.com"

}

# 发送 JSON 格式的 POST 请求

response = requests.post(url, json=user_info)

print("注册结果:", response.json())  # 直接解析 JSON 响应(无需手动 json.loads())

2. 响应处理:获取你需要的所有信息

发送请求后,会得到一个 Response 对象(上文中的 response),它包含了服务器返回的所有信息。以下是常用属性和方法:

属性 / 方法

作用说明

示例

status_code

获取 HTTP 状态码(200 = 成功,404 = 未找到)

print(response.status_code)

text

获取响应内容(字符串格式,如 HTML)

print(response.text)

json()

解析 JSON 格式响应(返回字典 / 列表)

data = response.json()

headers

获取响应头(如 Content-Type、Cookie)

print(response.headers["Content-Type"])

cookies

获取响应中的 Cookie(字典格式)

print(response.cookies["SESSIONID"])

url

获取最终请求的 URL(处理重定向后)

print(response.url)

注意:若响应不是 JSON 格式,调用 json() 会报错,建议先判断 status_code 是否为 200,再解析内容。

3. 高级配置:应对复杂场景

在实际开发中,常需要设置请求头、超时时间、代理等,requests 提供了对应的参数支持。

(1)设置请求头(Headers)

很多网站会验证 User-Agent(标识请求来源,如浏览器 / 爬虫),若不设置,可能会被拒绝访问。示例:

import requests

url = "https://www.zhihu.com"

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",

    "Referer": "https://www.baidu.com"  # 模拟从百度跳转过来的请求

}

response = requests.get(url, headers=headers)

print("状态码:", response.status_code)  # 正确设置后,状态码为 200(否则可能是 403 禁止访问)

(2)设置超时时间(Timeout)

为避免请求因网络问题一直阻塞,建议设置超时时间(单位:秒),超时后会抛出 Timeout 异常:

import requests

try:

    # 10 秒内未响应则超时

    response = requests.get("https://www.example.com", timeout=10)

except requests.exceptions.Timeout:

    print("请求超时,请检查网络!")

(3)设置代理(Proxies)

爬虫场景中,为避免 IP 被封禁,常需要使用代理。requests 支持通过 proxies 参数配置 HTTP/HTTPS 代理:

import requests

url = "https://httpbin.org/ip"  # 该网站会返回当前请求的 IP

proxies = {

    "http": "http://127.0.0.1:8888",  # HTTP 代理

    "https": "https://127.0.0.1:8888"  # HTTPS 代理

}

response = requests.get(url, proxies=proxies)

print("当前请求 IP:", response.json()["origin"])  # 输出代理 IP,说明配置成功

(4)会话保持(Session)

若需要连续发送多个请求(如登录后访问个人中心),且要求保持 Cookie,可使用 Session 对象,它会自动保存 Cookie,无需手动传递:

import requests
# 创建 Session 对象

session = requests.Session()

# 1. 第一步:登录(Session 会保存登录后的 Cookie)

login_url = "https://example.com/login"

session.post(login_url, data={"username": "test", "password": "123"})

# 2. 第二步:访问个人中心(自动携带登录 Cookie,无需额外处理)

user_center_url = "https://example.com/user/center"

response = session.get(user_center_url)

print("个人中心内容:", response.text)

四、实战案例:用 requests 爬取豆瓣电影 Top250

理论结合实践才是掌握的关键。下面我们用 requests 爬取豆瓣电影 Top250 的电影名称、评分和简介,巩固前面所学的知识。

1. 分析目标页面

豆瓣电影 Top250 地址:https://movie.douban.com/top250?start=0&filter=

  • start=0:第 1 页(0-24 条),start=25:第 2 页(25-49 条),以此类推。

  • 页面数据直接嵌入 HTML 中,无需处理 JavaScript 渲染(适合入门)。

2. 代码实现(需配合 BeautifulSoup 解析 HTML)

import requests

from bs4 import BeautifulSoup  # 需先安装:pip install beautifulsoup4

def get_douban_top250(page):

    # 1. 配置请求参数

    start = (page - 1) * 25  # 计算每页的起始位置

    url = "https://movie.douban.com/top250"

    params = {"start": start, "filter": ""}

    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"

    }

    # 2. 发送请求并解析 HTML

    try:

        response = requests.get(url, params=params, headers=headers, timeout=10)

        response.raise_for_status()  # 若状态码不是 200,抛出 HTTPError 异常

        soup = BeautifulSoup(response.text, "html.parser")

        # 3. 提取电影信息

        movie_list = soup.find_all("div", class_="item")  # 找到所有电影项

        for movie in movie_list:

            title = movie.find("span", class_="title").text  # 电影名称

            rating = movie.find("span", class_="rating_num").text  # 评分

            quote = movie.find("span", class_="inq")  # 电影简介(部分电影无简介,需判断)

            quote_text = quote.text if quote else "无简介"

            print(f"电影名称:{title}\n评分:{rating}\n简介:{quote_text}\n" + "-"*50)

    except Exception as e:

        print(f"爬取第 {page} 页失败:{str(e)}")

# 爬取前 3 页(共 75 部电影)

for page in range(1, 4):

    print(f"=== 正在爬取豆瓣 Top250 第 {page} 页 ===")

    get_douban_top250(page)

3. 代码说明

  • 用 BeautifulSoup 解析 HTML 结构,提取电影信息(若不了解 BeautifulSoup,可先学习其基础语法);

  • 用 try-except 捕获请求异常(如网络错误、页面不存在),提高代码健壮性;

  • 通过循环实现多页爬取,逻辑清晰且可复用。

五、注意事项与进阶技巧

1. 避免被反爬:遵守网站规则

  • 不要频繁发送请求:可在请求间加入 time.sleep(1)(暂停 1 秒),模拟人类操作;

  • 轮换 User-Agent 和代理:避免单一标识被网站封禁。

2. 性能优化:批量请求用异步

requests 是同步库,若需要发送上千个请求,同步方式会非常慢。此时可结合 aiohttp(异步 HTTP 库)实现批量请求,效率提升 10 倍以上。示例(核心逻辑):

import aiohttp
import asyncio

async def fetch_url(session, url):

    async with session.get(url) as response:

        return await response.text()

async def batch_request(urls):

    async with aiohttp.ClientSession() as session:

        tasks = [fetch_url(session, url) for url in urls]

        results = await asyncio.gather(*tasks)  # 并发执行所有任务

        return results

# 批量请求 10 个 URL

urls = [f"https://example.com/page/{i}" for i in range(1, 11)]

results = asyncio.run(batch_request(urls))

3. 常见问题排查

  • 问题 1:状态码 403 Forbidden → 检查是否设置 User-Agent,或 IP 是否被封禁;

  • 问题 2:响应内容乱码 → 用 response.encoding = response.apparent_encoding 自动识别编码;

  • 问题 3:JSON 解析报错 → 先打印 response.text 查看实际响应内容,确认是否为 JSON 格式。

六、总结

requests 库是 Python 开发者处理 HTTP 请求的 “瑞士军刀”—— 它语法简洁、功能全面,既能满足新手快速发送请求的需求,也能支撑复杂场景(如会话保持、代理池)的开发。

通过本文的学习,你应该已经掌握了:

  1. requests 库的安装与基础验证;

  1. GET/POST 等核心请求方法的使用;

  1. 响应对象的解析与高级配置(请求头、超时、代理);

  1. 实战爬取豆瓣 Top250 的完整流程;

  1. 反爬技巧与性能优化方向。

如果需要进一步深入,建议查看 requests 官方文档,了解更多高级功能(如文件上传、身份验证)。动手实践是掌握的关键,不妨试着用 requests 调用一个公开 API(如天气 API、股票 API),巩固今天的知识吧!

评论