Python有一个比requests库更好用的httpx库

requestshttpx 都是 Python 中常用的 HTTP 库,它们都可以用来发送 HTTP 请求并处理响应。但是,它们有一些区别:

requests 是一个非常流行的 HTTP 库,提供了许多方便的功能,并且非常易于使用。它最初于 2011 年发布,现在已经成为了 Python 中最流行的 HTTP 库之一。

httpx 是一个新一代的 HTTP 库,是由 Python 3.6 之后的内置 asyncio 模块开发的。它可以同时使用异步和同步方式来发送 HTTP 请求,并且比 requests 更快。它也支持许多 HTTP/2 特性,比如多路复用和服务端推送。

总的来说,如果你只需要发送同步 HTTP 请求,那么 requests 可能是一个更好的选择,因为它更加简单易用。如果你需要发送异步 HTTP 请求或者使用 HTTP/2 特性,那么 httpx 可能是一个更好的选择。

除了上述区别外,还有一些其他的区别:

requests 使用的是 urllib3 库来实现底层的网络通信,而 httpx 则是使用的是 httptools 库。这意味着 httpx 可能会更快一些,因为 httptools 库在解析和处理 HTTP 报文方面有更好的性能

requests 只能使用同步方式发送 HTTP 请求,而 httpx 则既可以使用同步方式,也可以使用异步方式。这意味着 httpx 可以在处理需要等待的操作时不会阻塞程序,从而提高效率。

requests 只支持 HTTP/1.1 协议,而 httpx 则支持 HTTP/2 协议。这意味着 httpx 可以使用 HTTP/2 特性,比如多路复用和服务端推送,来提高效率。

httpx库的使用介绍

使用 httpx 库发送 HTTP 请求非常简单。首先,需要安装 httpx 库,使用以下命令安装:

pip install httpx

然后,在 Python 代码中导入 httpx 库,就可以使用它发送 HTTP 请求了。

例如,下面是一个使用 httpx 库发送 GET 请求的示例:

import httpx

response = httpx.get("https://www.example.com")
print(response.status_code)  # 输出响应状态码
print(response.text)  # 输出响应文本

下面是一个使用 httpx 库发送 POST 请求的示例:

import httpx

data = {"key": "value"}
headers = {"Content-Type": "application/json"}

response = httpx.post("https://www.example.com", json=data, headers=headers)
print(response.status_code)  # 输出响应状态码
print(response.text)  # 输出响应文本

在这些示例中,我们使用了 get()post() 方法分别发送了 GETPOST 请求。这两个方法都接受一个 URL 参数,表示请求的目标地址,并返回一个 Response 对象,表示服务器的响应。

可以通过调用 Response 对象的属性来获取响应的其他信息。例如,可以使用 status_code 属性获取响应的状态码,使用 text 属性获取响应的文本内容。

除了 get()post() 方法外,httpx 库还提供了其他的方法,包括:

  • put():发送 PUT 请求。

  • patch():发送 PATCH 请求。

  • delete():发送 DELETE 请求。

  • options():发送 OPTIONS 请求。

  • head():发送 HEAD 请求。

这些方法的使用方法和 get() 和 post() 方法类似,只需要把方法名换成对应的 HTTP 方法即可。

例如,下面是一个使用 put() 方法发送 PUT 请求的示例:

import httpx

data = {"key": "value"}
headers = {"Content-Type": "application/json"}

response = httpx.put("https://www.example.com", json=data, headers=headers)
print(response.status_code)  # 输出响应状态码
print(response.text)  # 输出响应文本

除了使用上述方法之外,还可以使用 request() 方法来发送任意类型的 HTTP 请求。request() 方法接受三个必须参数:方法、URL 和数据,并返回一个 Response 对象。

例如,下面是一个使用 request() 方法发送 GET 请求的示例:

import httpx

response = httpx.request("GET", "https://www.example.com")
print(response.status_code)  # 输出响应状态码
print(response.text)  # 输出响应文本

需要注意的是,使用 request() 方法时,需要手动指定请求的方法和数据

除了发送 HTTP 请求之外,httpx 库还提供了许多其他的功能,例如设置请求的超时时间自动处理重定向设置代理服务器等。

例如,下面是一个设置请求超时时间的示例:

import httpx

response = httpx.get("https://www.example.com", timeout=5)  # 设置超时时间为 5 秒
print(response.status_code)  # 输出响应状态码
print(response.text)  # 输出响应文本

下面是一个自动处理重定向的示例:

import httpx

response = httpx.get("https://www.example.com", allow_redirects=True)  # 允许自动处理重定向
print(response.status_code)  # 输出响应状态码
print(response.text)  # 输出响应文本

下面是一个设置代理服务器的示例:

import httpx

proxies = {"https": "http://10.10.1.10:3128"}  # 设置代理服务器
response = httpx.get("https://www.example.com", proxies=proxies)
print(response.status_code)  # 输出响应状态码
print(response.text)  # 输出响应文本

这些只是 httpx 库的一些简单用法,它还有许多其他的功能,比如 httpx 库的协程功能就非常实用。

httpx库的协程用法

使用 httpx 库的协程功能非常简单,只需要使用 async with 语句来创建一个异步上下文,并使用 await 关键字来等待 HTTP 请求的响应即可。

下面是一个使用 httpx 库的协程功能的示例:

import asyncio
import httpx

async def main():
    async with httpx.AsyncClient() as client:  # 创建异步上下文
        response = await client.get("https://www.example.com")  # 发送异步请求
        print(response.status_code)  # 输出响应状态码
        print(response.text)  # 输出响应文本

asyncio.run(main())  # 在事件循环中运行协程

在这个示例中,我们使用了 AsyncClient 类来创建一个异步 HTTP 客户端,然后使用 get() 方法发送异步 HTTP 请求。

关于 httpx 库的异步请求,可以使用异步上下文管理器(如async with语句)来发送异步请求,或者使用 httpx.AsyncClient 对象来管理异步请求。

下面使用 httpx.AsyncClient 的示例:

from rich import print
import asyncio
import httpx
import threading
import time

client = httpx.AsyncClient()

async def sync_main(url, sign):
    r = httpx.get(url).status_code
    print(f'sync_main: {threading.current_thread()}: {sign}:{r}')


loop = asyncio.get_event_loop()

tasks = [sync_main(url='http://www.baidu.com', sign=i) for i in range(200)]
start = time.time()
loop.run_until_complete(asyncio.wait(tasks))
end = time.time()
loop.close()

print(start - end)

httpx库协程好处

使用协程的方式可以帮助我们更好地利用 CPU 资源,同时也可以提高程序的效率。

注意事项

  • 使用httpx库协程时,需要确保协程的数量不会过大,以免造成资源浪费和服务器压力。

  • 对于请求和响应处理,应尽量避免使用阻塞式调用,可以使用异步回调的方式来处理。

  • 在使用httpx库协程时,应尽量避免使用全局变量,以免引起不必要的错误。

  • 尽量使用连接池,以减少对服务器的压力。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值