大家好!我是爱摸鱼的小鸿,关注我,收看每期的编程干货。
一个简单的库,也许能够开启我们的智慧之门,
一个普通的方法,也许能在危急时刻挽救我们于水深火热,
一个新颖的思维方式,也许能激发我们无尽的创造力,
一个独特的技巧,也许能成为我们的隐形盾牌……
神奇的 Python 库之旅,第 10 章
目录
- 一、初始 httpx
- 二、初级用法
- 三、异步请求
- 四、高级用法
- 五、总结
- 六、作者Info
一、初始 httpx
说起 Python 里的 HTTP 请求库,requests 几乎是无人不知、无人不晓。作为一个简洁易用的库,requests 已经帮助无数开发者顺利完成了网络请求。然而,随着技术的发展,大家对功能和性能的要求越来越高,于是 httpx 应运而生。
httpx 是一个比 requests 更强大的库,不仅继承了 requests 的简洁易用,还支持异步编程、HTTP/2、连接池复用等高级特性。
httpx > requests + aiohttp
安装 httpx
在开始之前,我们需要先安装 httpx,运行以下命令:
pip install httpx
Github 项目地址:
https://github.com/projectdiscovery/httpx
好了,工具在手,让我们大展身手!
…
二、初级用法
httpx 的用法和 requests 非常相似,下面我们先来看一些基础用法。
发送一个简单的 GET 请求
import httpx
response = httpx.get('https://jsonplaceholder.typicode.com/posts/1')
print(response.status_code)
print(response.json())
是不是很眼熟?没错,httpx 的用法和 requests 几乎一模一样。如果你用过 requests,那么上手 httpx 完全没有问题。
发送一个 POST 请求
import httpx
data = {
'title': 'foo',
'body': 'bar',
'userId': 1
}
response = httpx.post('https://jsonplaceholder.typicode.com/posts', json=data)
print(response.status_code)
print(response.json())
POST 请求也同样简单,只需要多加一个 json 参数就搞定了。你可以用 json、data、params 等参数来发送不同类型的数据。
处理请求超时
处理请求超时在实际开发中非常重要,httpx 也为我们提供了友好的方式。
import httpx
try:
response = httpx.get('https://httpbin.org/delay/5', timeout=3.0)
except httpx.RequestError as exc:
print(f"An error occurred while requesting {exc.request.url!r}.")
except httpx.HTTPStatusError as exc:
print(f"Error response {exc.response.status_code} while requesting {exc.request.url!r}.")
在这个示例中,我们向一个会延迟响应的 URL 发送请求,并设置了 3 秒的超时时间。若请求超时或发生其他错误,httpx 会抛出相应的异常。
三、异步请求
异步编程可以显著提高程序的性能,尤其是在处理大量 I/O 操作时。httpx 提供了异步支持,让我们可以轻松编写异步代码。
异步 GET 请求
首先,我们来看一个简单的异步 GET 请求示例。
import httpx
import asyncio
async def fetch():
async with httpx.AsyncClient() as client:
response = await client.get('https://jsonplaceholder.typicode.com/posts/1')
print(response.status_code)
print(response.json())
asyncio.run(fetch())
是不是很简单?通过 async with 语句创建一个异步客户端,我们就可以使用 await 来等待请求的响应。
同时发送多个请求
异步编程的一个大优势是可以同时发送多个请求,显著缩短总的请求时间。
import httpx
import asyncio
async def fetch(url):
async with httpx.AsyncClient() as client:
response = await client.get(url)
return response.json()
async def main():
urls = [
'https://jsonplaceholder.typicode.com/posts/1',
'https://jsonplaceholder.typicode.com/posts/2',
'https://jsonplaceholder.typicode.com/posts/3'
]
tasks = [fetch(url) for url in urls]
results = await asyncio.gather(*tasks)
for result in results:
print(result)
asyncio.run(main())
在这个示例中,我们使用 asyncio.gather 同时发送了三个请求,并打印了每个请求的结果。
四、高级用法
httpx 还提供了许多高级功能,如 HTTP/2 支持、代理、连接池等,下面我们来逐一介绍。
HTTP/2 支持
HTTP/2 是新一代的 HTTP 协议,具有更高的性能和效率。httpx 天然支持 HTTP/2,我们只需要进行简单配置。
import httpx
client = httpx.Client(http2=True)
response = client.get('https://www.google.com')
print(response.http_version) # 输出: 'HTTP/2'
代理支持
在某些情况下,我们需要通过代理发送请求。httpx 支持 HTTP 和 SOCKS 代理。
import httpx
proxies = {
'http://': 'http://10.10.1.10:3128',
'https://': 'http://10.10.1.10:1080',
}
response = httpx.get('https://www.example.com', proxies=proxies)
print(response.text)
连接池复用
连接池复用可以显著提升性能,尤其是发送大量请求时。httpx 默认启用了连接池复用,但我们也可以手动配置。
import httpx
client = httpx.Client()
for _ in range(10):
response = client.get('https://www.example.com')
print(response.status_code)
client.close()
在这个示例中,我们通过同一个客户端发送了 10 次请求,httpx 会自动复用连接池,提高请求效率。
更多功能,详细用法可参考官方文档:
https://www.python-httpx.org/#documentation
…
五、总结
httpx 作为一个新兴的 Python HTTP 请求库,以其简洁的 API 和强大的功能迅速受到了广泛关注。它不仅继承了 requests 的易用性,还在性能和功能上做了许多改进,尤其是对异步编程和 HTTP/2 的支持。
在本文中,我们通过多个代码示例,展示了 httpx 的基础用法、异步请求和高级功能。希望这些内容能帮助你更好地理解和使用 httpx,无论是开发个人项目还是处理复杂的网络请求,httpx 都是一个值得尝试的工具。
如果你对 httpx 感兴趣,不妨在你的项目中试用一下,相信你会爱上这个强大的库。感谢大家的阅读,希望这篇文章能给你带来帮助和启发。
六、作者Info
Author:小鸿的摸鱼日常
Goal:让编程更有趣! 专注于 Web 开发、爬虫,游戏开发,数据分析、自然语言处理,AI 等,期待你的关注,让我们一起成长、一起Coding!
版权说明:本文禁止抄袭、转载,侵权必究!