最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python網(wǎng)絡(luò)請求庫從?requests?到?httpx的遷移

 更新時間:2026年04月09日 08:42:52   作者:曦遠(yuǎn)Code  
文章介紹了Python庫httpx,它是requests的現(xiàn)代化替代品,原生支持異步,兼容requests API,支持HTTP/2和嚴(yán)格的超時管理,通過同步和異步示例對比,展示了httpx的優(yōu)勢,并提醒使用時注意異步相關(guān)的坑

前言

如果說 Python 有哪個庫改變了互聯(lián)網(wǎng)開發(fā)的門檻,requests 絕對榜上有名。

它用極簡的 API 終結(jié)了 urllib2 那個混亂的時代。

直到今天,requests.get(url) 依然是很多程序員下意識寫出的第一行爬蟲代碼。

但隨著 Python 異步生態(tài)(Asyncio)的全面爆發(fā),以及 HTTP/2 協(xié)議的普及,這個誕生于 2011 年的老兵開始顯露疲態(tài)。

PS:為什么 AI 時代還要親自鉆研新技術(shù)?

因?yàn)?AI 的底色是“過去”。

如果你不掌握先進(jìn)的工具,AI 就會用它的“經(jīng)驗(yàn)慣性”把你留在舊時代。

只有你懂新東西,才能指揮 AI 寫出更現(xiàn)代的代碼。

AI 的本質(zhì)是“概率模型”,它更傾向于給出訓(xùn)練數(shù)據(jù)中最常見、最保守的方案(往往也就是舊方案)

HttpX

httpx 并不是要推翻 requests,而是要完成它的現(xiàn)代化改造。它的核心口號是:“幾乎完全兼容 Requests API,但原生支持異步。”

新項(xiàng)目切換到 httpx 的理由:

  • 原生異步支持: 在處理成千上萬個 API 調(diào)用時,同步的 requests 會讓你的程序在等待網(wǎng)絡(luò) IO 時“死掉”。而 httpx 配合 async/await,可以在一秒鐘內(nèi)并發(fā)處理極高密度的請求,而不消耗多余的線程資源。
  • 支持 HTTP/2: 相比 HTTP/1.1,HTTP/2 支持多路復(fù)用。這意味著在同一個連接上可以并行發(fā)送多個請求,大幅降低了延遲。
  • 嚴(yán)格的超時管理: requests 默認(rèn)永不超時,這在生產(chǎn)環(huán)境中是極其危險(xiǎn)的。而 httpx 默認(rèn)開啟超時檢查,更加符合現(xiàn)代微服務(wù)的健壯性要求。

例子

如果你熟悉 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:
        # 同時發(fā)起多個請求,效率起飛
        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())

對比

特性RequestsHTTPX
異步支持? (需借助線程池)原生支持 (Async/Await)
HTTP/2?支持
API 友好度極高極高 (兼容 Requests)
類型提示一般完善 (完美契合 IDE)
適用場景簡單腳本、小型爬蟲Web 異步框架、高并發(fā)采集、現(xiàn)代化工程

小結(jié)

異步雖然好用,但有些坑:

  • httpx 的 AsyncClient 最好使用 async with 上下文管理器,否則容易造成連接泄露。
  • 在 Windows 環(huán)境下使用異步 loop 要額外注意(如 SelectorEventLoop 的限制)

補(bǔ)充知識:

從 requests 到 httpx 的遷移,不僅僅是換一個庫,更是一次從同步異步、從 HTTP/1.1 到 HTTP/2 的性能與架構(gòu)升級。

為了方便你快速理解和決策,這里先用一個表格直觀對比兩者的核心差異:

特性requestshttpx
核心定位同步HTTP庫,API簡潔優(yōu)雅新一代HTTP客戶端,同時支持同步和異步API
異步支持? 不支持? 支持 (httpx.AsyncClient)
HTTP/2? 不支持? 支持 (需安裝httpx[http2])
連接池通過 requests.Session 實(shí)現(xiàn)內(nèi)置更高效的 httpx.Client 和 httpx.AsyncClient
默認(rèn)超時?? 無默認(rèn)超時,需手動設(shè)置? 默認(rèn)5秒(連接、讀取、寫入等各階段)
重定向自動跟隨需顯式設(shè)置 follow_redirects=True
API兼容性-與 requests 高度相似,代碼修改成本低

?? 為什么選擇 httpx?

