Python Requests库的详细介绍、代码实例与竞品对比

Requests 是 Python 中最流行的 HTTP 客户端库,由 Kenneth Reitz 开发,以"HTTP for Humans"为设计理念,提供了简洁、直观的 API,极大简化了 HTTP 请求的处理流程。本文将详细介绍其核心功能、使用方法,并与其他 HTTP 库进行对比分析。

一、Requests库概述

核心特点

  • 简洁易用:API 设计人性化,避免了标准库 urllib 的繁琐语法
  • 功能完备:支持 GET/POST/PUT/DELETE 等所有 HTTP 方法,以及 cookies、headers、认证、代理等高级功能
  • 自动处理:自动解析 JSON 响应、处理编码、重定向等细节
  • 兼容性好:支持 Python 3.7+,并保持良好的向后兼容性
  • 生态丰富:与主流框架(如 Flask、Django)和工具无缝集成

安装方法

pip install requests  # 基础安装
pip install requests[security]  # 包含额外的安全特性(如SSL证书验证)

二、核心功能与代码实例

1. 基本HTTP请求

1.1 GET请求(获取资源)

最常用的请求方式,用于从服务器获取数据。

import requests

# 基础GET请求
response = requests.get("https://httpbin.org/get")

# 响应基本信息
print("状态码:", response.status_code)  # 200(成功)
print("响应头:", response.headers)      # 字典形式的响应头
print("编码:", response.encoding)        # 自动检测的编码(如'utf-8')
print("文本内容:", response.text)        # 字符串形式的响应体
print("二进制内容:", response.content)   # 二进制形式(用于图片等非文本)
print("JSON解析:", response.json())      # 自动解析JSON(若响应为JSON格式)
1.2 带参数的GET请求

通过 params 参数传递查询字符串(URL中的?key=value部分)。

# 定义查询参数
params = {
    "name": "Python",
    "version": "3.10",
    "page": 1
}

# 发送带参数的GET请求
response = requests.get("https://httpbin.org/get", params=params)

print("最终URL:", response.url)  # 实际请求的URL:https://httpbin.org/get?name=Python&version=3.10&page=1
print("响应数据:", response.json())
1.3 POST请求(提交数据)

用于向服务器提交数据(如表单提交、API数据提交)。

# 1. 提交表单数据(application/x-www-form-urlencoded)
form_data = {
    "username": "test_user",
    "password": "test_pass"
}
response = requests.post("https://httpbin.org/post", data=form_data)
print("表单提交响应:", response.json())

# 2. 提交JSON数据(application/json)
json_data = {
    "title": "Requests教程",
    "tags": ["python", "http"],
    "published": True
}
# 使用json参数自动设置Content-Type为application/json
response = requests.post("https://httpbin.org/post", json=json_data)
print("JSON提交响应:", response.json())

2. 高级功能

2.1 自定义请求头(Headers)

用于模拟浏览器、设置认证信息或自定义客户端标识。

# 模拟Chrome浏览器请求
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36",
    "Accept": "application/json, text/plain, */*",
    "Authorization": "Bearer your_token_here"  # 认证令牌
}

response = requests.get("https://httpbin.org/headers", headers=headers)
print("请求头验证:", response.json())
2.2 处理Cookies

自动管理 cookies,支持会话保持(如登录状态维持)。

# 1. 自动接收和发送cookies
response = requests.get("https://httpbin.org/cookies/set?name=value")
print("响应Cookies:", response.cookies)  # 服务器返回的cookies

# 2. 手动设置cookies
cookies = {"user_id": "12345", "session": "abcdef"}
response = requests.get("https://httpbin.org/cookies", cookies=cookies)
print("手动设置Cookies:", response.json())
2.3 会话管理(Session)

用于维持跨请求的状态(如保持登录状态),比单独使用 get/post 更高效(复用连接)。

# 创建会话对象
session = requests.Session()

# 第一步:登录(获取认证cookies)
login_data = {"username": "admin", "password": "admin123"}
session.post("https://httpbin.org/post", data=login_data)

# 第二步:使用同一会话访问需要登录的资源(自动携带cookies)
response = session.get("https://httpbin.org/get")
print("会话Cookies:", session.cookies)  # 包含登录后的cookies

# 关闭会话(释放资源)
session.close()
2.4 文件上传与下载
# 1. 文件上传(模拟表单上传文件)
files = {
    "file": ("example.txt", open("example.txt", "rb"), "text/plain")
    # 格式:(文件名, 文件对象, MIME类型)
}
response = requests.post("https://httpbin.org/post", files=files)
print("文件上传响应:", response.json())

# 2. 文件下载(保存二进制文件)
response = requests.get("https://picsum.photos/200/300")  # 示例图片URL
with open("downloaded_image.jpg", "wb") as f:
    f.write(response.content)  # 写入二进制内容
print("文件下载完成")
2.5 超时设置与异常处理

