【筆記】用Python呼叫API (四):呼叫API模組化

閱讀時間約 10 分鐘
上一篇我們完成所有預定要呼叫API的程式,但因爲寫法結構導致不好管理,此篇會透過函式進行模組化,減少重覆的程式碼。

【筆記】用Python呼叫API (三):完成剩下的呼叫API 的內容

首先導入需要的套件

import requests
import json
from datetime import datetime
from bs4 import BeautifulSoup

API跟爬蟲畢竟不是一樣的東西,寫法不同,沒有重複部分,所以還是會分開寫

接著,定義函式(Function):

# 定義名為​usdt_twd_api的函式,這個函式可以接收三個數據
# 分別是url、headers、body,其中headers、body可以是空的
def usdt_twd_api(url, headers=None, body=None):
# 如果headers是空的,傳空字典
if headers is None:
headers = {}
# 如果body是空的,傳空字典
if body is None:
body = {}

if body:
# 如果body不是空的,requests使用post
response = requests.post(url, headers=headers, json=body)
else:
# 如果body是空的,requests使用get
response = requests.get(url, headers=headers)
# 因為GET跟POST的請求都是定義為response,所以無論是透過GET還是POST請求,都會返回到 response
return response

這裡我們用了def跟return,先透過def定義一個函式,函式回傳的結果可以透過return存在response,這個架構可以處理呼叫get、post方法的api,但我們這次只使用到get方法就是了

接下來,把請求的網址放上來:

# 定義一個變數名為 api_array,它用來放各個網址的陣列
api_array = [

{
"name": "ACE",
"url": "https://ace.io/polarisex/oapi/v2/list/tradePrice",
"headers": None,
"body" : None
},

{
"name": "MAX",
"url": "https://max-api.maicoin.com/api/v2/tickers",
"headers": None,
"body" : None
},

{
"name": "BitoPro",
"url": "https://api.bitopro.com/v3/tickers/usdt_twd",
"headers": None,
"body" : None
},
]

這裡用了陣列,呼叫由上到下依序呼叫,這樣如果需要加或是改,只要改這個位置就可以了

再來就是呼叫API跟處理每個API需要取出的值:

def process_response(api_name, data):
# ACE,USDT/TWD的資料結構處理
if api_name == "ACE":
specific_value = data.get("USDT/TWD").get("last_price")
return specific_value
# MAX,USDT/TWD的資料結構處理
if api_name == "MAX":
specific_value = data.get("usdttwd").get("last")
return specific_value
# BitoPro,USDT/TWD的資料結構處理
if api_name == "BitoPro":
specific_value = data.get("data").get("lastPrice")
return specific_value
#如果api_name 不是ACE、MAX、BitoPro,回傳None
return None

把所有三個交易所幣對價格取出的值都放在specific_value,底下加一個防呆,如果不是設定的三個交易所回None,因為如果不回任何東西,即便現在可能沒問題,但也會在未來某天修改別的地方時,出現不可預期的錯誤

接下來要開始把數據印出來了,先放上時間:

# 獲取當下時間
current_time = datetime.now()

# 格式化當下時間並印出
formatted_time = current_time.strftime("%Y-%m-%d %H:%M:%S")
print(f"\n請求時間:{formatted_time}\n")

這塊都沒改,就不講了

再來利用for迴圈逐一讀取api_array 這個我們上面放網址的陣列:

# 利用for迴圈遍歷​api_array內的url、headers、body
for api_info in api_array:
url = api_info["url"]
headers = api_info["headers"]
body = api_info["body"]
# ​定義一個變數為response,它調用了usdt_twd_api函式,函式裡面執行了API請求
# 數據資料來源是api_array,已透過for迴圈撈過一輪,包含url、headers、body
response = usdt_twd_api(url, headers=headers, body=body)

定義了api_info為for的變數,根據設定,我們可以拿api_info來處理API的相關資訊,包含url、headers、body

接下來就是響應是否成功跟逐一印出資料:

# 如果程式狀態回應是200,​那回應將會解析成json格式的數據,存在變數data中
if response.status_code == 200:
data = response.json()
# 定義一個變數,它調用了process_response函式,它是用來取值我們要的特定值
specific_value = process_response(api_info.get("name"), data)

# 檢查api_info中的name是否有ACE、MAX、BitoPro,如果有就進入那塊程式碼
if api_info.get("name") in ["ACE","MAX","BitoPro"]:
# 被轉成浮點數後,格式化限制為小數點三位
formatted_name="{:.3f}".format(float(specific_value))
# 印出api_info中name對應的值,分別是ACE、MAX、BitoPro,並印出設定小數點三位後的價格
print(f"{api_info.get('name')} 的USDT/TWD匯率: \n{formatted_name}")

else:
print("壞了,根本就不能用啊,ERROR CODE:",response.status_code)

ACE、MAX、BitoPro的數值會都需要格式化小數點三位的原因是,忘記是ACE還MAX,有些回傳的訊息如果小數點三位為0的話,會不顯示,為了好看,就都顯示三位,這樣長度就一樣了


最後再把前幾篇完成的爬蟲放在下面就完成了

# 獲取網頁的HTML內容
url = "https://rate.bot.com.tw/xrt?Lang=zh-TW"
response = requests.get(url)
html_doc = response.text