選擇 httpx 絕不僅僅是為了“追新”,它解決了許多 requests 在實(shí)際生產(chǎn)中的痛點(diǎn):

  • 性能飛躍:對于I/O密集型任務(wù)(如爬蟲、調(diào)用多個API),使用 httpx 的異步客戶端可以成倍提升效率。在本地測試中,發(fā)送1000個請求,httpx 異步比 requests 同步快了約6倍。
  • 現(xiàn)代化的協(xié)議支持requests 基于 urllib3,僅支持 HTTP/1.1。而 httpx 支持 HTTP/2,其多路復(fù)用特性可以在一個連接上并發(fā)處理多個請求,有效降低延遲。
  • 更健壯的默認(rèn)配置requests 的一個常見“坑”是默認(rèn)不設(shè)置超時,可能導(dǎo)致請求無限期掛起。httpx 默認(rèn)設(shè)置了5秒超時,使程序更加健壯。

?? 如何從 requests 遷移到 httpx?

好消息是,httpx 在設(shè)計(jì)上充分考慮了與 requests 的兼容性,遷移路徑非常平滑。

1. 基礎(chǔ)用法替換

絕大多數(shù)情況下,你只需要把代碼中的 requests 替換為 httpx 即可。例如,一個簡單的 GET 請求:

# 使用 requests
import requests
resp = requests.get('https://api.example.com/data')
print(resp.json())
# 使用 httpx (同步方式)
import httpx
resp = httpx.get('https://api.example.com/data')
print(resp.json())

POST 請求的 json 和 data 參數(shù)用法也完全一致-3

2. 使用連接池優(yōu)化性能

如果你需要復(fù)用TCP連接(比如頻繁請求同一個網(wǎng)站),requests 使用 Session,而 httpx 則使用 Client

# requests
with requests.Session() as session:
    session.get('https://api.example.com/user')
    session.post('https://api.example.com/post', json={'key': 'value'})
# httpx
with httpx.Client() as client:
    client.get('https://api.example.com/user')
    client.post('https://api.example.com/post', json={'key': 'value'})

3. 進(jìn)階:擁抱異步,釋放并發(fā)潛力

這是 httpx 的核心優(yōu)勢。當(dāng)需要同時獲取100個網(wǎng)頁時,異步的優(yōu)勢盡顯無疑:

import httpx
import asyncio
async def fetch_data(url):
    async with httpx.AsyncClient() as client:
        resp = await client.get(url)
        return resp.json()
async def main():
    urls = ['https://api.example.com/item/1', 'https://api.example.com/item/2'] # ... 更多URL
    tasks = [fetch_data(url) for url in urls]
    results = await asyncio.gather(*tasks)
    print(f"成功獲取 {len(results)} 個結(jié)果")
asyncio.run(main())

4. 開啟 HTTP/2 支持

在安裝時選擇 http2 額外依賴,并在創(chuàng)建客戶端時簡單配置即可享受 HTTP/2 帶來的性能提升:

pip install httpx[http2]
with httpx.Client(http2=True) as client:
    resp = client.get('https://cloud.google.com') # 支持HTTP/2的網(wǎng)站
    print(resp.http_version) # 輸出: HTTP/2

?? 需要注意的幾個關(guān)鍵區(qū)別

雖然API高度相似,但有幾個行為差異是遷移時容易忽略的:

  • 重定向不再自動requests 會自動跟隨重定向,而 httpx 需要顯式聲明:client.get(url, follow_redirects=True)。
  • 超時設(shè)置更嚴(yán)格httpx 的5秒默認(rèn)超時可能會讓之前依賴無限等待的代碼報(bào)錯,建議在開發(fā)測試階段關(guān)注這一點(diǎn),并根據(jù)實(shí)際情況調(diào)整超時時間。

?? 總結(jié)

  • 繼續(xù)使用 requests:如果你只是在寫一個簡單的腳本,或者項(xiàng)目完全不需要異步和高性能,requests 依然是一個穩(wěn)定且優(yōu)秀的選擇。
  • 升級到 httpx:如果你的應(yīng)用需要處理高并發(fā)的網(wǎng)絡(luò)請求、需要HTTP/2支持、或者你正在使用 FastAPI 等異步框架,那么從 requests 切換到 httpx 是順應(yīng)趨勢的明智之選。它不僅功能更強(qiáng)大,也代表了Python HTTP客戶端未來的方向。

建議:你可以在新項(xiàng)目中直接嘗試使用 httpx。對于已有項(xiàng)目,可以評估一下是否有性能瓶頸,再決定是否逐步替換。

