Requests:Python HTTP 请求,本该如此简单
Requests:Python HTTP 请求,本该如此简单
Requests 在 GitHub 上拿到了 54K Star,每周下载量超过 3 亿次,被 400 多万个仓库依赖。
这不是什么新鲜项目。2011 年 Kenneth Reitz 开源了它,一句话定位:HTTP for Humans。十几年过去了,它依然是 Python 生态里下载量最高的包之一。今天最新的 Python 环境里,pip install 顺带拉下来的第一个依赖大概率还是它。

1、 它解决什么问题
Python 标准库有 urllib,能用。但用过的人都知道那个痛:构造请求参数要手动拼接查询字符串,处理编码要自己操心,每个 HTTP 方法的调用方式不一样,上传文件还得自己拼 multipart body。
Requests 把这一层封装到极致。发一个带认证的 GET 请求:
import requests
r = requests.get('https://httpbin.org/basic-auth/user/pass', auth=('user', 'pass'))
r.status_code # 200
r.json() # {'authenticated': True, ...}
认证、超时、重定向、Session、文件上传,全都一个参数搞定。代码读起来和 HTTP 文档里描述的行为一一对应。这种"所见即所得"的 API 设计,是它当年一炮而红的核心原因。
2、 为什么十几年了还在用
HTTP 协议本身没怎么变。长连接和连接池复用、自动解压缩、TLS 证书验证、Cookie 持久化、SOCKS 代理、超时控制、流式下载、分块上传,这些需求十几年前存在,今天依然存在。Requests 在这件事上没有欠任何技术债。
反过来看,Requests 的稳定本身就是价值。一个第三方 API 的 SDK 可能三个月就 breaking change,但 Requests 的接口几乎没动过。写进 requirements.txt 之后就不用再操心的依赖,在 Python 生态里不多。

3、 功能清单
Requests 支持的 HTTP 特性覆盖了日常开发中的绝大部分场景:
- 长连接和连接池复用
- 国际化域名和 URL 编码
- Session 级别的 Cookie 持久化
- 浏览器风格的 TLS/SSL 验证
- Basic 和 Digest 认证
- 字典风格的 Cookie 操作
- 自动内容解压缩和解码
- 多部分文件上传
- SOCKS 代理支持
- 连接超时和读取超时
- 流式下载大文件
- .netrc 文件自动识别
- 分块传输编码
这些功能没有一条是炫技级别的。每一条都是写 HTTP 客户端时绕不开的基础需求,Requests 只是把它们都做对了。
4、 安装和起步
pip install requests
Python 3.10 及以上版本原生支持。没有额外依赖,装完即用。
项目目前由 Python Software Foundation 维护,与 CPython 生态深度绑定。如果你需要 clone 源码仓库,README 里提到了一个 timezone 相关的 git 配置问题,照着加一下 flag 就行。
5、 适合哪些人用
几乎每个 Python 开发者。不管你是写爬虫、调 API、做自动化测试、搭运维脚本,HTTP 请求这一步绕不开。Requests 是那种刚学 Python 就该装的包。
如果你一直在用 urllib,切换过来之后大概率不会再想回去。一个工具的 API 让你忘了底层 socket 的存在,它就是好工具。

浙公网安备 33010602011771号