requests
和 httpx
都是 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()
方法分别发送了 GET
和 POST
请求。这两个方法都接受一个 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库协程时,应尽量避免使用全局变量,以免引起不必要的错误。
-
尽量使用连接池,以减少对服务器的压力。