)
requests是 Python 中最流行、最易用的 HTTP 网络请求库用于发送 HTTP/1.1 请求GET、POST、PUT、DELETE 等支持会话保持、Cookie、SSL 验证、文件上传、代理、超时控制、重定向处理等丰富功能。它底层基于urllib3但提供了更简洁、人性化的 API。基本用法示例importrequests# GET 请求responserequests.get(https://httpbin.org/get,params{key:value})print(response.status_code)# 200print(response.json())# 自动解析 JSON 响应# POST 请求表单数据responserequests.post(https://httpbin.org/post,data{name:Alice})# POST 请求JSON 数据responserequests.post(https://httpbin.org/post,json{name:Alice})# 自动设置 Content-Type: application/json# 带 headers 和认证headers{User-Agent:MyApp/1.0}auth(username,password)responserequests.get(https://httpbin.org/basic-auth/user/pass,headersheaders,authauth)# 处理异常推荐try:responserequests.get(https://example.com,timeout5)response.raise_for_status()# 抛出 HTTPError如 4xx/5xxexceptrequests.exceptions.RequestExceptionase:print(f请求失败{e})⚠️ 注意事项requests不是 Python 标准库需通过pip install requests安装默认不启用连接池复用但requests.Session()可复用 TCP 连接、持久化 Cookie适合多次请求避免在高并发场景直接使用裸requests.get()应结合Session或异步库如httpxasyncio提升性能。requests.Session与直接调用requests.get()/requests.post()的核心区别在于Session 复用底层连接、Cookie、认证信息和配置显著提升多次请求的性能与一致性而裸函数每次新建独立会话开销更大且状态不共享。主要区别特性requests.get()/post()裸调用requests.Session()连接复用每次请求新建 TCP 连接除非启用 keep-alive 且服务端支持但无法跨请求复用自动复用连接池基于urllib3.PoolManager支持 HTTP/1.1 keep-alive减少握手与慢启动开销Cookie 管理不自动保存/发送 Cookie需手动提取并传入cookies自动持久化并随后续请求发送 Cookie类似浏览器会话默认 headers/auth/proxies每次需重复传参可一次性设置session.headers、session.auth、session.proxies全局生效资源管理无显式生命周期控制推荐配合with session:使用自动关闭连接池避免资源泄漏线程安全函数调用本身线程安全但状态不共享Session实例不是线程安全的应为每个线程/协程创建独立 Session或加锁性能优势实测典型场景✅连接复用10 次同域名请求Session 可减少 90% 的 TCP 握手与 TLS 协商时间✅DNS 缓存复用urllib3对同一 host 的 DNS 解析结果在 Session 生命周期内缓存✅连接池复用默认pool_connections10可配置避免频繁创建/销毁 socket✅代码简洁性与可维护性统一配置如 token、User-Agent、自动鉴权、集中错误处理。示例对比# ❌ 裸调用低效、重复配置、Cookie 丢失requests.get(https://api.example.com/login,data{u:a,p:b})requests.get(https://api.example.com/profile)# ❌ 未携带登录 Cookie401# ✅ Session高效、状态保持、配置一次srequests.Session()s.post(https://api.example.com/login,data{u:a,p:b})# 登录后 Cookie 自动保存resps.get(https://api.example.com/profile)# ✅ 自动携带 Cookie返回 200s.headers.update({User-Agent:MyApp/1.0})# 全局 header 最佳实践对同一服务的多次交互如 API 调用链、爬虫分页务必使用Session生产环境建议用with requests.Session() as s:确保资源释放高并发时为每个线程/协程分配独立 Session或使用threading.local()封装。