python知识点100篇系列(17)-替换requests的python库httpx

2024-10-08 10:22:12 浏览数 (2)

Requests 是使用 Apache2 Licensed 许可证的 基于Python开发的HTTP 库,其在Python内置模块的基础上进行了高度的封装,使用Requests可以轻而易举的完成浏览器可有的任何操作。

但是在python3.6之后,出现了一个requests的替代选项;

httpx

httpx是Python新一代的网络请求库, 是一个几乎继承了所有 requests 的特性并且支持 "异步" http 请求的开源库。可以认为 httpx 是强化版 requests。

主要包含以下特点:

基于Python3的功能齐全的http请求模块 既能发送同步请求,也能发送异步请求 支持HTTP/1.1和HTTP/2 能够直接向WSGI应用程序或者ASGI应用程序发送请求

注意,httpx只支持python3.6

安装使用httpx需要Python3.6 ,如果要使用异步请求还需要版本是Python3.8

  • 安装httpx

推荐使用pip安装,在安装了pip之后,执行以下命令即可

pip install httpx

关于pip的安装方式,可以查看之前的文章或官方文档;

另外:如果需要使用HTTP/2,则需要安装http2的相关依赖

pip install httpxhttp2

  • 使用httpx

httpx的用法基本和requests库一样,基本用法可以参考requests模块的用法;原有代码只需要替换requests单词为httpx就行;

不同的地方有:

httpx提供了Client

httpx提供了Client解决了requests每次发送请求都需要建立一个新的连接问题,Client是基于HTTP连接池实现的,这意味着当你对一个网站发送多次请求的时候,Client会保持原有的TCP连接,从而提升程序的执行效率。

使用Client的伪代码如下:

代码语言:python代码运行次数:0复制
 将请求头字符串转化为字典
headers = dict([line.split(": ",1) for line in headers.split("n")])
#print(headers)

def httpx_req():

    with httpx.Client(headers=headers) as client:
        data_url = f'https://www.****.com/'
        res = client.get(url=data_url).json()
        #print(res)
        print(res['has_more'])
        print(res['max_cursor'])
        print(res['aweme_list'][0]['video']['play_addr'])

httpx_req()

httpx提供了异步支持

httpx提供了异步client来发送相关请求。异步client还支持WebSocket等长网络连接。使用异步client比使用多线程发送请求更加高效;

异步请求需要使用async/await语句来进行异步操作,同时一般情况下会用到一个库

asyncio

官网介绍说:

asyncio 是用来编写并发代码的库,使用 async/await 语法。其用作多个提供高性能 Python 异步框架的基础,包括网络和网站服务,数据库连接库,分布式任务队列等等。

执行异步请求

首先是创建一个httpx.AsyncClient()对象;然后是asyncio收集任务,最后执行请求;

代码语言:python代码运行次数:0复制
async def async_httpx_req(sign):
    async with httpx.AsyncClient() as client:  # 创建一个异步client
        r = await client.get('https://www.***.com/')
        print(f'async_httpx_req: {sign}:{r.status_code}')


def run():
    loop = asyncio.get_event_loop()
    tasks = [async_httpx_req(sign=i) for i in range(200)]
    task_start = time.time()
    loop.run_until_complete(asyncio.wait(tasks))
    task_end = time.time()
    loop.close()
    print(task_end - task_start)

run()

输入结果如下:

最后

如果要比较效率是否提高,可以编码同步请求的方法,比较以下耗时时间,就可发现效率提高了50%以上;

0 人点赞