如何将Python的requests库替换为httpx库进行网络请求?

摘要:前言 如果说 Python 有哪个库改变了互联网开发的门槛,requests 绝对榜上有名。 它用极简的 API 终结了 urllib2 那个混乱的时代。 直到今天,requests.get(url) 依然是很多程序员下意识写出的第一行爬虫
前言 如果说 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 的限制)