Python Requests库的详细介绍、代码实例与竞品对比
Python Requests库简介与对比 Requests是Python中最受欢迎的HTTP客户端库,以简洁易用的API设计著称。它支持所有HTTP方法,自动处理JSON解析、编码和重定向等功能,兼容Python 3.7+版本。 核心功能包括: 基本HTTP请求(GET/POST等) 参数传递和自定义请求头 Cookies和会话管理 文件上传下载 超时设置与异常捕获 代理配置 相比其他HTTP库
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框架开发的应用 |
核心对比结论
-
易用性:
Requests
>httpx
>urllib
>httplib2
Requests 的 API 设计最符合人类直觉,相同功能的代码量仅为 urllib 的 1/3~1/2。 -
功能完整性:
Requests
≈httpx
>httplib2
>urllib
Requests 覆盖了绝大多数 HTTP 场景需求,且生态丰富(如配合requests-cache
实现缓存)。 -
性能:
aiohttp
≈httpx
(异步模式)>Requests
≈urllib
异步库在高并发场景下性能优势明显,同步场景下 Requests 与 urllib 性能接近。 -
生态与社区:
Requests
>urllib
>aiohttp
>httpx
Requests 社区活跃,问题解决方案丰富,第三方扩展(如代理池、重试机制)成熟。
四、最佳实践
-
会话复用:频繁访问同一域名时,使用
Session
而非单次get/post
,减少 TCP 连接建立开销。 -
超时必设:所有请求必须设置
timeout
,避免程序因网络问题无限阻塞。 -
异常处理:使用
try/except
捕获RequestException
及其子类,确保程序稳定性。 -
避免重复造轮子:复杂需求优先使用成熟扩展,如:
requests-cache
:添加缓存功能requests-oauthlib
:处理 OAuth 认证tenacity
:配合实现请求重试机制
-
遵守 robots.txt:爬虫场景下尊重网站的爬取规则,合理设置请求间隔。
总结
Requests 凭借简洁的 API、完备的功能和活跃的社区,成为 Python 中处理 HTTP 请求的首选库。对于绝大多数同步场景,它是最优解;若需异步处理,可考虑 httpx
(兼容 Requests API)或 aiohttp
(更纯粹的异步库);而在不允许安装第三方库的环境中,urllib
仍是基础选择。
掌握 Requests 不仅能提高日常开发效率,也是爬虫、API 对接、服务监控等场景的必备技能。
更多推荐
所有评论(0)