避免请求无限阻塞,捕获网络错误。

from requests.exceptions import RequestException, Timeout, ConnectionError

try:
    # 设置超时(连接超时5秒,读取超时10秒)
    response = requests.get(
        "https://httpbin.org/delay/3",  # 延迟3秒响应的测试接口
        timeout=(5, 10)  # (连接超时, 读取超时)
    )
    response.raise_for_status()  # 若状态码为4xx/5xx,抛出HTTPError
except Timeout:
    print("请求超时")
except ConnectionError:
    print("连接失败(可能是网络问题或域名错误)")
except RequestException as e:
    print(f"请求出错: {str(e)}")
else:
    print("请求成功:", response.status_code)
2.6 代理设置

用于爬虫、访问受限资源或隐藏真实IP。

# 1. HTTP代理
proxies = {
    "http": "http://user:pass@127.0.0.1:8080",
    "https": "https://user:pass@127.0.0.1:8080"
}

# 2. SOCKS代理(需安装requests[socks])
# proxies = {
#     "http": "socks5://user:pass@127.0.0.1:1080",
#     "https": "socks5://user:pass@127.0.0.1:1080"
# }

response = requests.get("https://httpbin.org/ip", proxies=proxies)
print("代理IP:", response.json())

三、与其他HTTP库的对比

库名称 特点 优点 缺点 适用场景
Requests 第三方库,基于urllib,API人性化 1. 语法简洁,代码量少
2. 自动处理编码、JSON、cookies
3. 功能全面且易用
1. 非标准库,需额外安装
2. 不支持异步(需配合异步库如requests-futures
绝大多数同步HTTP场景,优先选择
urllib Python标准库(包含urllib.request、urllib.parse等) 1. 无需安装,Python内置
2. 稳定性高,与Python版本同步更新
1. API繁琐,代码冗长
2. 需手动处理编码、JSON解析等细节
简单场景、不允许安装第三方库的环境
aiohttp 第三方异步HTTP库,基于asyncio 1. 支持异步IO,适合高并发场景
2. 性能优于同步库
1. 语法较复杂(需用async/await)
2. 学习成本较高
异步应用(如FastAPI、爬虫高并发场景)
httplib2 第三方库,功能全面,支持缓存、认证等 1. 支持HTTP缓存机制
2. 内置多种认证方式(Basic、OAuth等)
1. API不如Requests直观
2. 维护活跃度较低
需要缓存机制的场景
httpx 第三方库,支持同步和异步,被视为Requests的现代替代 1. 兼容Requests API,学习成本低
2. 原生支持异步和HTTP/2
1. 生态不如Requests成熟
2. 部分边缘功能可能不如Requests稳定
需要异步支持且希望保留Requests使用习惯
tornado.httpclient Tornado框架内置的异步HTTP客户端 1. 与Tornado框架深度集成
2. 适合Tornado应用的异步场景
1. 依赖Tornado框架
2. 通用性较差
Tornado框架开发的应用

核心对比结论

  1. 易用性Requests > httpx > urllib > httplib2
    Requests 的 API 设计最符合人类直觉,相同功能的代码量仅为 urllib 的 1/3~1/2。

  2. 功能完整性Requestshttpx > httplib2 > urllib
    Requests 覆盖了绝大多数 HTTP 场景需求,且生态丰富(如配合 requests-cache 实现缓存)。

  3. 性能aiohttphttpx(异步模式)> Requestsurllib
    异步库在高并发场景下性能优势明显,同步场景下 Requests 与 urllib 性能接近。

  4. 生态与社区Requests > urllib > aiohttp > httpx
    Requests 社区活跃,问题解决方案丰富,第三方扩展(如代理池、重试机制)成熟。

四、最佳实践

  1. 会话复用:频繁访问同一域名时,使用 Session 而非单次 get/post,减少 TCP 连接建立开销。

  2. 超时必设:所有请求必须设置 timeout,避免程序因网络问题无限阻塞。

  3. 异常处理:使用 try/except 捕获 RequestException 及其子类,确保程序稳定性。

  4. 避免重复造轮子:复杂需求优先使用成熟扩展,如:

    • requests-cache:添加缓存功能
    • requests-oauthlib:处理 OAuth 认证
    • tenacity:配合实现请求重试机制
  5. 遵守 robots.txt:爬虫场景下尊重网站的爬取规则,合理设置请求间隔。

总结

Requests 凭借简洁的 API、完备的功能和活跃的社区,成为 Python 中处理 HTTP 请求的首选库。对于绝大多数同步场景,它是最优解;若需异步处理,可考虑 httpx(兼容 Requests API)或 aiohttp(更纯粹的异步库);而在不允许安装第三方库的环境中,urllib 仍是基础选择。

掌握 Requests 不仅能提高日常开发效率,也是爬虫、API 对接、服务监控等场景的必备技能。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