Requests库入门指南

简介: Requests是Python最流行的HTTP客户端库,以“为人类设计”为核心理念,封装HTTP复杂细节,提供简洁API。支持GET/POST等方法、会话管理、自动解码、SSL验证等,月下载超10亿次,广泛用于API调用、爬虫与微服务开发。(239字)

1. 库的概览与核心价值

想象一下,在网络世界中,如果你想与各种网站和服务进行通信,就像是用传统的信件往来。你需要手动打包数据、编写地址、处理回复编码,这些繁琐的细节会让简单的任务变得复杂。requests库正是为解决这些问题而生的工具。

Requests是Python中最流行的HTTP客户端库,它的设计哲学是"为人类设计"。它将复杂的HTTP协议细节封装在简洁的API之下,让开发者能够用最少的代码完成网络请求。与Python标准库中的urllib相比,Requests的使用体验提升了90%以上——你不再需要手动处理URL编码、表单数据序列化、连接池管理等底层细节。

Requests在Python生态系统中占据着不可或缺的地位。据PyPI官方统计,它的下载量每月超过10亿次,超过50万个开源项目依赖它。无论是调用REST API、构建网络爬虫、自动化测试,还是开发微服务客户端,Requests都是首选工具。它支持HTTP/1.1的所有特性,包括连接池管理、Cookie持久化、SSL验证、自动内容解码等,让HTTP请求变得前所未有的简单。

2. 环境搭建与"Hello, World"

安装说明

Requests不是Python标准库的一部分,需要通过包管理器安装:

# 使用pip安装(推荐)
pip install requests

# 使用conda安装
conda install requests

# 使用Python模块方式安装
python -m pip install requests

Requests官方支持Python 3.9+版本,同时也兼容PyPy解释器。如果在安装过程中遇到权限问题,可以尝试使用--user参数或创建虚拟环境。

最简示例

以下是一个简单的"Hello, World"示例,展示如何发送GET请求并获取响应:

import requests

# 发送GET请求到GitHub API
response = requests.get('https://api.github.com/events')

# 打印响应状态码
print(f"状态码: {response.status_code}")

# 打印响应内容的前100个字符
print(f"响应内容: {response.text[:100]}")

逐行解释

  1. import requests - 导入Requests库,使其功能在当前脚本中可用。
  2. response = requests.get('https://api.github.com/events') - 调用get()方法向GitHub API发送GET请求,返回的Response对象包含了服务器的全部响应信息。
  3. print(f"状态码: {response.status_code}") - 访问Response对象的status_code属性,获取HTTP状态码(200表示成功)。
  4. print(f"响应内容: {response.text[:100]}") - 通过text属性获取响应的文本内容,并切片显示前100个字符。

运行结果

程序运行后会输出类似以下内容:

