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踩坑:类与类对象类型参数传递与使用
前言 对初学者来说,Python确实简单好用,毕竟动态类型语言,不用定义就可以拿来用,类型之间随意转换简直不要太方便,因此Python用来写写小脚本,爬虫程序什么的,没什么问题。 不过,一旦用来开发稍微大型一点的项目,例如搭建一个Web应用,就会遇到一些问题,一般缺乏经验的人都会陷入某些坑中。= =... 坑 先说坑,函数参数类型是一坑,类与类的对象这又是一坑。 虽然之前用其他静态类型语言(例如C
2022-05-27 · 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 分钟
Python实现给图片加水印功能
前言 最近忙得连轴转,很久没更新博客了,代码倒是没啥写,积累了好些东西,接下来一有时间就来更新吧~ 本文记录使用Python实现给图片添加水印的功能实现过程 先看效果 把公众号的封面作为素材 原图是这样的 codelab 加个水印的效果 temp 实现代码 主要实现是参考GitHub上一个项目的:https://github.com/2Dou/watermarker 用到了Pillow库,使用前请
2022-09-29 · Python · 约 1 分钟
Python数据展示 - 生成表格图片
前言 前一篇文章介绍了推送信息到企业微信群里,其中一个项目推送的信息是使用Python自动生成的表格,本文来讲讲如何用Python生成表格图片。 选一个合适库 Python最大的优点就是第三方库丰富,基本你要什么功能,都能找到别人实现好的库,几行代码一调用就完事了。 Pytable 项目地址:https://github.com/HiroshiARAKI/pytable 最先找到的是日本人开发的p
2022-04-09 · Python · 约 1 分钟
讨论
共 0 条加载评论中…