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 许可协议。转载请注明出处!
相关文章
配置pip国内镜像加快python第三方库安装速度~
现在这网络对于开发者来说有点不太友好,下载什么东西都慢慢,pip install慢,git clone也慢,难受…… 不过还好有各种代替的国内镜像源可以加速 临时配置 在使用pip的时候加参数-i https://pypi.tuna.tsinghua.edu.cn/simple 例如:pip install -i https://pypi.tuna.tsinghua.edu.cn/simple d
2022-11-12 · Python · 约 1 分钟
Python创建压缩文件
代码实现 # 创建一个目录来保存这些东西 temp_path = os.path.join(settings.MEDIA_ROOT, 'temp', str(uuid.uuid4())) os.makedirs(temp_path) # 创建压缩文件 archive_path = os.path.join(temp_path, 'archive.zip') with zipfile.ZipFile
2022-09-30 · Python · 约 1 分钟
Python:使用logging模块记录日志
先看看基本用法例子 # -*- coding: utf-8 -*- import logging import sys # 获取logger实例,如果参数为空则返回root logger logger = logging.getLogger(AppName) # 指定logger输出格式 formatter = logging.Formatter('%(asctime)s %(levelna
2022-05-27 · Python · 约 1 分钟
我用Qt和Python开发了一个视频合并工具
想合并视频,但是却找不到比较好用的工具,很多都要收费,我想着「这破功能还得收费?」,于是决定自己搞一个,一开始用Python做了一个,效果还不错,完美完成了我的视频合并任务,不过没有图形界面,想分享给朋友一起用也没办法,于是昨天用Qt写了个图形界面套上去,中间还是遇到一些问题的,通过这篇文章记录一下。 软件的界面就是这样啦,用Qt Designer随便拖出来的,和VS拖控件也差不了多少。 用起来挺
2021-12-18 · Python · 约 1 分钟
讨论
共 0 条加载评论中…