目录
一、httpx 是什么
在 Python 的网络请求库大家族中,httpx 正逐渐崭露头角,成为众多开发者的新宠。它是一个功能齐全、现代化的 HTTP 客户端库,支持同步和异步两种请求方式,为开发者在处理 HTTP 相关任务时提供了极大的便利与灵活性。
如果说 requests 库是 Python 网络请求领域的 “元老”,以简单易用、API 设计友好而被广大开发者熟知并广泛使用,那么 httpx 则像是站在巨人肩膀上的革新者 。httpx 继承了 requests 库简洁易用的优点,其 API 设计与 requests 非常相似,这使得熟悉 requests 库的开发者能够轻松上手 httpx,无缝切换。同时,httpx 又在 requests 的基础上进行了诸多功能的扩展和性能的优化,尤其是在异步编程和 HTTP/2 协议支持方面表现突出,解决了 requests 库在高并发场景下的一些局限性,为开发者打开了处理 HTTP 请求的新视野。 例如,当我们需要对多个 URL 发起请求时,使用 requests 库可能需要依次发送每个请求,在网络等待的过程中,程序会处于阻塞状态,这无疑会浪费大量的时间。而 httpx 凭借其异步特性,可以同时发送多个请求,大大提高了程序的执行效率。
二、为什么选择 httpx
(一)异步支持
在网络请求的世界里,时间就是金钱,而异步编程则是节省时间的利器,httpx 正是掌握了这一利器的高手。传统的同步请求就像是一位慢条斯理的办事员,一次只能处理一件事情,在处理 HTTP 请求时,每发送一个请求,都需要等待服务器响应后才能继续下一个请求。在等待的过程中,程序就像被按下了暂停键,其他任务都无法执行 ,这在需要处理大量请求的场景下,会极大地浪费时间和资源。
而 httpx 的异步支持就如同给程序赋予了 “分身术”。它基于 Python 的 asyncio 库,允许在等待一个请求响应的同时,去执行其他的任务,而不需要傻乎乎地干等。例如,当我们需要获取多个网页的数据时,使用同步请求,假设每个请求需要 1 秒钟的响应时间,获取 10 个网页就至少需要 10 秒钟;但使用 httpx 的异步请求,理论上只需要 1 秒钟左右(忽略网络波动和并发限制等因素),因为这些请求可以同时被发送出去,程序在等待响应的过程中可以继续做其他事情,大大提高了效率 。
我们来看一段简单的示例代码,对比同步和异步请求在并发场景下的表现:
# 同步请求示例
import requests
import time
def sync_fetch(url):
response = requests.get(url)
return response.text
urls = ['https://example.com', 'https://example2.com', 'https://example3.com']
start_time = time.time()
for url in urls:
sync_fetch(url)
end_time = time.time()
print(f"同步请求总耗时: {end_time - start_time} 秒")
# 异步请求示例
import asyncio
import httpx
async def async_fetch(url):
async with httpx.AsyncClient() as client:
response = await client.get(url)
return response.text
async def main():
urls = ['https://example.com', 'https://example2.com', 'https://example3.com']
tasks = [async_fetch(url) for url in urls]
results = await asyncio.gather(*tasks)
return results
start_time = time.time()
asyncio.run(main())
end_time = time.time()
print(f"异步请求总耗时: {end_time - start_time} 秒")
从实际运行结果中,我们可以直观地看到异步请求在处理并发任务时,所需的时间远远少于同步请求,这就是 httpx 异步支持的魅力所在。它让程序在网络请求的等待间隙也能充分利用资源,极大地提升了程序的执行效率,特别适合在高并发场景下使用,如大规模的网页爬虫、数据采集等任务。
(二)HTTP/2 支持
在 HTTP 协议的发展历程中,HTTP/2 就像是一次重大的技术飞跃,而 httpx 正是拥抱了这一先进技术的先锋。HTTP/2 带来了诸多令人瞩目的优势,为提升网络性能立下了汗马功劳 。
首先是多路复用技术,它就像一条多车道的高速公路,允许在单一的 TCP 连接上同时进行多个请求和响应。在 HTTP/1.1 时代,浏览器针对同一域名下的请求有数量限制,超过限制的请求就会被阻塞,就像一条单车道的小路,车多了就容易堵。例如,当我们加载一个包含多个图片、脚本和样式表的网页时,使用 HTTP/1.1 可能需要建立多个 TCP 连接来分别请求这些资源,而且这些请求还得排队进行,这无疑会增加页面的加载时间。而 HTTP/2 的多路复用技术打破了这种限制,所有的请求和响应可以在同一个连接上交错进行,大大减少了延迟,提高了传输效率 。
头部压缩也是 HTTP/2 的一大亮点。HTTP 请求和响应中包含的头部信息往往占据了不少的字节数,在 HTTP/1.1 中,这些头部信息没有经过有效的压缩,每次传输都需要消耗一定的带宽。HTTP/2 引入了 HPACK 压缩算法,对头部信息进行压缩,大幅减少了头部的大小,从而降低了传输的数据量,提高了性能。想象一下,每次请求都像是寄一个包裹,包裹里除了真正有用的货物(数据),还有很多包装材料(头部信息),HTTP/2 通过优化包装材料(压缩头部),让每次 “寄包裹” 都更加高效。
服务端推送也是 HTTP/2 的一个实用功能。服务器可以主动将客户端可能需要的资源提前推送给客户端,而不需要客户端先发起请求。比如,当客户端请求一个 HTML 页面时,服务器可以预测到客户端接下来可能需要加载页面中的图片、样式表等资源,于是就提前将这些资源推送给客户端,这样当客户端解析 HTML 页面时,就能直接使用这些已经推送过来的资源,加速了页面的加载速度。
httpx 对 HTTP/2 的支持,使得开发者在使用它进行网络请求时,能够充分享受到这些优势带来的性能提升。无论是在加载网页、获取数据接口还是进行其他 HTTP 相关的操作,基于 HTTP/2 的 httpx 都能让应用程序更加快速、高效地与服务器进行通信,为用户提供更流畅的体验 。
(三)简洁一致的 API
对于广大 Python 开发者来说,学习成本是选择一个新库时不得不考虑的因素,而 httpx 在这方面表现得十分友好,它拥有简洁一致的 API,与大家熟知的 requests 库极为相似。这就好比你已经熟练掌握了一种语言(requests 库的使用),突然出现了一种新语言(httpx 库),但让你惊喜的是,这两种语言的语法和词汇大部分是相通的,学习起来自然就轻松许多。
requests 库以其简单易用的 API 而闻名,它的设计非常符合 Python 的 “优雅、明确、简单” 的理念,使得开发者能够轻松地发送 HTTP 请求、处理响应等。httpx 在设计 API 时,充分借鉴了 requests 库的优点,保持了类似的函数和方法命名,以及相似的参数设置方式。例如,使用 requests 发送一个 GET 请求的代码是:
import requests
response = requests.get('https://example.com')
print(response.status_code)
print(response.text)
而使用 httpx 发送同样的 GET 请求,代码如下:
import httpx
response = httpx.get('https://example.com')
print(response.status_code)
print(response.text)
可以看到,除了导入的库名不同,其他部分几乎一模一样。对于已经熟悉 requests 库的开发者来说,几乎可以零成本地切换到 httpx,快速上手并使用它的各种功能。这种相似性不仅体现在简单的 GET 请求上,在处理 POST 请求、设置请求头、传递参数、处理 cookies 等复杂操作时,httpx 的 API 也与 requests 保持了高度的一致性 。
这使得开发者在学习和使用 httpx 时,无需花费大量时间去重新学习一套全新的 API,能够将在 requests 库上积累的经验和知识直接应用到 httpx 中,大大提高了开发效率。同时,简洁一致的 API 也使得代码的可读性和维护性更强,无论是自己回顾代码,还是团队成员之间协作开发,都能更加顺畅地理解和修改代码 。
三、安装 httpx
在开始使用 httpx 库开启我们的高效网络请求之旅前,首先要将它成功安装到我们的开发环境中。安装 httpx 非常简单,使用 Python 的包管理工具 pip 即可轻松完成 ,而且它在不同操作系统上的安装过程都十分相似,下面就为大家详细介绍。
(一)Windows 系统安装
如果你使用的是 Windows 系统,打开命令提示符(CMD)或 PowerShell,输入以下命令进行普通安装,即可从 Python Package Index(PyPI)上下载并安装 httpx 库:
pip install httpx
如果你希望使用 httpx 的 HTTP/2 支持,需要安装额外的依赖,命令如下:
pip install httpx[http2]
安装过程中,pip 会自动处理 httpx 及其依赖项的下载和安装。等待安装完成后,你就可以在 Python 项目中愉快地使用 httpx 了。 例如,你可以打开 Python 交互式环境,输入import httpx,如果没有报错,就说明安装成功。
(二)macOS 系统安装
对于 macOS 用户,同样可以使用 pip 来安装 httpx。打开终端,执行普通安装命令:
pip3 install httpx
这里使用pip3是为了确保安装到 Python 3 的环境中,因为 macOS 系统可能同时存在 Python 2 和 Python 3。如果需要 HTTP/2 支持,执行以下命令:
pip3 install httpx[http2]
安装完成后,你可以在 Python 脚本或交互式环境中导入 httpx 进行测试,比如创建一个简单的 Python 脚本test_httpx.py,内容如下:
import httpx
response = httpx.get('https://www.apple.com')
print(response.status_code)
然后在终端中运行python3 test_httpx.py,如果能正确输出苹果官网的响应状态码,那就大功告成了