Python网络请求库,从 requests 到 httpx
Requests早该退休了,httpx这老古董才配活在异步时代?HTTP/2和超时?这些基本配置requests早该有。异步支持原生?别逗了,这年头谁还用同步。
目录7 个章节
前言
如果说 Python 有哪个库改变了互联网开发的门槛,requests 绝对榜上有名。
它用极简的 API 终结了 urllib2 那个混乱的时代。
直到今天,requests.get(url) 依然是很多程序员下意识写出的第一行爬虫代码。
但随着 Python 异步生态(Asyncio)的全面爆发,以及 HTTP/2 协议的普及,这个诞生于 2011 年的老兵开始显露疲态。
PS:为什么 AI 时代还要亲自钻研新技术?
因为 AI 的底色是“过去”。
如果你不掌握先进的工具,AI 就会用它的“经验惯性”把你留在旧时代。
只有你懂新东西,才能指挥 AI 写出更现代的代码。
AI 的本质是“概率模型”,它更倾向于给出训练数据中最常见、最保守的方案(往往也就是旧方案)
HttpX
httpx 并不是要推翻 requests,而是要完成它的现代化改造。它的核心口号是:“几乎完全兼容 Requests API,但原生支持异步。”
新项目切换到 httpx 的理由:
- 原生异步支持: 在处理成千上万个 API 调用时,同步的
requests会让你的程序在等待网络 IO 时“死掉”。而httpx配合async/await,可以在一秒钟内并发处理极高密度的请求,而不消耗多余的线程资源。 - 支持 HTTP/2: 相比 HTTP/1.1,HTTP/2 支持多路复用。这意味着在同一个连接上可以并行发送多个请求,大幅降低了延迟。
- 严格的超时管理:
requests默认永不超时,这在生产环境中是极其危险的。而httpx默认开启超时检查,更加符合现代微服务的健壮性要求。
例子
如果你熟悉 requests,迁移到 httpx 的成本几乎为零。
同步写法对比(几乎一致)
# Requests
import requests
resp = requests.get("https://api.github.com/events")
# HTTPX
import httpx
resp = httpx.get("https://api.github.com/events")
异步写法
import httpx
import asyncio
async def fetch_tech_news():
async with httpx.AsyncClient() as client:
# 同时发起多个请求,效率起飞
tasks = [client.get(f"https://news.com/api/{i}") for i in range(10)]
responses = await asyncio.gather(*tasks)
return [r.json() for r in responses]
asyncio.run(fetch_tech_news())
对比
| 特性 | Requests | HTTPX |
|---|---|---|
| 异步支持 | ❌ (需借助线程池) | ✅ 原生支持 (Async/Await) |
| HTTP/2 | ❌ | ✅ 支持 |
| API 友好度 | 极高 | 极高 (兼容 Requests) |
| 类型提示 | 一般 | ✅ 完善 (完美契合 IDE) |
| 适用场景 | 简单脚本、小型爬虫 | Web 异步框架、高并发采集、现代化工程 |
小结
异步虽然好用,但有些坑:
httpx的AsyncClient最好使用async with上下文管理器,否则容易造成连接泄露。- 在 Windows 环境下使用异步 loop 要额外注意(如
SelectorEventLoop的限制)
_EOF_
Python网络请求库,从 requests 到 httpx
- 本文作者:
- 程序设计实验室
- 版权声明:
- 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
相关文章
手写核心价值观编码工具-Python实现
前言 今天是五一劳动节,祝各位无产阶级劳动者节日快乐! 然后来整活分享一些有趣的东西~ 这个小工具是我大学时做着玩的,对于各位接班人来说,12个词的核心价值观这东西,大家都非常熟悉了,这工具可以实现将一段话编码为核心价值观实现加密,同时也能将密文解密出来。 为啥要做这个呢,隔太久不太记得了,~~好像是因为游戏里喷队友老是被屏蔽,灵机一动,要是换成和谐的文字不就不会被屏蔽了吗(误~~ 实现原理 简单
2022-05-01 · Python · 约 1 分钟
Python接入企业微信推送信息到内部群里
前言 之前一篇文章提到了使用wechatpy库来实现企业微信应用登录:Django + Taro 前后端分离项目实现企业微信登录 其实这个库可以实现的功能非常多,基本微信开发涉及到的功能都能实现。 本文介绍一个很常用的场景:实时推送信息到企业微信群里。 安装 首先安装wechatpy库 pip install wechatpy 如果运行的时候提示需要安装其他库(比如加解密相关的)那就按照提示安装,
2022-04-08 · Python · 约 1 分钟
升级pip之后连pip都不能用了?简单解决方法
前言 最近在服务器上部署项目的时候,用pip安装库,结果提示可以升级,那我就按照提示升级了pip,结果pip就用不了了。 错误信息如下: Traceback (most recent call last): File /usr/bin/pip3, line 9, in module from pip import main ImportError: cannot import name
2021-12-18 · Python · 约 1 分钟
Python-本地时间和UTC时间转换
代码 import time import datetime def utc2local(utc_st): UTC时间转本地时间(+8: 00) now_stamp = time.time() local_time = datetime.datetime.fromtimestamp(now_stamp) utc_time = datetime.datetime.ut
2021-12-18 · Python · 约 1 分钟
讨论
共 0 条加载评论中…