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

news2024/12/24 21:34:51

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

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


神奇的 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 httpx

response = httpx.get('https://jsonplaceholder.typicode.com/posts/1')
print(response.status_code)
print(response.json())

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

发送一个 POST 请求

import httpx

data = {
    '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 httpx

try:
    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 asyncio

async 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 asyncio

async 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 httpx

client = httpx.Client(http2=True)
response = client.get('https://www.google.com')
print(response.http_version)  # 输出: 'HTTP/2'

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

import httpx

proxies = {
    '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 httpx

client = 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.coloradmin.cn/o/1945491.html

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

相关文章

项目实战二

Git 服务器 公共代码平台GitLab 配置gitlab 1.设置管理员帐号密码 2.让程序员传代码到20主机上需要配置: 创建用户 mark 1234.com 创建用户组devops 然后把mark 添加到devons 创建项目 http://192.168.88.20/devops/myproject.git 3.客户端操作&#x…

【Linux】—— 进程的基本概念、PCB、fork

🌏博客主页:PH_modest的博客主页 🚩当前专栏:Linux跬步积累 💌其他专栏: 🔴 每日一题 🟡 C跬步积累 🟢 C语言跬步积累 🌈座右铭:广积粮&#xff0…

数据结构之二叉树详解及遍历算法(C/C#/C++)

文章目录 一、二叉树的基本概念二、二叉树的遍历1. 前序遍历2. 中序遍历3. 后序遍历 三、C语言实现四、C#语言实现五、C语言实现总结 当涉及到数据结构中的二叉树及其遍历方式时,了解如何正确操作和遍历二叉树是至关重要的。以下是关于二叉树及其三种常见遍历方式&a…

现实版的《农夫与蛇》,我给你三连支持,你说我限你流。给你提供资源,你背后骂我们?

文章目录 一、如何上热榜&#xff1f;农夫与蛇的故事1.1 故事之始——遇见“蛇”1.2 退群后——反咬“农夫” 二、事情大发展&#xff01;“我要轰炸你”&#xff01;三、报警不成就开始写文章污蔑四、关于技术交流群五、关于&#x1f34a;易编橙终身成长社群</font> 一、…

ActiViz实战:二维纹理贴图vtkTexture

文章目录 一、效果预览二、基本概念三、功能特性四、与C++不同五、完整示例代码一、效果预览 二、基本概念 vtkTexture是VTK(Visualization Toolkit)中用于纹理映射的一个类,它允许用户将二维图像(纹理)贴到三维物体的表面上,从而增加场景的真实感和细节。 纹理映射:是一…

【JavaEE初阶】线程的状态

目录 &#x1f4d5; 线程的状态 &#x1f333; 观察线程的所有状态 &#x1f6a9; NEW 状态 &#x1f6a9; TERMINATED 状态 &#x1f6a9; RUNNABLE 就绪状态 &#x1f6a9; WAITING 状态 &#x1f6a9; TIME_WAITING 状态 &#x1f6a9; BLOCKED 状态 &#x1f384;…

SpringCLoud OpenFeign的使用介绍

Spring Cloud OpenFeign使用介绍 文章目录 Spring Cloud OpenFeign使用介绍导引1. 简单介绍2. 操作方式3. 参数传递3.1 传递单个参数3.2 传递多个参数3.3 传递对象3.4 传递JSON类型参数 4. 最佳实践 导引 在之前的文章中&#xff0c;我们使用过RestTemplate来进行远程调用&…

云动态摘要 2024-07-23

给您带来云厂商的最新动态,最新产品资讯和最新优惠更新。 最新优惠与活动 数据库上云优选 阿里云 2024-07-04 RDS、PolarDB、Redis、MongoDB 全系产品新用户低至首年6折起! [免费体验]智能助手ChatBI上线 腾讯云 2024-07-02 基于混元大模型打造,可通过对话方式生成可视化…

docker笔记4-部署

docker笔记4-部署 一、部署nginx二、部署Tomcat三、部署ESKibana3.1 部署ES3.2 部署kibana 一、部署nginx docker search nginx #搜索nginx的最新版本docker pull nginx #这里可以指定nginx版本&#xff0c;如果不指定&#xff0c;那么就拉取最新版本latestdocker run -d --na…

pikachu Fileinclusion(local)

随便选择一个都试试 发现url上数字会变 发现文件名确实是file1.php~file5.php 那么会不会还有别的burp抓包选中数字 设置6-100的爆破 strat attack 678异常还有个100也是 先改一下试试看 其他的会报错 但是通过这我们可以得到路径 先写一个 下一步 读取系统文件 windows系统肯定…

TCP客户端connect断线重连

文章目录 TCP客户端connect断线重连1、为什么要断线重连2、实现代码 TCP客户端connect断线重连 1、为什么要断线重连 客户端会面临服务器崩溃的情况&#xff0c;我们可以试着写一个客户端重连的代码&#xff0c;模拟并理解一些客户端行为&#xff0c;比如游戏客户端等. 考虑到…

并发编程面试题0

并发编程 1、并行和并发有什么区别&#xff1f; 并行和并发都是指多个任务同时执行的概念&#xff0c;但是它们之间有着明显的区别 并行&#xff1a;多个任务在同一时间同时执行&#xff0c;通常需要使用多个处理器或者多核处理器来实现。例如&#xff0c;一个多核CPU的计算机…

国内大陆地区huggingface连接不上的解决方案

简介 本文主要介绍国内大陆地区huggingface连接不上的解决方案,希望能对学习大模型的同学们有所帮助。 1. 背景 最近有不少同学反应无法正常下载huggingface的模型文件,亲自尝试使用git clone下载huggingface上的大模型文件时,也同样无法正常下载,以Meta-Llama-3-8B为例…

美食地图开发

调用地图接口展示数据库录入的不同类别地址信息&#xff0c;提供导航服务&#xff0c;手机端电脑端自适应。 语音介绍使用微软的tts接口可选不同语音性别生成

【数据结构】AVL树(图文解析 + 代码实现)

目录 1、AVL树的概念 2、AVL树结点的定义 3、AVL树的插入 4、AVL树的旋转 4.1 左单旋 4.2 右单旋 4.3 右左双旋 4.4 左右双旋 5、AVL树的验证 6、AVL树的性能 前面对map/multimap/set/multiset进行了简单的介绍&#xff0c;会大仙&#xff0c;这几个容器有个共同点是…

力扣 二分查找

二分查找基础篇。 题目 class Solution {public int searchInsert(int[] nums, int target) {int l 0, r nums.length - 1;while(l < r) {int mid l((r-l)>>1);//(lr)/2if(nums[mid]<target)lmid1;else rmid-1;}return l;//处理边界&#xff0c;设定数组的左半…

剪画小程序:相册里的视频变成微信动图表情包,很简单!

Hello&#xff0c;各位小伙伴们好啊&#xff01; 今天小画告诉大家怎么把微信里的视频变成微信专属表情包 让你的聊天变得更加有趣&#xff01; 一、首先&#xff0c;我们要将那些有趣的视频保存到手机相册里 在微信聊天时遇到眼前一亮的视频或在短视频平台上刷到的有趣的视…

linux虚拟机主机配置网卡

问题复现 我的虚拟主机了连不上远程工具windTerm ,但是我的另一台虚拟主机可以连上 我的解决思路 ping ip 地址 发现能够 ping 通 查看 ifconfig 配置信息 我对比另一个虚拟主机 发现了我的子网掩码netmask有问题 解决方式 第一种 连接配置 配置 ipv4.addresses 192.168.1…

JAVA毕业设计153—基于Java+Springboot+小程序的校园维修管理系统小程序(源代码+数据库)

毕设所有选题&#xff1a; https://blog.csdn.net/2303_76227485/article/details/131104075 基于JavaSpringboot小程序的校园维修管理系统小程序(源代码数据库)153 一、系统介绍 本项目分为用户、维修员、管理员三种角色 1、用户&#xff1a; 注册、登录、报修申报、报修…

顺序表和单链表的经典算法题

目录 前言 一、基础思想&#xff08;数组&#xff09; 1. 移除元素 2.删除有序元素的重复项 3.合并两个有序数组 二、单链表算法 1.移除链表元素 2.翻转链表 3.合并两个有序的链表 前言 Hello,小伙伴们&#xff0c;今天我们来做一个往期知识的回顾&#xff0c;今天我将…