Python調(diào)用API的常用方式解析
一、引言
在數(shù)據(jù)開(kāi)發(fā)中,調(diào)用API是連接外部服務(wù)、獲取數(shù)據(jù)或?qū)崿F(xiàn)系統(tǒng)集成的核心方式之一。
最近由于阿里云ODPS安全限制問(wèn)題,處理了一批API調(diào)用的任務(wù),所以從原理、案例和優(yōu)缺點(diǎn)等維度,寫(xiě)一寫(xiě)python調(diào)用API的常用方式介紹。
二、常用方式介紹
Python調(diào)用API的主要方法可分為以下四類(lèi),每種方式的特點(diǎn)和適用場(chǎng)景有些許差異:
方法 | 原理 | 適用場(chǎng)景 |
---|---|---|
requests | 基于HTTP的第三方庫(kù),封裝GET/POST等請(qǐng)求方法,提供簡(jiǎn)潔的API調(diào)用接口。 | 常規(guī)HTTP請(qǐng)求、快速開(kāi)發(fā)、數(shù)據(jù)交互 |
http.client | Python內(nèi)置HTTP庫(kù),需手動(dòng)構(gòu)建請(qǐng)求頭和報(bào)文,精細(xì)控制請(qǐng)求的場(chǎng)景。 | 低層級(jí)操作、兼容性要求高 |
urllib | 標(biāo)準(zhǔn)庫(kù)模塊,包含urllib.request等子模塊,基礎(chǔ)核心。 | 簡(jiǎn)單請(qǐng)求、無(wú)需依賴第三方庫(kù)的場(chǎng)景 |
aiohttp | 基于異步IO的HTTP庫(kù),通過(guò)協(xié)程實(shí)現(xiàn)非阻塞請(qǐng)求,適用高并發(fā)場(chǎng)景。 | 異步編程、高并發(fā)API調(diào)用 |
三、實(shí)現(xiàn)與案例
1.requests
- ?原理?:通過(guò)封裝HTTP請(qǐng)求方法,簡(jiǎn)化參數(shù)傳遞和響應(yīng)處理,自動(dòng)處理URL編碼、連接池管理和響應(yīng)解析,支持JSON解析、Session會(huì)話、文件上傳等功能。
- 優(yōu)點(diǎn)?:代碼簡(jiǎn)潔、功能全面
- 缺點(diǎn)?:請(qǐng)求IO密集型場(chǎng)景效率較低
import requests def get_github_user(username): """ 使用requests庫(kù)調(diào)用GitHub API獲取用戶信息 """ # 構(gòu)造API請(qǐng)求 url = f"https://api.github.com/users/{username}" try: # 發(fā)送GET請(qǐng)求(自動(dòng)處理連接和關(guān)閉) response = requests.get(url, timeout=5) # 檢查HTTP狀態(tài)碼 if response.status_code == 200: # 解析JSON響應(yīng)數(shù)據(jù) user_data = response.json() return { "name": user_data.get("name"), "location": user_data.get("location"), "public_repos": user_data.get("public_repos") } else: print(f"請(qǐng)求失敗,狀態(tài)碼:{response.status_code}") except requests.exceptions.RequestException as e: print(f"請(qǐng)求異常:{str(e)}") # 調(diào)用示例 if __name__ == "__main__": print(get_github_user("octocat")) # GitHub官方測(cè)試賬號(hào)
2.http.client
- 原理?:內(nèi)置的底層HTTP客戶端庫(kù),手動(dòng)管理連接生命周期和報(bào)文頭構(gòu)造,適合需要精細(xì)控制HTTP協(xié)議的場(chǎng)景
- 優(yōu)點(diǎn)?:直接可用、細(xì)粒度控制
- 缺點(diǎn)?:代碼冗長(zhǎng)、需手動(dòng)處理編碼和連接
import http.client import json def get_httpbin_data(): """ 使用http.client獲取httpbin測(cè)試數(shù)據(jù) """ # 創(chuàng)建對(duì)象 conn = http.client.HTTPSConnection("httpbin.org") try: # 發(fā)送GET請(qǐng)求 conn.request("GET", "/get") # 獲取響應(yīng)對(duì)象 response = conn.getresponse() # 讀取響應(yīng)體并解碼 data = response.read().decode('utf-8') # 解析JSON數(shù)據(jù) return json.loads(data) except Exception as e: print(f"請(qǐng)求異常:{str(e)}") finally: # 必須手動(dòng)關(guān)閉連接 conn.close() # 調(diào)用示例 if __name__ == "__main__": print(get_httpbin_data())
3.urllib(輕量級(jí)方案)
- 原理?:復(fù)合型HTTP工具,集成request/error/parse等模塊,適合簡(jiǎn)單請(qǐng)求和無(wú)需依賴的環(huán)境
- 優(yōu)點(diǎn)?:輕量級(jí)
- 缺點(diǎn)?:接口設(shè)計(jì)分散、缺少高級(jí)功能
from urllib.request import urlopen import json def get_user_agent(): """ 使用urllib獲取客戶端UA信息 """ url = "http://httpbin.org/user-agent" try: # 打開(kāi)連接,自動(dòng)處理HTTP/HTTPS with urlopen(url, timeout=5) as response: # 讀取并解析JSON數(shù)據(jù) return json.loads(response.read().decode()) except Exception as e: print(f"請(qǐng)求異常:{str(e)}") # 調(diào)用示例 if __name__ == "__main__": print(get_user_agent())
4.aiohttp(異步方案)
- 原理?:基于asyncio的異步HTTP客戶端,使用協(xié)程實(shí)現(xiàn)非阻塞IO操作,適合高并發(fā)場(chǎng)景(如爬蟲(chóng)、實(shí)時(shí)系統(tǒng))
- ?優(yōu)點(diǎn)?:高吞吐量、資源利用率高
- 缺點(diǎn)?:需要異步編程知識(shí)、調(diào)試復(fù)雜度高
import aiohttp import asyncio async def fetch_concurrent_data(): """ 使用aiohttp并發(fā)獲取多個(gè)API數(shù)據(jù) """ urls = [ "https://jsonplaceholder.typicode.com/posts/1", "https://jsonplaceholder.typicode.com/comments/1" ] # 創(chuàng)建共享會(huì)話(自動(dòng)管理連接池) async with aiohttp.ClientSession() as session: tasks = [] for url in urls: # 創(chuàng)建并發(fā)任務(wù) task = asyncio.create_task( session.get(url, timeout=aiohttp.ClientTimeout(total=3)) ) tasks.append(task) # 等待所有任務(wù)完成 responses = await asyncio.gather(*tasks) results = [] for response in responses: # 檢查響應(yīng)狀態(tài) if response.status == 200: data = await response.json() results.append(data) return results # 調(diào)用示例 if __name__ == "__main__": print(asyncio.run(fetch_concurrent_data()))
四、總結(jié)對(duì)比
方法 | 適用場(chǎng)景 | 性能表現(xiàn) | 難度 |
---|---|---|---|
requests | 常規(guī)REST API調(diào)用 | ★★★★☆ | 簡(jiǎn)單 |
http.client | 底層協(xié)議控制 | ★★☆☆☆ | 中等 |
urllib | 簡(jiǎn)單請(qǐng)求/無(wú)依賴環(huán)境 | ★★★☆☆ | 簡(jiǎn)單 |
aiohttp | 高并發(fā)/異步任務(wù) | ★★★★★ | 復(fù)雜 |
到此這篇關(guān)于Python調(diào)用API的常用方式解析的文章就介紹到這了,更多相關(guān)Python調(diào)用API方式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python的pdb調(diào)試命令的命令整理及實(shí)例
這篇文章主要介紹了python的pdb調(diào)試命令的命令整理及實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-07-07python光學(xué)仿真面向?qū)ο蠊鈱W(xué)元件類(lèi)的實(shí)現(xiàn)
這篇文章主要為大家介紹了python光學(xué)仿真面向?qū)ο蠊鈱W(xué)元件類(lèi)的實(shí)現(xiàn)示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2021-10-10Python制作動(dòng)態(tài)字符畫(huà)的源碼
python字符畫(huà)是一個(gè)簡(jiǎn)單有趣的圖畫(huà),它一般由程序制作而成,接下來(lái)通過(guò)本文給大家分享Python制作動(dòng)態(tài)字符畫(huà)的源碼,需要的朋友可以參考下2021-08-08Python 如何將integer轉(zhuǎn)化為羅馬數(shù)(3999以內(nèi))
這篇文章主要介紹了Python 將integer轉(zhuǎn)化為羅馬數(shù)(3999以內(nèi))的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06django框架基于queryset和雙下劃線的跨表查詢操作詳解
這篇文章主要介紹了django框架基于queryset和雙下劃線的跨表查詢操作,結(jié)合實(shí)例形式詳細(xì)分析了Django框架queryset和雙下劃線的跨表查詢相關(guān)實(shí)現(xiàn)技巧與操作注意事項(xiàng),需要的朋友可以參考下2019-12-12使用Python實(shí)現(xiàn)微信提醒備忘錄功能
最近工作比較繁雜,經(jīng)常忘事,有時(shí)候記了備忘錄結(jié)果卻忘記看備忘錄,但是微信是每天都會(huì)看的,于是就想到寫(xiě) 一個(gè)基于微信的提醒系統(tǒng)。這篇文章主要介紹了使用Python實(shí)現(xiàn)微信提醒備忘錄功能,需要的朋友可以參考下2018-12-12python計(jì)算數(shù)字或者數(shù)組的階乘的實(shí)現(xiàn)
本文主要介紹了python計(jì)算數(shù)字或者數(shù)組的階乘,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08Python中實(shí)現(xiàn)常量(Const)功能
這篇文章主要介紹了Python中實(shí)現(xiàn)常量(Const)功能,python語(yǔ)言本身沒(méi)有提供const,本文使用一個(gè)類(lèi)來(lái)實(shí)現(xiàn)常量定義功能,并介紹了使用方法,需要的朋友可以參考下2015-01-01