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,一经查实,立即删除!

相关文章

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

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

每日复盘-20240718

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

Linux LVM扩容方法

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

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

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

linux下JDK的安装

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

HarmonyOS NEXT学习——@BuilderParam装饰器

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

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

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

浅说区间dp(下)

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

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

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

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

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

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

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

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

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

Harmony 状态管理 @Local 和 @Param

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

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

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

Vue学习---vue cli 项目创建

使用的编辑工具webStorm 创建例子: hello vue create hello 选择 vue3 进行创建 运行 npm run serve 测试访问:http://localhost:8080 改动内容重新编译: npm run build dist 目录就是编译后的可运行内容

1分钟带你了解苹果手机删除照片恢复全过程

在日常使用苹果手机时,我们可能会不小心删除掉一些重要的照片,这让人非常烦恼。那么苹果手机怎么恢复删除的照片?下面小编将会向大家介绍苹果手机恢复删除的照片的方法,帮助大家轻松找回你丢失的照片。 一、利用“最近删除”文件夹…

甲骨文面试题【动态规划】力扣377.组合总和IV

给你一个由 不同 整数组成的数组 nums ,和一个目标整数 target 。请你从 nums 中找出并返回总和为 target 的元素组合的个数。 题目数据保证答案符合 32 位整数范围。 示例 1: 输入:nums [1,2,3], target 4 输出:7 解释&#x…

【Linux】详解加锁实现线程互斥

一、多线程不加线程互斥可能会引发的问题 下面是一个抢标逻辑。抢票为什么会抢到负数:假设当票数为1时,此时四个进程的判断条件tickets都大于0,都会进入抢票操作,第一个进程抢完票以后tickets0并写回内存,第二个进程再…

Xcode进行真机测试时总是断连,如何解决?

嗨。大家好,我是兰若姐姐。最近我在用真机进行app自动化测试的时候,经常会遇到xcode和手机断连,每次断连之后需要重新连接,每次断开都会出现以下截图的报错 当这种情况出现时,之前执行的用例就相当于白执行了&#xff…

Adobe XD中文设置指南:专业设计师的现场解答

Adobe XD是世界领先的在线合作UI设计工具。它摆脱了Sketch、Figma等传统设计软件对设备的依赖,使设计师可以随时随地使用任何设备打开网页浏览器,轻松实现跨平台、跨时空的设计合作。然后,为了提高国内设计师的使用体验,Adobe XD如…