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ú)需依賴(lài)第三方庫(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ì)話(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獲取用戶(hù)信息
"""
# 構(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客戶(hù)端庫(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ú)需依賴(lài)的環(huán)境
- 優(yōu)點(diǎn)?:輕量級(jí)
- 缺點(diǎn)?:接口設(shè)計(jì)分散、缺少高級(jí)功能
from urllib.request import urlopen
import json
def get_user_agent():
"""
使用urllib獲取客戶(hù)端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客戶(hù)端,使用協(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ì)話(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ú)依賴(lài)環(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)文章
Django數(shù)據(jù)庫(kù)遷移報(bào)錯(cuò)InconsistentMigrationHistory
最近在使用Django,學(xué)習(xí)了一下Django數(shù)據(jù)庫(kù)遷移,在執(zhí)行遷移命令時(shí),突然報(bào)錯(cuò),本文就總結(jié)了一下原因,感興趣的小伙伴們可以參考一下2021-05-05
詳解在python中如何使用zlib模塊進(jìn)行數(shù)據(jù)壓縮和解壓縮
Python有一些內(nèi)置庫(kù)用于處理數(shù)據(jù)壓縮和解壓縮,其中一個(gè)就是zlib模塊,這個(gè)模塊為DEFLATE壓縮算法和相關(guān)的gzip(文件格式)提供了支持,在這篇文章中,我們將深入探討如何使用zlib模塊進(jìn)行數(shù)據(jù)壓縮和解壓縮2023-06-06
Python自動(dòng)化之批量生成含指定數(shù)據(jù)的word文檔
在平時(shí)工作當(dāng)中,經(jīng)常需要處理文件,特別是Word,我們常常會(huì)機(jī)械的重復(fù)打開(kāi)、修改、保存文檔等一系列操作。本文將主要介紹如何通過(guò)Python批量生成含指定數(shù)據(jù)的word文檔,感興趣的同學(xué)可以來(lái)看一看2021-11-11
Python實(shí)現(xiàn)url長(zhǎng)短鏈接的轉(zhuǎn)換
短鏈接,通俗來(lái)說(shuō),就是將長(zhǎng)的URL網(wǎng)址,通過(guò)程序計(jì)算等方式,轉(zhuǎn)換為簡(jiǎn)短的網(wǎng)址字符串。本文將用Python語(yǔ)言實(shí)現(xiàn)這一效果,需要的可以參考一下2022-11-11
python zip,lambda,map函數(shù)代碼實(shí)例
這篇文章主要介紹了python zip,lambda,map函數(shù)代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04
keras .h5轉(zhuǎn)移動(dòng)端的.tflite文件實(shí)現(xiàn)方式
這篇文章主要介紹了keras .h5轉(zhuǎn)移動(dòng)端的.tflite文件實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-05-05
虛擬環(huán)境下pythonDjango項(xiàng)目配置pycharm運(yùn)行/debugger運(yùn)行全過(guò)程
本文介紹了在虛擬環(huán)境下,如何通過(guò)命令行和PyCharm配置并啟動(dòng)Python Django項(xiàng)目的詳細(xì)步驟,包括虛擬環(huán)境創(chuàng)建與激活、依賴(lài)安裝、PyCharm解釋器與參數(shù)設(shè)置,以及項(xiàng)目正常和調(diào)試運(yùn)行的方法2025-10-10
手把手教你實(shí)現(xiàn)Python連接數(shù)據(jù)庫(kù)并快速取數(shù)的工具
在數(shù)據(jù)生產(chǎn)應(yīng)用部門(mén),取數(shù)分析是一個(gè)很常見(jiàn)的需求,實(shí)際上業(yè)務(wù)人員需求時(shí)刻變化,最高效的方式是讓業(yè)務(wù)部門(mén)自己來(lái)取。本文就來(lái)手把手教大家搭建一個(gè)?Python?連接數(shù)據(jù)庫(kù),快速取數(shù)工具,需要的可以參考一下2022-11-11

