当前位置: 首页 > news >正文

Python requests库详解:HTTP请求与API调用实战

1. 初识requests库:Python HTTP请求的瑞士军刀

requests库是Python生态中最受欢迎的HTTP客户端库之一,它让发送HTTP/1.1请求变得异常简单。作为一个第三方库,requests在urllib3的基础上进行了更高层次的封装,提供了更人性化的API接口。根据GitHub的统计数据显示,requests库在Python项目中的使用率高达78%,远超其他HTTP客户端库。

安装requests库非常简单,只需要执行:

pip install requests

与标准库urllib相比,requests具有明显的优势:

  • 更简洁直观的API设计
  • 自动化的内容解码
  • 完善的连接池管理
  • 支持国际域名和URL
  • 更完善的文档和社区支持

一个最基本的GET请求只需要两行代码:

import requests response = requests.get('https://api.github.com')

2. 核心API详解:从基础请求到高级配置

2.1 HTTP方法全支持

requests库支持所有常见的HTTP方法,每种方法都有对应的便捷函数:

requests.get(url, params=None, **kwargs) # GET请求 requests.post(url, data=None, json=None, **kwargs) # POST请求 requests.put(url, data=None, **kwargs) # PUT请求 requests.delete(url, **kwargs) # DELETE请求 requests.head(url, **kwargs) # HEAD请求 requests.options(url, **kwargs) # OPTIONS请求 requests.patch(url, data=None, **kwargs) # PATCH请求

2.2 请求参数详解

每个请求方法都支持以下常用参数:

  • params: 查询字符串参数,会自动编码为URL查询字符串
  • data: 请求体数据,可以是字典、元组列表或bytes
  • json: 自动序列化为JSON的Python对象
  • headers: 请求头字典
  • cookies: Cookie字典或CookieJar对象
  • files: 上传文件字典
  • auth: 认证元组或可调用对象
  • timeout: 请求超时时间(秒)
  • allow_redirects: 是否允许重定向
  • proxies: 代理配置字典
  • verify: SSL证书验证开关
  • stream: 是否流式下载

2.3 响应对象解析

requests请求返回的Response对象包含所有服务器响应信息:

response.status_code # HTTP状态码 response.headers # 响应头字典 response.text # 解码后的响应文本 response.content # 原始响应字节 response.json() # 解析为JSON对象 response.cookies # 服务器设置的Cookie response.elapsed # 请求耗时 response.url # 最终请求URL(考虑重定向) response.history # 重定向历史记录

3. 实战技巧:处理常见场景与问题

3.1 会话保持与连接池

对于需要保持会话的场景,应该使用Session对象:

with requests.Session() as session: session.get('https://httpbin.org/cookies/set/sessioncookie/123456789') response = session.get('https://httpbin.org/cookies') print(response.json()) # 会显示之前设置的cookie

Session对象会自动处理:

  • Cookie持久化
  • 连接池复用
  • 默认参数配置
  • 认证信息保持

3.2 处理429 Too Many Requests错误

当遇到429状态码时,合理的重试策略很重要:

from time import sleep from requests.adapters import HTTPAdapter from urllib3.util.retry import Retry retry_strategy = Retry( total=3, backoff_factor=1, status_forcelist=[429, 500, 502, 503, 504] ) adapter = HTTPAdapter(max_retries=retry_strategy) session = requests.Session() session.mount("https://", adapter) session.mount("http://", adapter) try: response = session.get("https://api.example.com/rate-limited") except requests.exceptions.RetryError as e: print(f"请求失败: {e}")

3.3 文件上传与下载

文件上传示例:

files = {'file': ('report.xls', open('report.xls', 'rb'), 'application/vnd.ms-excel')} response = requests.post('https://httpbin.org/post', files=files)

流式下载大文件:

with requests.get('https://example.com/large-file.zip', stream=True) as r: r.raise_for_status() with open('large-file.zip', 'wb') as f: for chunk in r.iter_content(chunk_size=8192): f.write(chunk)

4. 高级应用与性能优化

4.1 异步请求处理

虽然requests本身是同步的,但可以结合线程池提高并发性能:

from concurrent.futures import ThreadPoolExecutor urls = [ 'https://httpbin.org/get', 'https://httpbin.org/post', 'https://httpbin.org/put' ] def fetch(url): return requests.get(url).status_code with ThreadPoolExecutor(max_workers=5) as executor: results = executor.map(fetch, urls) for result in results: print(result)