状态码: 200
响应内容: [{"id":"25698765432","type":"PushEvent","actor":{"id":12345678,"login":"userna

这个简单的例子展示了Requests的核心优势:用三行代码就完成了一次完整的HTTP请求,自动处理了连接建立、数据传输、响应解码等所有细节。

3. 核心概念解析

Requests库围绕几个核心概念构建,理解这些概念有助于你更灵活地使用它。

3.1 请求方法(Request Methods)

HTTP协议定义了多种请求方法,Requests为每种方法都提供了对应的函数:

  • requests.get() - 获取资源
  • requests.post() - 提交数据
  • requests.put() - 更新资源(完整替换)
  • requests.patch() - 更新资源(部分修改)
  • requests.delete() - 删除资源
  • requests.head() - 获取响应头
  • requests.options() - 获取服务器支持的方法

3.2 响应对象(Response Object)

每次请求后,Requests都会返回一个Response对象,它包含了服务器的完整响应信息:

  • response.status_code - HTTP状态码
  • response.text - 响应的文本内容(自动解码)
  • response.content - 响应的字节内容(原始二进制)
  • response.json() - 将JSON响应解析为Python字典
  • response.headers - 响应头信息(字典形式)
  • response.cookies - 服务器设置的Cookie

3.3 会话对象(Session Object)

Session对象允许你在多个请求之间保持某些参数(如Cookies、认证信息),并复用TCP连接,显著提高性能:

session = requests.Session()
session.headers.update({
   'User-Agent': 'My App'})

# 第一个请求会保存Cookies
response1 = session.get('https://httpbin.org/cookies/set/sessionid/123')

# 第二个请求会自动携带之前保存的Cookies
response2 = session.get('https://httpbin.org/cookies')

概念关系图

image.png

这个图表展示了Requests库的核心概念及其关系:请求方法用于发送请求,响应对象用于接收和处理服务器的回应,而会话对象则在多个请求之间提供状态保持和连接复用。

4. 实战演练:解决一个典型问题

需求分析

假设我们需要开发一个天气查询应用,能够获取指定城市的当前天气信息。我们将使用免费的天气API,通过发送HTTP请求来获取数据,并解析返回的JSON响应。

方案设计

这个项目将展示Requests库的几个核心功能:

  1. 使用requests.get()发送带参数的GET请求
  2. 通过params参数传递查询参数(城市名称)
  3. 使用response.json()解析JSON响应
  4. 实现错误处理和异常捕获
  5. 展示响应数据的提取和格式化

代码实现

import requests
from requests.exceptions import RequestException

def get_weather(city):
    """
    获取指定城市的天气信息

    Args:
        city (str): 城市名称,例如"Beijing"或"Shanghai"

    Returns:
        dict: 包含天气信息的字典,失败时返回None
    """
    # 使用免费的天气API(示例使用httpbin.org模拟)
    base_url = "https://httpbin.org/get"
    params = {
   
        'city': city,
        'units': 'metric'
    }

    try:
        # 发送GET请求,设置超时时间为5秒
        response = requests.get(base_url, params=params, timeout=5)

        # 检查响应状态码,如果不是2xx则抛出异常
        response.raise_for_status()

        # 解析JSON响应
        data = response.json()

        # 提取天气信息(这里模拟真实API的数据结构)
        weather_info = {
   
            'city': data.get('args', {
   }).get('city', city),
            'temperature': 25,  # 模拟数据
            'condition': '晴朗',
            'humidity': 45,
            'wind_speed': 3.2
        }

        return weather_info

    except requests.exceptions.Timeout:
        print(f"错误: 请求超时,无法获取{city}的天气信息")
    except requests.exceptions.HTTPError as err:
        print(f"HTTP错误: {err.response.status_code}")
    except requests.exceptions.RequestException as err:
        print(f"请求出错: {err}")

    return None

def main():
    """主函数:获取并显示多个城市的天气"""
    cities = ['Beijing', 'Shanghai', 'Guangzhou']

    print("=== 天气查询系统 ===\n")

    for city in cities:
        print(f"正在查询 {city} 的天气...")
        weather = get_weather(city)

        if weather:
            print(f"\n{weather['city']} 天气信息:")
            print(f"  温度: {weather['temperature']}°C")
            print(f"  天气: {weather['condition']}")
            print(f"  湿度: {weather['humidity']}%")
            print(f"  风速: {weather['wind_speed']} m/s")
        print("-" * 40)

if __name__ == '__main__':
    main()

运行说明

  1. 确保已安装Requests库: pip install requests
  2. 将代码保存为weather_app.py
  3. 运行程序: python weather_app.py

程序会依次查询三个城市的天气信息,并格式化输出结果。虽然示例使用了httpbin.org模拟数据,但代码结构可以直接适配真实的天气API(如OpenWeatherMap、和风天气等),只需修改base_url和数据提取逻辑即可。

关键点解析

  • 参数传递: 使用params字典传递查询参数,Requests会自动进行URL编码
  • 超时设置: timeout=5参数防止请求无限期等待
  • 错误处理: 使用raise_for_status()自动检查状态码,并捕获各类异常
  • JSON解析: response.json()将JSON响应直接转换为Python字典
  • 模块化设计: 将核心功能封装为函数,便于复用和测试

5. 最佳实践与常见陷阱

常见错误及规避方法

错误1:不检查状态码

# ❌ 错误做法
response = requests.get('https://api.example.com/data')
data = response.json()  # 如果状态码不是200,这里可能抛出异常

# ✅ 正确做法
response = requests.get('https://api.example.com/data')
response.raise_for_status()  # 检查状态码,非2xx时抛出HTTPError
data = response.json()

错误2:不设置超时时间

# ❌ 错误做法
response = requests.get('https://api.example.com/data')
# 如果网络故障或服务器无响应,程序会无限期等待

# ✅ 正确做法
response = requests.get('https://api.example.com/data', timeout=10)
# 10秒后超时,抛出Timeout异常

错误3:在循环中重复创建会话

# ❌ 错误做法
for url in url_list:
    response = requests.get(url)  # 每次都建立新连接,效率低下

# ✅ 正确做法
with requests.Session() as session:
    for url in url_list:
        response = session.get(url)  # 复用连接,性能更高

最佳实践建议

  1. 始终使用会话(Session): 对于向同一域名发送多个请求的场景,使用Session可以复用TCP连接,减少握手开销,提高性能。

  2. 合理设置超时: 建议为所有请求设置超时参数,可以使用元组分别设置连接超时和读取超时,例如timeout=(3, 10)

  3. 处理JSON解析异常: 并非所有API响应都是有效的JSON,使用response.json()时应该捕获JSONDecodeError:

import json

try:
    data = response.json()
except json.JSONDecodeError:
    print("响应不是有效的JSON格式")
    data = None
  1. 使用User-Agent标识: 某些网站会检查请求头中的User-Agent,建议设置一个合理的标识:
headers = {
   
    'User-Agent': 'MyWeatherApp/1.0 (https://myapp.com)'
}
response = requests.get(url, headers=headers)
  1. HTTPS证书验证: 生产环境中应该验证SSL证书,仅在测试环境或特定场景下禁用:
# 生产环境:验证证书(默认行为)
response = requests.get('https://example.com')

# 测试环境:禁用证书验证
response = requests.get('https://example.com', verify=False)
  1. 使用环境变量管理敏感信息: API密钥、令牌等敏感信息应该存储在环境变量中,而不是硬编码在代码里:
import os

api_key = os.environ.get('MY_API_KEY')
headers = {
   'Authorization': f'Bearer {api_key}'}

注意事项

  • Requests默认使用连接池,会自动处理Keep-Alive,无需手动管理连接
  • 下载大文件时,使用stream=True参数逐步读取,避免内存溢出
  • 处理重定向时,可以通过allow_redirects=False禁用自动重定向
  • 对于需要认证的API,优先使用Session对象的auth参数或headers参数,而不是在每个请求中重复设置

6. 进阶指引

高级功能

Requests提供了许多高级功能,可以应对复杂的HTTP交互场景:

  • 认证处理: 支持Basic认证、Digest认证、OAuth等多种认证方式
  • 代理配置: 通过proxies参数配置HTTP/SOCKS代理
  • 流式上传/下载: 处理大文件传输时避免内存问题
  • 事件钩子: 在请求的不同阶段注册回调函数
  • 自定义适配器: 实现自定义的传输协议或连接逻辑

生态扩展

Requests的生态丰富,有许多扩展库可以增强其功能:

  • requests-oauthlib: OAuth认证支持
  • requests-cache: 响应缓存,减少重复请求
  • requests-toolbelt: 实用工具集合,如Multipart上传、流式请求等
  • grequests: 基于gevent的异步请求
  • requests-threads: 多线程请求支持

学习路径

如果你想深入学习Requests,建议按以下路径进行:

  1. 掌握基础API: 熟悉所有请求方法和Response对象的属性
  2. 理解HTTP协议: 学习HTTP/1.1规范,理解状态码、请求头、响应头的含义
  3. 探索高级特性: 研究Session对象、连接池、SSL验证等高级功能
  4. 阅读源代码: Requests的代码结构清晰,阅读源码有助于理解其实现原理
  5. 实践项目: 开发一个完整的爬虫或API客户端项目

学习资源

Requests库的设计理念是"简单即美",但它的背后是HTTP协议的复杂性和网络编程的挑战。掌握了Requests,你就掌握了与网络世界沟通的基本技能。继续探索,你会发现HTTP请求的世界远比你想象的更加丰富和有趣。

相关文章
|
9天前
|
人工智能 自然语言处理 Shell
🦞 如何在 OpenClaw (Clawdbot/Moltbot) 配置阿里云百炼 API
本教程指导用户在开源AI助手Clawdbot中集成阿里云百炼API,涵盖安装Clawdbot、获取百炼API Key、配置环境变量与模型参数、验证调用等完整流程,支持Qwen3-max thinking (Qwen3-Max-2026-01-23)/Qwen - Plus等主流模型,助力本地化智能自动化。
🦞 如何在 OpenClaw (Clawdbot/Moltbot) 配置阿里云百炼 API
|
6天前
|
人工智能 机器人 Linux
保姆级 OpenClaw (原 Clawdbot)飞书对接教程 手把手教你搭建 AI 助手
OpenClaw(原Clawdbot)是一款开源本地AI智能体,支持飞书等多平台对接。本教程手把手教你Linux下部署,实现数据私有、系统控制、网页浏览与代码编写,全程保姆级操作,240字内搞定专属AI助手搭建!
4286 13
保姆级 OpenClaw (原 Clawdbot)飞书对接教程 手把手教你搭建 AI 助手
|
5天前
|
人工智能 安全 机器人
OpenClaw(原 Clawdbot)钉钉对接保姆级教程 手把手教你打造自己的 AI 助手
OpenClaw(原Clawdbot)是一款开源本地AI助手,支持钉钉、飞书等多平台接入。本教程手把手指导Linux下部署与钉钉机器人对接,涵盖环境配置、模型选择(如Qwen)、权限设置及调试,助你快速打造私有、安全、高权限的专属AI助理。(239字)
3453 9
OpenClaw(原 Clawdbot)钉钉对接保姆级教程 手把手教你打造自己的 AI 助手
|
8天前
|
人工智能 JavaScript 应用服务中间件
零门槛部署本地AI助手:Windows系统Moltbot(Clawdbot)保姆级教程
Moltbot(原Clawdbot)是一款功能全面的智能体AI助手,不仅能通过聊天互动响应需求,还具备“动手”和“跑腿”能力——“手”可读写本地文件、执行代码、操控命令行,“脚”能联网搜索、访问网页并分析内容,“大脑”则可接入Qwen、OpenAI等云端API,或利用本地GPU运行模型。本教程专为Windows系统用户打造,从环境搭建到问题排查,详细拆解全流程,即使无技术基础也能顺利部署本地AI助理。
6929 15
|
6天前
|
存储 人工智能 机器人
OpenClaw是什么?阿里云OpenClaw(原Clawdbot/Moltbot)一键部署官方教程参考
OpenClaw是什么?OpenClaw(原Clawdbot/Moltbot)是一款实用的个人AI助理,能够24小时响应指令并执行任务,如处理文件、查询信息、自动化协同等。阿里云推出的OpenClaw一键部署方案,简化了复杂配置流程,用户无需专业技术储备,即可快速在轻量应用服务器上启用该服务,打造专属AI助理。本文将详细拆解部署全流程、进阶功能配置及常见问题解决方案,确保不改变原意且无营销表述。
4495 4
|
4天前
|
人工智能 机器人 Linux
OpenClaw(Clawdbot、Moltbot)汉化版部署教程指南(零门槛)
OpenClaw作为2026年GitHub上增长最快的开源项目之一,一周内Stars从7800飙升至12万+,其核心优势在于打破传统聊天机器人的局限,能真正执行读写文件、运行脚本、浏览器自动化等实操任务。但原版全英文界面对中文用户存在上手门槛,汉化版通过覆盖命令行(CLI)与网页控制台(Dashboard)核心模块,解决了语言障碍,同时保持与官方版本的实时同步,确保新功能最快1小时内可用。本文将详细拆解汉化版OpenClaw的搭建流程,涵盖本地安装、Docker部署、服务器远程访问等场景,同时提供环境适配、问题排查与国内应用集成方案,助力中文用户高效搭建专属AI助手。
2329 5
|
8天前
|
人工智能 JavaScript API
零门槛部署本地 AI 助手:Clawdbot/Meltbot 部署深度保姆级教程
Clawdbot(Moltbot)是一款智能体AI助手,具备“手”(读写文件、执行代码)、“脚”(联网搜索、分析网页)和“脑”(接入Qwen/OpenAI等API或本地GPU模型)。本指南详解Windows下从Node.js环境搭建、一键安装到Token配置的全流程,助你快速部署本地AI助理。(239字)
4562 23
|
14天前
|
人工智能 API 开发者
Claude Code 国内保姆级使用指南:实测 GLM-4.7 与 Claude Opus 4.5 全方案解
Claude Code是Anthropic推出的编程AI代理工具。2026年国内开发者可通过配置`ANTHROPIC_BASE_URL`实现本地化接入:①极速平替——用Qwen Code v0.5.0或GLM-4.7,毫秒响应,适合日常编码;②满血原版——经灵芽API中转调用Claude Opus 4.5,胜任复杂架构与深度推理。
8394 12