Python requests 模块(手把手讲解)
💡一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
- 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于
Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...
,点击查看项目介绍 ;- 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;
截止目前, 星球 内专栏累计输出 82w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2900+ 小伙伴加入学习 ,欢迎点击围观
前言
在数字化时代,网络请求是开发者与外部服务交互的核心能力。无论是爬取网页数据、调用 API 接口,还是构建自动化工具,掌握网络请求的实现方式至关重要。Python requests 模块作为 Python 生态中最流行且友好的 HTTP 客户端库,凭借其简洁的 API 设计和丰富的功能,成为开发者首选的工具。
本文将从基础到进阶,结合实际案例,系统讲解 Python requests 模块的核心功能与最佳实践。无论你是编程新手还是有一定经验的开发者,都能通过本文快速掌握网络请求的实战技巧。
什么是 Python requests 模块?
Python requests 模块是一个基于 Python 的第三方库,用于发送 HTTP 请求并处理响应。它简化了底层协议的复杂性,让开发者能像操作本地文件一样轻松与网络服务交互。
想象一下,requests 模块就像一位专业的快递员:
- 当你需要向服务器发送请求(如“取件”)时,它负责将请求包装成标准格式(如 GET/POST 方法)。
- 接收服务器返回的响应(如“包裹”)后,它会帮你解析内容(如 JSON、文本等),并提供清晰的状态码(如“包裹是否完好”)。
通过 requests,开发者无需手动处理 TCP 连接、请求头解析或 SSL 加密等底层细节,只需关注业务逻辑即可。
基础用法:GET 请求与响应处理
发送 GET 请求
GET 请求是最常见的网络操作,用于从服务器获取数据。例如,访问 GitHub 的公共 API:
import requests
response = requests.get("https://api.github.com")
print(f"响应状态码:{response.status_code}") # 输出 200 表示成功
print(f"响应内容:{response.text[:100]}") # 输出前 100 字符
响应对象详解
requests.get()
返回一个 Response
对象,包含以下关键属性和方法:
属性/方法 | 描述 |
---|---|
response.status_code | 响应状态码(如 200 表示成功) |
response.text | 响应内容的字符串形式 |
response.json() | 将响应内容解析为 JSON 对象 |
比喻:Response
对象就像一个快递包裹,status_code
是包裹上的“收货状态”,text
是包裹内的“原始内容”,而 json()
则是帮你拆开包裹并整理成可读的格式。
参数传递与数据解析
传递查询参数
通过 params
参数向 URL 添加查询参数,例如搜索 GitHub 上的仓库:
params = {"q": "python"}
response = requests.get("https://api.github.com/search/repositories", params=params)
data = response.json()
print(f"找到 {data['total_count']} 个仓库")
处理 JSON 响应
当服务器返回 JSON 数据时,直接调用 .json()
方法即可将其转换为 Python 字典:
data = response.json()
print(f"库名称:{data['name']},版本:{data['version']}")
发送 POST 请求与表单数据
POST 请求用于向服务器提交数据,例如模拟登录或创建资源。表单数据可通过 data
参数传递:
login_data = {
"username": "example_user",
"password": "secure_password"
}
response = requests.post("https://api.example.com/login", data=login_data)
if response.status_code == 200:
print("登录成功!")
else:
print("登录失败,请检查凭证")
高级功能:认证、会话与超时
会话保持(Session 对象)
在多次请求同一服务器时,使用 Session
对象可复用 TCP 连接并管理 cookie:
from requests import Session
with Session() as session:
# 第一次请求登录获取 cookie
session.post("https://api.example.com/login", data=login_data)
# 第二次请求自动携带 cookie
response = session.get("https://api.example.com/user/profile")
print(response.text)
基本认证(HTTP Auth)
对需要密码保护的资源,可通过 auth
参数添加认证信息:
response = requests.get(
"https://api.example.com/protected",
auth=("username", "password") # 用户名和密码
)
设置超时时间
避免因网络延迟导致程序卡死,可设置超时时间(单位:秒):
try:
response = requests.get("https://slow-api.example.com", timeout=5)
except requests.exceptions.Timeout:
print("请求超时,请重试")
错误处理与异常管理
捕获常见异常
使用 try-except
块捕获请求过程中可能出现的错误:
import requests
from requests.exceptions import HTTPError, ConnectionError
try:
response = requests.get("https://api.example.com/non-existent-endpoint")
response.raise_for_status() # 检查状态码是否为 4xx/5xx
except HTTPError as e:
print(f"HTTP 错误:{e}")
except ConnectionError:
print("无法连接到服务器,请检查网络")
except Exception as e:
print(f"未知错误:{e}")
自定义重试策略
对于不稳定的服务,可结合第三方库 tenacity
实现自动重试:
from tenacity import retry, stop_after_attempt
import requests
@retry(stop=stop_after_attempt(3))
def fetch_data():
return requests.get("https://unstable-api.example.com")
try:
response = fetch_data()
except Exception as e:
print("所有重试均失败")
实战案例:构建天气查询工具
目标:通过 OpenWeatherMap API 获取天气数据
步骤 1:注册 API 密钥
访问 OpenWeatherMap 获取免费 API 密钥。
步骤 2:编写代码
import requests
API_KEY = "YOUR_API_KEY"
CITY = "Beijing"
URL = f"http://api.openweathermap.org/data/2.5/weather?q={CITY}&appid={API_KEY}"
try:
response = requests.get(URL)
response.raise_for_status()
data = response.json()
# 解析关键信息
temperature = data["main"]["temp"] - 273.15 # 转换为摄氏度
description = data["weather"][0]["description"]
print(f"当前 {CITY} 天气:{description}")
print(f"温度:{temperature:.1f}°C")
except requests.exceptions.RequestException as e:
print(f"请求失败:{e}")
输出示例
当前 Beijing 天气:few clouds
温度:22.5°C
总结与展望
Python requests 模块凭借其简洁的 API 设计和强大的功能,成为网络请求领域的“瑞士军刀”。从基础的 GET/POST 请求到进阶的会话管理、错误处理,它都能提供高效且直观的支持。
对于开发者而言,掌握 requests 模块不仅能提升工作效率,还能为构建复杂的网络应用(如爬虫、自动化脚本)打下坚实基础。随着网络服务的日益复杂,结合 requests 的灵活性与其他工具(如异步框架、数据解析库),你将能应对更多挑战。
实践建议:
- 通过官方文档探索更多功能(如文件上传、SSL 验证)。
- 在真实项目中应用 requests,例如搭建一个简易的股票价格监控工具。
- 结合日志记录(如
logging
模块)增强请求的可调试性。
通过不断实践与探索,requests 模块将成为你开发旅程中不可或缺的得力助手!