Python HTTP 请求库对比
在 Python 开发中,处理 HTTP 请求是常见需求。常用的库包括 urllib、urllib3、requests 以及 newer 的 aiohttp 和 httpx。本文将重点对比 requests、aiohttp 和 httpx 三种主流库的使用场景与特性。
requests
requests 是一个 Python 第三方库,处理 URL 资源特别方便。相对于 urllib3 来说,它封装了更多功能,并且使用步骤简单。在不借助其他第三方库的情况下,requests 只能发送同步请求。

从 API 源码来看,requests 支持设置请求方式、请求头、cookie、过期时间、请求接口验证、文件上传等功能。
日常常用的请求格式如下:
# get 请求
requests.get(url, params)
# post 请求
requests.post(url, data)
# 文件上传
upload_files = {'file': open('report.xls', 'rb')}
requests.post(url, file=upload_files)
# 设置 header
headers = {'User-Agent': 'Mozilla/5.0'}
requests.post(url, headers=headers)
# 设置 cookie
cookies = {'token': '12345'}
requests.post(url, cookies=cookies)
如果单纯请求一个接口获取数据,上述方法已足够。但在爬虫场景中,有时需要保持登录信息去爬取其他接口。单纯的 requests.get 或 requests.post 是一次性请求,无法满足需求。对于登录成功后需携带之前生成的 cookie 或 token 的情况,可以使用 requests.session,它可以自动处理 cookies,做状态保持。
# 先实例化一个对象
session = requests.session()
# 给 requests.session() 对象设置 cookie 信息
cookies_dict = {}
session.cookies = requests.utils.cookiejar_from_dict(cookies_dict)
# 后面用法和直接使用 requests 一样了
response = session.get(url)
result = response.json()
# 获取登陆的所有 cookies 信息
print(result.cookies.values())
aiohttp
aiohttp 是一个为 Python 提供异步 HTTP 客户端、服务端编程的库,基于 asyncio。在不借助其他第三方库的情况下,aiohttp 只能发送异步请求。
当同步请求满足需求后,为了提升效率、减少消耗时间且不阻塞主线程,异步请求成为更好的选择。aiohttp 同样可以设置请求方式、请求头、cookie、代理、上传文件等功能。
import aiohttp
# post 请求
payload = {"data": "hello world"}
async with aiohttp.ClientSession() as session:
async with session.post(url, json=payload) as resp:
print(resp.status)
# get 请求
async with aiohttp.ClientSession() as session:
async with session.get(url) as resp:
print(resp.status)
res = await resp.text()
return res
# 上传文件
files = {'file': open('report.xls', 'rb')}
async with aiohttp.ClientSession() as sess:
async with sess.post(url, data=files) as resp:
print(await resp.text())
# 设置 header, cookie
headers = {'User-Agent': 'your agent'}
cookies = {'session': 'abc'}
async with aiohttp.ClientSession(headers=headers, cookies=cookies) as session:
async with session.get(url) as resp:
print(await resp.text())
异步请求多用于对接口返回数据在其他地方没有太强依赖的场景,主要用于提高效率,节省同步等待时间。
httpx
httpx 是 Python 新一代的网络请求库。在不借助其他第三方库的情况下,httpx既能发送同步请求,又能发送异步请求。
httpx 特点:
- 基于 Python3 的功能齐全的 http 请求模块
- 既能发送同步请求,也能发送异步请求
- 支持 HTTP/1.1 和 HTTP/2
- 能够直接向 WSGI 应用程序或者 ASGI 应用程序发送请求
安装 httpx 需要 Python 3.6+(使用异步请求需要 Python 3.8+)。功能和 requests 基本一致,但 httpx 不仅支持同步请求,还支持异步,这是比 requests 更优越的地方。
基本使用方法:
data = {'name': 'autofelix', 'age': 25}
# get 请求
httpx.get(url, params=data)
# post 请求
httpx.post(url, data=data)
# 设置 header, cookie, timeout
headers = {'User-Agent': 'your agent'}
cookies = {'session': 'abc'}
httpx.get(url, headers=headers, cookies=cookies, timeout=10.0)
# 使用 client 发送(同步)请求
with httpx.Client() as client:
response = client.get(url)
异步操作使用 async/await 语句来进行。使用异步 client 比使用多线程发送请求更加高效,更能体现明显的性能优势。
import asyncio
import httpx
async def main():
# 异步请求 AsyncClient
async with httpx.AsyncClient() as client:
response = await client.get(url)
print(response)
if __name__ == '__main__':
# python3.7+ 支持写法
# asyncio.run(main())
# python3.6 及以下版本写法
loop = asyncio.get_event_loop()
result = loop.run_until_complete(asyncio.gather(main()))
loop.close()
大体上看,同步请求使用 httpx.Client(),异步请求使用 httpx.AsyncClient(),然后其他的一些基本用法都大体相似。如果你对 requests 熟练,那么对于 aiohttp 以及 httpx 也是很快就能上手理解的。
总结
本文对比了 Python 中三种常见的 HTTP 请求库:
- requests: 适合简单的同步请求场景,生态成熟,文档丰富。
- aiohttp: 适合高并发的异步网络应用,基于 asyncio。
- httpx: 兼顾同步与异步,支持 HTTP/2,是现代 Python 网络编程的优选。
开发者应根据具体业务需求(如是否需要异步、是否涉及 HTTP/2 等)选择合适的库。

