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


留言
avatar-img
留言分享你的想法!
avatar-img
冬霞的沙龍
22會員
18內容數
冬霞的沙龍的其他內容
2023/10/22
用程式協助尋找殖利率跟可以進場的點位
Thumbnail
2023/10/22
用程式協助尋找殖利率跟可以進場的點位
Thumbnail
2023/10/15
利用git把檔案推到github上
Thumbnail
2023/10/15
利用git把檔案推到github上
Thumbnail
看更多
你可能也想看
Thumbnail
API(Application Programming Interface,應用程式介面)可以視為不同軟體系統之間的溝通橋梁,讓雙邊可以交換數據並執行各種功能。這篇會記錄產品經理一定要知道的幾個 API 概念,像是常見的錯誤代碼以及不同的 HTTP 方法(如 PUT、GET、POST)和實際案例說明
Thumbnail
API(Application Programming Interface,應用程式介面)可以視為不同軟體系統之間的溝通橋梁,讓雙邊可以交換數據並執行各種功能。這篇會記錄產品經理一定要知道的幾個 API 概念,像是常見的錯誤代碼以及不同的 HTTP 方法(如 PUT、GET、POST)和實際案例說明
Thumbnail
👨‍💻 簡介 最近想要透過小實作來撰寫筆記,達到做中學的效果,因此就來實作個小爬蟲順便結合前面學到的package做一個小複習。
Thumbnail
👨‍💻 簡介 最近想要透過小實作來撰寫筆記,達到做中學的效果,因此就來實作個小爬蟲順便結合前面學到的package做一個小複習。
Thumbnail
在這一課中,我們將學習如何在Python中使用requests模塊發送HTTP請求。 發送GET請求requests.get() 函數用於發送GET請求。
Thumbnail
在這一課中,我們將學習如何在Python中使用requests模塊發送HTTP請求。 發送GET請求requests.get() 函數用於發送GET請求。
Thumbnail
呼叫API,並透過API響應的內容取到需要的值
Thumbnail
呼叫API,並透過API響應的內容取到需要的值
Thumbnail
在第五課中,我們將探討 Python 中的函式(functions)。 函式是一種讓我們可以將程式碼塊組織成一個獨立、可重複使用的單元的方式。函式可以接受參數 (arguments) 並返回一個結果。
Thumbnail
在第五課中,我們將探討 Python 中的函式(functions)。 函式是一種讓我們可以將程式碼塊組織成一個獨立、可重複使用的單元的方式。函式可以接受參數 (arguments) 並返回一個結果。
Thumbnail
前端和後端溝通,最常用就是 get 和 post 後端 先在 django 專案這邊的 views.py 內建立一個讓前端以 get 方法呼叫的 api function1 內的第一個參數是前端的 request,之後第二個參數第三個參數可以隨便你設,這倒是沒有限制 用 request.GET 這個
Thumbnail
前端和後端溝通,最常用就是 get 和 post 後端 先在 django 專案這邊的 views.py 內建立一個讓前端以 get 方法呼叫的 api function1 內的第一個參數是前端的 request,之後第二個參數第三個參數可以隨便你設,這倒是沒有限制 用 request.GET 這個
Thumbnail
你想像有一個黑盒子,它會跟你說輸入一個input,而會得出什麼Output,而你要把這個Input傳遞給黑盒子是透過http的方式
Thumbnail
你想像有一個黑盒子,它會跟你說輸入一個input,而會得出什麼Output,而你要把這個Input傳遞給黑盒子是透過http的方式
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News