到此這篇關(guān)于Python網(wǎng)絡(luò)請求庫,從 requests 到 httpx的文章就介紹到這了,更多相關(guān)Python網(wǎng)絡(luò)請求庫內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 推薦Python小白理想的IDE編輯器thonny

    推薦Python小白理想的IDE編輯器thonny

    這篇文章主要為大家介紹了推薦一款Python編輯器thonny,非常適合Python使用,具體原因文中給出詳細(xì)說明,希望能夠有所幫助,祝大家多多進(jìn)步
    2021-10-10
  • Python曲線擬合多項(xiàng)式深入詳解

    Python曲線擬合多項(xiàng)式深入詳解

    這篇文章主要給大家介紹了關(guān)于Python使用scipy進(jìn)行曲線擬合的相關(guān)資料,Scipy優(yōu)化和擬合采用的是optimize模塊,該模塊提供了函數(shù)最小值(標(biāo)量或多維)、曲線擬合和尋找等式的根的有用算法,需要的朋友可以參考下
    2022-11-11
  • 詳解Python之?dāng)?shù)據(jù)序列化(json、pickle、shelve)

    詳解Python之?dāng)?shù)據(jù)序列化(json、pickle、shelve)

    本篇文章主要介紹了Python之?dāng)?shù)據(jù)序列化,本節(jié)要介紹的就是Python內(nèi)置的幾個用于進(jìn)行數(shù)據(jù)序列化的模塊,有興趣的可以了解一下。
    2017-03-03
  • Python基于datetime或time模塊分別獲取當(dāng)前時間戳的方法實(shí)例

    Python基于datetime或time模塊分別獲取當(dāng)前時間戳的方法實(shí)例

    今天小編就為大家分享一篇關(guān)于Python基于datetime或time模塊分別獲取當(dāng)前時間戳的方法實(shí)例,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-02-02
  • numpy 產(chǎn)生隨機(jī)數(shù)的幾種方法

    numpy 產(chǎn)生隨機(jī)數(shù)的幾種方法

    本文主要介紹了numpy 產(chǎn)生隨機(jī)數(shù)的幾種方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • numpy之sum()的使用及說明

    numpy之sum()的使用及說明

    這篇文章主要介紹了numpy之sum()的使用及說明,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • 用python生成mysql數(shù)據(jù)庫結(jié)構(gòu)文檔

    用python生成mysql數(shù)據(jù)庫結(jié)構(gòu)文檔

    大家好,本篇文章主要講的是用python生成mysql數(shù)據(jù)庫結(jié)構(gòu)文檔,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-01-01
  • Python中str.join()簡單用法示例

    Python中str.join()簡單用法示例

    這篇文章主要介紹了Python中str.join()簡單用法,結(jié)合實(shí)例形式分析了Python中str.join()用于連接生成新字符串的相關(guān)操作技巧,需要的朋友可以參考下
    2018-03-03
  • 基于Python實(shí)現(xiàn)簡單的漢字拼音轉(zhuǎn)換工具

    基于Python實(shí)現(xiàn)簡單的漢字拼音轉(zhuǎn)換工具

    將漢字轉(zhuǎn)為拼音,可以用于批量漢字注音、文字排序、拼音檢索文字等常見場景。現(xiàn)在互聯(lián)網(wǎng)上有許多拼音轉(zhuǎn)換工具,基于Python的開源模塊也不少,本文將利用pypinyin模塊制作簡單的漢字拼音轉(zhuǎn)換工具,感興趣的可以了解一下
    2022-09-09
  • Python3 合并二叉樹的實(shí)現(xiàn)

    Python3 合并二叉樹的實(shí)現(xiàn)

    這篇文章主要介紹了Python3 合并二叉樹的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09

最新評論

大埔区| 长寿区| 东乡族自治县| 常州市| 阿勒泰市| 荆州市| 贺州市| 佛坪县| 财经| 保定市| 乾安县| 杭州市| 郧西县| 扬州市| 广昌县| 嘉善县| 乌兰察布市| 灵石县| 佛教| 贡山| 绥中县| 大余县| 磴口县| 阿拉尔市| 金湖县| 娱乐| 云南省| 安陆市| 泗洪县| 唐山市| 墨脱县| 防城港市| 云和县| 齐齐哈尔市| 石城县| 北辰区| 平南县| 任丘市| 红原县| 香河县| 应城市|