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

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

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


神奇的 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 httpxresponse = httpx.get('https://jsonplaceholder.typicode.com/posts/1')
print(response.status_code)
print(response.json())

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

发送一个 POST 请求

import httpxdata = {'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 httpxtry: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 asyncioasync 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 asyncioasync 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 httpxclient = httpx.Client(http2=True)
response = client.get('https://www.google.com')
print(response.http_version)  # 输出: 'HTTP/2'

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

import httpxproxies = {'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 httpxclient = 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!

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/47544.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

echart 图表组件的封装

echart 图表组件的封装 思路: 1、主要的传递参数为 options 2、去监听options的变化,然后更新图表 3、设置宽高 父组件 <template><div class="chart-box"><GChart :options="chartData" /></div> </template> <scrip…

【VRP】基于常春藤算法IVY求解带时间窗的车辆路径问题TWVRP,最短距离附Matlab代码

% VRP - 基于IVY算法的TWVRP最短距离求解 % 数据准备 % 假设有一组客户点的坐标和对应的时间窗信息 % 假设数据已经存储在 coordinates、timeWindows 和 demands 变量中 % 参数设置 numCustomers size(coordinates, 1); % 客户点数量 vehicleCapacity 100; % 车辆容量 numV…

设计模式8大原则

1. 开放封闭 允许对类进行扩展&#xff0c;但禁止更改。 2. 依赖倒置 高层模块&#xff08;稳定的&#xff09;不应该依赖于低层模块&#xff08;变化的&#xff0c;如子类&#xff09;。二者都应该依赖于抽象。抽象不应该依赖于实现&#xff0c;实现应该依赖于抽象。 3. 里…

AI大模型新纪元:哪四大趋势引领未来智能革命?

在人工智能热潮持续居高不下背景下&#xff0c;虽然全球AI大模型企业卷参数的激烈程度有所放缓&#xff0c;但大模型仍不断朝着万亿、十万亿参数发展&#xff0c;并推动多模态持续演进以通向AGI。同时&#xff0c;大模型也在朝向轻量化、高效化、垂直多元化发展&#xff0c;进而…

每日复盘-20240718

20240718 六日涨幅最大: ------1--------300713--------- 英可瑞 五日涨幅最大: ------1--------301016--------- 雷尔伟 四日涨幅最大: ------1--------301016--------- 雷尔伟 三日涨幅最大: ------1--------301016--------- 雷尔伟 二日涨幅最大: ------1--------300713----…

Linux LVM扩容方法

问题描述 VMware Centos环境&#xff0c;根分区为LVM&#xff0c;大小50G&#xff0c;现在需要对根分区扩容。我添加了一块500G的虚拟硬盘(/dev/sdb)&#xff0c;如何把这500G扩容到根分区&#xff1f; LVM扩容方法 1. 对新磁盘分区 使用fdisk /dev/sdb命令&#xff0c;进…

SpringCloud02_consul概述、功能及下载、服务注册与发现、配置与刷新

文章目录 ①. Euraka为什么被废弃②. consul简介、如何下载③. consul功能及下载④. 服务注册与发现 - 8001改造⑤. 服务注册与发现 - 80改造⑥. 服务配置与刷新Refresh ①. Euraka为什么被废弃 ①. Eureka停更进维 ②. Eureka对初学者不友好,下图为自我保护机制 ③. 阿里巴巴…

27. python __new__ 深入探讨

python魔法函数 一. __new__二. cls()函数 一. new 大家应该对__init__()方法都很熟悉&#xff0c;它的第一个参数一定是self,init()方法负责对象的初始化&#xff0c;系统执行该方法前&#xff0c;其实该实例对象已经存在&#xff0c;要不然初始化什么呢.通常来说&#xff0c…

linux下JDK的安装

前言&#xff1a; 安装部署java开发的代码都需要java环境&#xff0c;这里记录下linux下JDK的安装过程&#xff0c;仅供学习参考。 JDK的下载 下载地址&#xff1a;https://www.oracle.com/java/technologies/downloads 选择和操作系统匹配的版本进行下载 查看操作系统&…

HarmonyOS NEXT学习——@BuilderParam装饰器

初步理解&#xff0c;相当于VUE的插槽slot Builder function overBuilder() {}Component struct Child {label: string ChildBuilder customBuilder() {}Builder customChangeThisBuilder() {}BuilderParam customBuilderParam: () > void this.customBuilder; // 使用自定…

人工智能未来发展前景将会怎样?

当我们探讨人工智能未来的发展前景时&#xff0c;可以从多个角度来详细说明其可能的影响和趋势&#xff1a; 技术进步与应用扩展 1.深度学习与机器学习&#xff1a; 进一步优化和算法进展&#xff1a;深度学习已经取得了巨大成就&#xff0c;但仍面临挑战&#xff0c;如对小数…

浅说区间dp(下)

文章目录 环形区间dp例题[NOI1995] 石子合并题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示思路 [NOIP2006 提高组] 能量项链题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示思路 [NOIP2001 提高组] 数的划分题目描述输入格式输出格式样例 #1样例输…

你也许不知道,自己可能是一个「热人」

稍微标题党了一下。: ) 今天想跟大家分享的&#xff0c;是一种很少有人了解的人格特质。它非常普遍&#xff0c;许多人都或多或少有一些倾向&#xff0c;但却很少有人意识到它。 不妨看一看&#xff0c;你有没有下面这些特征&#xff1a; 有着极其旺盛的求知欲&#xff0c;对许…

C++函数(函数原型,指标、参考、预设、可变参数)第一部

函数原型 自订函数的定义需要放在main()或呼叫之前&#xff0c;如果放在main()或呼叫之后&#xff0c;例如 #include <iostream>int main() {do_something("Whats truth?");do_something("There is no spoon.");return 0; }void do_something(cha…

paddleocr icdar2015数据集训练dbnet检测模型

参考&#xff1a;https://github.com/PaddlePaddle/PaddleOCR/blob/main/doc/doc_ch/detection.md 原理 DBNET论文 Real-time Scene Text Detection with Differentiable Binarization 参考&#xff1a;https://blog.csdn.net/qq_35756383/article/details/118679258 Real-T…

7,SSH scp 命令

scp 命令 scp是 SSH 提供的一个客户端程序&#xff0c;用来在两台主机之间加密传送文件&#xff08;即复制文件&#xff09;。 简介 scp是 secure copy 的缩写&#xff0c;相当于cp命令 SSH。它的底层是 SSH 协议&#xff0c;默认端口是22&#xff0c;相当于先使用ssh命令登…

【STC89C51单片机】定时器/计数器的理解

目录 定时器/计数器1. 定时器怎么定时简单理解&#xff08;加1经过了多少时间&#xff09;什么是时钟周期什么是机器周期 2.如何设置定时基本结构相关寄存器1. TMOD寄存器2. TCON寄存器 代码示例 定时器/计数器 STC89C51单片机的定时器和计数器&#xff08;Timers and Counter…

【BUG】已解决:NameError: name ‘XXX‘ is not defined

已解决&#xff1a;NameError: name ‘XXX‘ is not defined 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#xff0c;我是博主英杰&#xff0c;211科班出身&#xff0c;就职于医疗科技公司&#xff0c;热衷分享知识&#xff0c;武汉城市开发者社…

Harmony 状态管理 @Local 和 @Param

Harmony 状态管理 Local 和 Param Local 背景 Local 是harmony应用开发中的v2版本中 对标**State**的状态管理修饰器&#xff0c;它解决了 State 对状态变量更改的检测混乱的问题&#xff1a; State 修饰的状态变量 可以是组件内部自己定义的State 修饰的状态 也可以由外部父…

路径规划 | 基于DQN深度强化学习算法的路径规划(Matlab)

目录 效果一览基本介绍程序设计参考文献 效果一览 基本介绍 DQN路径规划算法 基于深度强化学习算法的路径规划 matlab2023b 栅格环境&#xff0c;走迷宫&#xff0c;可以通过窗口界面方便观察交互过程&#xff0c;代码注释详尽。 程序设计 完整源码和数据私信博主回复基于DQN深…