4.2 自定义适配器与中间件

可以通过自定义适配器修改请求行为:

from requests.adapters import HTTPAdapter class TimeoutAdapter(HTTPAdapter): def __init__(self, timeout, *args, **kwargs): self.timeout = timeout super().__init__(*args, **kwargs) def send(self, request, **kwargs): kwargs['timeout'] = self.timeout return super().send(request, **kwargs) session = requests.Session() adapter = TimeoutAdapter(timeout=5.0) session.mount('http://', adapter) session.mount('https://', adapter)

4.3 性能调优建议

  1. 连接池大小:默认连接池大小为10,对于高并发场景可以适当增大

    session = requests.Session() adapter = requests.adapters.HTTPAdapter(pool_connections=20, pool_maxsize=100) session.mount('https://', adapter)
  2. DNS缓存:对于频繁访问的域名,可以考虑使用DNS缓存

    from requests_toolbelt.adapters import source adapter = source.SourceAddressAdapter('1.2.3.4') session.mount('http://', adapter)
  3. 连接复用:保持Session对象长期存活,避免频繁创建销毁

  4. 压缩传输:启用gzip压缩减少传输量

    headers = {'Accept-Encoding': 'gzip, deflate'} response = requests.get(url, headers=headers)
  5. 合理设置超时:避免请求长时间阻塞

    # 连接超时3秒,读取超时10秒 requests.get(url, timeout=(3, 10))

在实际项目中,我发现合理配置这些参数可以将请求性能提升30%-50%,特别是在需要频繁与API交互的场景下效果尤为明显。

http://www.jsqmd.com/news/1230467/

相关文章:

  • 物理渲染实战:Ray-MMD如何解决传统MMD渲染的真实感瓶颈
  • 【AI前沿】2026.07.18 Kimi K3深度解析2.8万亿MoE架构,文远知行WITT定义物理AI认知,WAIC产业全景观察
  • 嵌入式音频系统MCASP TDM模式与DMA传输配置实战
  • Grok AI编程助手编码性价比深度评测与实战指南
  • 2024年本地运行LLM的5种主流方案详解
  • 国产Agent在政务、金融等信创场景的落地实践:全栈自主可控与工程化落地解析
  • AI Agent:它和ChatBot的区别,看完这篇你就懂了!
  • 面试官问:JOIN类型与ON/WHERE条件区别?一张图+相亲匹配比喻,彻底拿下这道必考题(附图解+比喻+避坑指南)
  • Moltbot开源项目:飞书远程控制家庭电脑实战指南
  • Awesome-AIGC-3D完全指南:从入门到精通的3D内容生成革命
  • Make+Notion视频自动化工作流:从光标停滞到智能发布
  • 两地三中心容灾架构全解析:从同城双活到异地灾备的落地实践
  • 小白程序员必看:手把手教你本地开发RAG知识库,轻松玩转大模型(收藏版)
  • 如何使用res-downloader:免费高效的网络资源下载终极指南
  • 大模型:类似Strassen算法的优化思路
  • Vue与Django REST framework全栈开发实战指南
  • Learn-to-Cluster未来发展方向:从研究到工业应用
  • Vibe Coding时代下的专注力管理:三域分治实战法
  • NumPy 1.26中文文档解析:科学计算核心技术与实战
  • Gemma-SEA-LION-v4.5-E2B-IT-4bits实战案例:构建多语言客服聊天机器人
  • 经典电子书资源包使用与管理全指南
  • GEO内容优化策略:语义结构化与知识图谱适配的技术方案
  • 鸿蒙 ArkTS 实战:Brand Kit 从个人品牌素材包到个人效率工具完整解析
  • 大数据集群SSH免密认证与基础环境搭建指南
  • TI C2000 DCSM安全机制与RAMOPEN特性:嵌入式固件保护与现场升级方案
  • Theano 0.9深度学习框架核心优化与工程实践
  • Python 3.12新特性与开发环境配置全指南
  • 从Notebook到生产:Triton+KServe模型服务化实战
  • [具身智能-592]:CAN_ISOTP(ISO 15765-2)分包协议完整详解 + RDK X5 SocketCAN 实操
  • GitHub Copilot 工作原理与工程实践指南