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、代理、上传文件等功能。