# 使用Beautiful Soup解析HTML內容
soup = BeautifulSoup(html_doc, 'html.parser')

# 找到該元素
element = soup.find('td', {'data-table': '本行即期賣出', 'class': 'rate-content-sight'})

# 提取出數字
number = element.text.strip()
formatted_number = "{:.3f}".format(float(number))
print(f"台灣銀行 的USD/TWD匯率:\n{formatted_number}\n")

結果:

raw-image


    19會員
    18內容數
    留言0
    查看全部
    發表第一個留言支持創作者!
    你可能也想看
    軟體工程師筆記 | Python 怎麼自訂型別,開始用 NewType 吧!在Python的typing模組中,NewType用來創建新的類型,其實是一個現有類型的變體。這對於型別檢查(Type Checking)非常有用,能夠幫助我們更清楚地理解我們的代碼和預期的行為。
    Thumbnail
    avatar
    阿亮 | LJ
    2023-08-05
    閱讀札記:多多認識自己,用鬼滅角色分析人格特質作者:林萃芬-諮商心理師 從書中解析腳色人格特質,探索天賦潛能,洞悉心理狀態,讓自己度過各種難關。書中能讓自我理解是屬於鬼滅裡的哪一種人格?如何更認識自己? 書摘重點整理以及心得整理: CH1 鬼滅重點主角群角色分析 >竈門炭治郎:源源不斷的正能量,同理每個人的處境 1. 無條件的
    avatar
    MW
    2023-07-07
    【子彈筆記101:用10天找回熱情,掌握實踐心得,成為自我管理的達人的3個最佳實踐】開始使用子彈筆記10天,感受到效率大大提升! 子彈筆記很特別!讓我有效回顧過去,點燃熱情,更深入理解自己的心情起伏。這些都轉為超強的做事動力🤯。 以下是我用10天找回熱情,掌握實踐心得,成為自我管理的達人的3個最佳實踐: 最佳實踐1 - 從過去10天的記錄裡,熱情再燃:妳記得10天前熱衷什麼嗎?子
    Thumbnail
    avatar
    王啟樺
    2023-05-29
    視覺筆記應用:圖解你的人生身為一名教師,我需要專注在課程的設計,這裡包含學生需要知道的知識盤點,教師清不清楚自己到底要學生知道這些的目的是什麼,還有實際在課堂上教學的技術等等。學生的狀況越不好掌控,本質的掌握越重要,這可能就是我對《易經》中「以不變應萬變」的理解吧。
    Thumbnail
    avatar
    琳瑯滿目的高中國文
    2023-05-27
    <ChatGPT學習筆記> 用ChatGPT創作文字符號藝術使用ChatGPT生成的文字符號圖片分享 文字符號圖是以文字符號、數字、字母等字符組成的圖形藝術形式,可表達各種形狀和圖像。應用範圍廣泛,可手繪或使用計算機程序和人工智能技術生成。
    Thumbnail
    avatar
    米阿吉
    2023-03-31
    🎤【筆記:運用焦點解決問句找到方向】#心理諮商 今天心理實務課程,老師用《說書人》讓我們去練習,如何使用「量尺問卷」、「目標問句」、「例外問句」、「假設問句」。 她請我們拿出兩張卡,第一張代表:自己目前做的好、值得慶祝得,第二張代表:自己還能進步的地方、想改善的地方,並將上述問句運用在第二張卡上,去看到出路。
    Thumbnail
    avatar
    大吉嶺|閱讀行動派
    2022-11-12
    閱讀筆記《用大腦喜歡的方式「1人學習」》★不花錢、縮短時間、做好學習的唯一速效讀書法,就是自己一個人不斷地獨自學習!
    Thumbnail
    avatar
    偶希都理
    2022-08-18
    🎤【閱讀筆記:用輸出做透一件事】《故事》麥奇說:好奇心是人類對于于“找到答案”和“認知閉合”的智力需求,如何運用好奇心呢? 一般人是圍繞著無數個問題,不斷橫向學習,期待一次學完所有相關知識,但在知識爆炸時代,無异是用勺子裝水,學不完的;牛人則是圍繞一個問題,尋找知行合一的閉環——向深處走,向事上練。
    avatar
    大吉嶺|閱讀行動派
    2022-08-03
    電子書系列/筆記1:用製作網頁邏輯做電子書,而不是用紙本書的邏輯!「電子書」的確不怎麼像「書」,若要認真定位「電子書」,大概就是以編輯過的內容分章分節,用以「閱讀一本書」的思維去𢑥整出它應有的功能並提供「閱讀一本書」的體驗。說穿了,電子書就是很多個被排版在xhtml而連結起的檔案。
    Thumbnail
    avatar
    換日線
    2021-07-15
    Woomanpower課程筆記分享 — 用產品與系統思維,來思考你的職涯發展營運力這門課講師 Evonne Tsai 跟大家分享如何用產品與系統思維,來思考你的職涯發展。這是關於她用兩年的人生學到到一堂課,在她還是中階的產品經理時的一個經歷。那時候她被公司要求打造出一個有關監控的新產品,而身為一個產品經理,她希望做出一個符合用戶需求、滿足用戶的體驗的產品,於是便找了保全人員
    Thumbnail
    avatar
    艾兒莎
    2021-03-18