【筆記】用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


    21會員
    18內容數
    留言0
    查看全部
    發表第一個留言支持創作者!
    冬霞的沙龍 的其他內容
    完成上一篇沒完成的MAX跟BitoPro API呼叫
    呼叫API,並透過API響應的內容取到需要的值
    透過數字貨幣交易所的OPEN API文件找到自己需要的資訊
    使用顯性等待,以及讓我們的自動化網頁看起來有像測試的樣子 另外,readmoo電子書真的很方便啊
    完成上一篇沒完成的MAX跟BitoPro API呼叫
    呼叫API,並透過API響應的內容取到需要的值
    透過數字貨幣交易所的OPEN API文件找到自己需要的資訊
    使用顯性等待,以及讓我們的自動化網頁看起來有像測試的樣子 另外,readmoo電子書真的很方便啊
    你可能也想看
    Google News 追蹤
    Thumbnail
    這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
    Thumbnail
    美國總統大選只剩下三天, 我們觀察一整週民調與金融市場的變化(包含賭局), 到本週五下午3:00前為止, 誰是美國總統幾乎大概可以猜到60-70%的機率, 本篇文章就是以大選結局為主軸來討論近期甚至到未來四年美股可能的改變
    Thumbnail
    Faker昨天真的太扯了,中國主播王多多點評的話更是精妙,分享給各位 王多多的點評 「Faker是我們的處境,他是LPL永遠繞不開的一個人和話題,所以我們特別渴望在決賽跟他相遇,去直面我們的處境。 我們曾經稱他為最高的山,最長的河,以為山海就是盡頭,可是Faker用他28歲的年齡...
    Thumbnail
    在Python的typing模組中,NewType用來創建新的類型,其實是一個現有類型的變體。這對於型別檢查(Type Checking)非常有用,能夠幫助我們更清楚地理解我們的代碼和預期的行為。
    作者:林萃芬-諮商心理師 從書中解析腳色人格特質,探索天賦潛能,洞悉心理狀態,讓自己度過各種難關。書中能讓自我理解是屬於鬼滅裡的哪一種人格?如何更認識自己? 書摘重點整理以及心得整理: CH1 鬼滅重點主角群角色分析 >竈門炭治郎:源源不斷的正能量,同理每個人的處境 1. 無條件的
    Thumbnail
    開始使用子彈筆記10天,感受到效率大大提升! 子彈筆記很特別!讓我有效回顧過去,點燃熱情,更深入理解自己的心情起伏。這些都轉為超強的做事動力🤯。 以下是我用10天找回熱情,掌握實踐心得,成為自我管理的達人的3個最佳實踐: 最佳實踐1 - 從過去10天的記錄裡,熱情再燃:妳記得10天前熱衷什麼嗎?子
    Thumbnail
    身為一名教師,我需要專注在課程的設計,這裡包含學生需要知道的知識盤點,教師清不清楚自己到底要學生知道這些的目的是什麼,還有實際在課堂上教學的技術等等。學生的狀況越不好掌控,本質的掌握越重要,這可能就是我對《易經》中「以不變應萬變」的理解吧。
    Thumbnail
    使用ChatGPT生成的文字符號圖片分享 文字符號圖是以文字符號、數字、字母等字符組成的圖形藝術形式,可表達各種形狀和圖像。應用範圍廣泛,可手繪或使用計算機程序和人工智能技術生成。
    Thumbnail
    今天心理實務課程,老師用《說書人》讓我們去練習,如何使用「量尺問卷」、「目標問句」、「例外問句」、「假設問句」。 她請我們拿出兩張卡,第一張代表:自己目前做的好、值得慶祝得,第二張代表:自己還能進步的地方、想改善的地方,並將上述問句運用在第二張卡上,去看到出路。
    Thumbnail
    ★不花錢、縮短時間、做好學習的唯一速效讀書法,就是自己一個人不斷地獨自學習!
    《故事》麥奇說:好奇心是人類對于于“找到答案”和“認知閉合”的智力需求,如何運用好奇心呢? 一般人是圍繞著無數個問題,不斷橫向學習,期待一次學完所有相關知識,但在知識爆炸時代,無异是用勺子裝水,學不完的;牛人則是圍繞一個問題,尋找知行合一的閉環——向深處走,向事上練。
    Thumbnail
    「電子書」的確不怎麼像「書」,若要認真定位「電子書」,大概就是以編輯過的內容分章分節,用以「閱讀一本書」的思維去𢑥整出它應有的功能並提供「閱讀一本書」的體驗。說穿了,電子書就是很多個被排版在xhtml而連結起的檔案。
    Thumbnail
    營運力這門課講師 Evonne Tsai 跟大家分享如何用產品與系統思維,來思考你的職涯發展。這是關於她用兩年的人生學到到一堂課,在她還是中階的產品經理時的一個經歷。那時候她被公司要求打造出一個有關監控的新產品,而身為一個產品經理,她希望做出一個符合用戶需求、滿足用戶的體驗的產品,於是便找了保全人員
    Thumbnail
    這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
    Thumbnail
    美國總統大選只剩下三天, 我們觀察一整週民調與金融市場的變化(包含賭局), 到本週五下午3:00前為止, 誰是美國總統幾乎大概可以猜到60-70%的機率, 本篇文章就是以大選結局為主軸來討論近期甚至到未來四年美股可能的改變
    Thumbnail
    Faker昨天真的太扯了,中國主播王多多點評的話更是精妙,分享給各位 王多多的點評 「Faker是我們的處境,他是LPL永遠繞不開的一個人和話題,所以我們特別渴望在決賽跟他相遇,去直面我們的處境。 我們曾經稱他為最高的山,最長的河,以為山海就是盡頭,可是Faker用他28歲的年齡...
    Thumbnail
    在Python的typing模組中,NewType用來創建新的類型,其實是一個現有類型的變體。這對於型別檢查(Type Checking)非常有用,能夠幫助我們更清楚地理解我們的代碼和預期的行為。
    作者:林萃芬-諮商心理師 從書中解析腳色人格特質,探索天賦潛能,洞悉心理狀態,讓自己度過各種難關。書中能讓自我理解是屬於鬼滅裡的哪一種人格?如何更認識自己? 書摘重點整理以及心得整理: CH1 鬼滅重點主角群角色分析 >竈門炭治郎:源源不斷的正能量,同理每個人的處境 1. 無條件的
    Thumbnail
    開始使用子彈筆記10天,感受到效率大大提升! 子彈筆記很特別!讓我有效回顧過去,點燃熱情,更深入理解自己的心情起伏。這些都轉為超強的做事動力🤯。 以下是我用10天找回熱情,掌握實踐心得,成為自我管理的達人的3個最佳實踐: 最佳實踐1 - 從過去10天的記錄裡,熱情再燃:妳記得10天前熱衷什麼嗎?子
    Thumbnail
    身為一名教師,我需要專注在課程的設計,這裡包含學生需要知道的知識盤點,教師清不清楚自己到底要學生知道這些的目的是什麼,還有實際在課堂上教學的技術等等。學生的狀況越不好掌控,本質的掌握越重要,這可能就是我對《易經》中「以不變應萬變」的理解吧。
    Thumbnail
    使用ChatGPT生成的文字符號圖片分享 文字符號圖是以文字符號、數字、字母等字符組成的圖形藝術形式,可表達各種形狀和圖像。應用範圍廣泛,可手繪或使用計算機程序和人工智能技術生成。
    Thumbnail
    今天心理實務課程,老師用《說書人》讓我們去練習,如何使用「量尺問卷」、「目標問句」、「例外問句」、「假設問句」。 她請我們拿出兩張卡,第一張代表:自己目前做的好、值得慶祝得,第二張代表:自己還能進步的地方、想改善的地方,並將上述問句運用在第二張卡上,去看到出路。
    Thumbnail
    ★不花錢、縮短時間、做好學習的唯一速效讀書法,就是自己一個人不斷地獨自學習!
    《故事》麥奇說:好奇心是人類對于于“找到答案”和“認知閉合”的智力需求,如何運用好奇心呢? 一般人是圍繞著無數個問題,不斷橫向學習,期待一次學完所有相關知識,但在知識爆炸時代,無异是用勺子裝水,學不完的;牛人則是圍繞一個問題,尋找知行合一的閉環——向深處走,向事上練。
    Thumbnail
    「電子書」的確不怎麼像「書」,若要認真定位「電子書」,大概就是以編輯過的內容分章分節,用以「閱讀一本書」的思維去𢑥整出它應有的功能並提供「閱讀一本書」的體驗。說穿了,電子書就是很多個被排版在xhtml而連結起的檔案。
    Thumbnail
    營運力這門課講師 Evonne Tsai 跟大家分享如何用產品與系統思維,來思考你的職涯發展。這是關於她用兩年的人生學到到一堂課,在她還是中階的產品經理時的一個經歷。那時候她被公司要求打造出一個有關監控的新產品,而身為一個產品經理,她希望做出一個符合用戶需求、滿足用戶的體驗的產品,於是便找了保全人員