httpx,一个网络请求的 Python 新宠儿

大家好!我是爱摸鱼的小鸿,关注我,收看每期的编程干货。

一个简单的库,也许能够开启我们的智慧之门,
一个普通的方法,也许能在危急时刻挽救我们于水深火热,
一个新颖的思维方式,也许能激发我们无尽的创造力,
一个独特的技巧,也许能成为我们的隐形盾牌......

神奇的 Python 库之旅 ,第 10

目录

一、初始 httpx

说起 Python 里的 HTTP 请求库,requests 几乎是无人不知、无人不晓。作为一个简洁易用的库,requests 已经帮助无数开发者顺利完成了网络请求。然而,随着技术的发展,大家对功能和性能的要求越来越高,于是 httpx 应运而生。

httpx 是一个比 requests 更强大的库,不仅继承了 requests 的简洁易用,还支持异步编程、HTTP/2、连接池复用等高级特性。

httpx > requests + aiohttp

安装 httpx

在开始之前,我们需要先安装 httpx,运行以下命令:

python 复制代码
pip install httpx

Github 项目地址:

https://github.com/projectdiscovery/httpx

好了,工具在手,让我们大展身手!

...

二、初级用法

httpx 的用法和 requests 非常相似,下面我们先来看一些基础用法。

发送一个简单的 GET 请求

python 复制代码
import httpx

response = httpx.get('https://jsonplaceholder.typicode.com/posts/1')
print(response.status_code)
print(response.json())

是不是很眼熟?没错,httpx 的用法和 requests 几乎一模一样。如果你用过 requests,那么上手 httpx 完全没有问题。

发送一个 POST 请求

python 复制代码
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 也为我们提供了友好的方式。

python 复制代码
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 请求示例。

python 复制代码
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 来等待请求的响应。

同时发送多个请求

异步编程的一个大优势是可以同时发送多个请求,显著缩短总的请求时间。

python 复制代码
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,我们只需要进行简单配置。

python 复制代码
import httpx

client = httpx.Client(http2=True)
response = client.get('https://www.google.com')
print(response.http_version)  # 输出: 'HTTP/2'

代理支持

在某些情况下,我们需要通过代理发送请求。httpx 支持 HTTP 和 SOCKS 代理。

python 复制代码
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 默认启用了连接池复用,但我们也可以手动配置。

python 复制代码
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!

版权说明:本文禁止抄袭、转载,侵权必究!

相关推荐
superman超哥8 分钟前
仓颉性能瓶颈定位方法深度解析
c语言·开发语言·c++·python·仓颉
岁岁的O泡奶15 分钟前
NSSCTF_crypto_[SWPU 2020]happy
经验分享·python·算法·密码学
武汉唯众智创17 分钟前
“物联网 Python 开发教程”课程教学解决方案
开发语言·python·物联网·物联网技术·物联网 python 开发·python 开发
时光Autistic21 分钟前
【搭建教程】腾讯混元3D模型部署
开发语言·python·3d·github
前端程序猿之路22 分钟前
AI大模型应用之-RAG 全流程
人工智能·python·gpt·语言模型·aigc·mybatis·ai编程
程序员miki23 分钟前
Dramatiq安装及应用(一)
python·dramatiq
liulanba32 分钟前
深入理解 Python 异步编程:async、await 与同步函数详解
服务器·网络·python
BBB努力学习程序设计38 分钟前
从文本中精准提取手机号并脱敏:Python 正则 + 文件流的实战进阶
python
BBB努力学习程序设计38 分钟前
Python文件操作完全指南:读写文件与数据处理
python·pycharm
vv_Ⅸ40 分钟前
打卡day47
python