前面汇率实时转换的小程序,使用了api key,因为是免费的,所以有调用次数的限制
找了一些免费、公开、无需key的API,把玩一下看看
这里列了不少免费的API
没有一一尝试,感兴趣可以自行测试一下,免费的,不能用也很正常:)
对于汇率转换小程序,可以改用上面列表里提到的第30个api
|30 |Crypto & Finance |Exchangerate |Currency exchange & crypto rates| https://api.exchangerate.host/latest|
使用requests库,访问该url,如法炮制:
import requests
import json
url = 'https://api.exchangerate.host/latest'
response = requests.get(url)
json_object = json.loads(response.text)
#print(json_object)
if json_object["success"] == True:
print(f"日期:{json_object['date']}")
print(f"基准货币: {json_object['base']}")
print(f"美元汇率: {json_object['rates']['USD']}")
print(f"人民币汇率: {json_object['rates']['CNY']}")
对于一个API访问返回的数据,首先打印出来,然后用json格式化工具去查看,比如
json格式化与验证工具, 或者浏览器直接打开URL,现代浏览器会直接以JSON格式显示返回的数据
在Python里面访问这样的数据结构,使用字典数据访问形式:
json_object["result"] == "success" ## 判断结果是否成功
如下图所示,就可以比较清晰看出数据的结构:
print(f"基准货币: {json_object['base']}")
print(f"到美元的汇率: {json_object['rates']['USD']}")
print(f"到人民币汇率: {json_object['rates']['CNY']}")
以后就可以将这个API可以集成到自己的应用中...
一般性API访问小结:
- 了解API基本调用方式
- 了解API响应的数据结构
- 将响应的数据专程json对象
- 访问json对象特定字段,获取需要的数据
- 根据实际问题实现自己程序逻辑,比如汇率转换的简单计算
练习
给定一个汇率数据API
编写一个完整的应用程序,输入一定数目的美元, 输出所有支持货币的转换金额,以及与美元的汇率
比如,程序实际运行可能如下所示:
请输入输入美元的数量:
日期, 你输入美元 $ xxxx
xxxx美元 换 yyyy 人民币; 汇率:7.2
xxxx美元 换 yyyy 日元; 汇率: 125
...
要求,尽可能输出所有支持的货币
提示:需要手工编写一个货币代码到中文文字描述的映射表,比如CNY表示人民币, USD表示美元等等(可以从网上获取相应的数据)
参考实现
获取货币代码与名称、国家地区的描述
import csv
import requests
from bs4 import BeautifulSoup
# 发起网页请求
url = "https://www.iban.hk/currency-codes"
response = requests.get(url)
# 解析HTML内容
soup = BeautifulSoup(response.text, 'html.parser')
# 找到<tbody>标签
tbody = soup.find('tbody')
# 提取表格数据
data = []
rows = tbody.find_all('tr')
for row in rows:
cells = row.find_all('td')
row_data = [cell.get_text(strip=True) for cell in cells]
data.append(row_data)
# 将数据写入CSV文件
with open('currency_table_data.csv', 'w', newline='') as csvfile:
writer = csv.writer(csvfile)
writer.writerows(data)
将汇率web API封装成一个独立的模块
currency_exchange.py
import requests
import json
import datetime
import csv
class CurrencyExchange:
def __init__(self, api_url="https://open.er-api.com/v6/latest/USD"):
self.url = api_url
self.base = 'USD'
self.timestamp = None
self.from_currency = None
self.to_currency = None
self.rates = None
self.currency_code_mapping = None
def get_currency_code_mapping(self, csv_file="currency_table_data.csv"):
'''
获取货币编码与名称的映射,预存在csv文件里
'''
self.currency_code_mapping = []
with open(csv_file, 'r') as csvfile:
csvreader = csv.reader(csvfile)
for row in csvreader:
self.currency_code_mapping.append(tuple(row))
return self.currency_code_mapping
def get_allrates(self):
'''
获取所有支持货币的汇率,相对于base货币,比如USD
'''
response = requests.get(self.url)
json_object = json.loads(response.text)
if json_object["result"] == "success":
timestamp = int(json_object['time_last_update_unix'])
self.timestamp = datetime.datetime.fromtimestamp(timestamp)
self.rates = json_object["rates"]
return self.timestamp, self.rates
else:
return 0, 0
def get_rate(self, to_currency):
response = requests.get(self.url)
json_object = json.loads(response.text)
if json_object["result"] == "success":
if to_currency.upper() in json_object["rates"]:
from_rate = float(json_object['rates'][self.base])
to_rate = float(json_object['rates'][to_currency])
from_to_rate = to_rate / from_rate
timestamp = int(json_object['time_last_update_unix'])
updated_time = datetime.datetime.fromtimestamp(timestamp)
return updated_time, from_to_rate
else:
return 0,0
else:
return 0, 0
def calc(self, usd_amount, to_currency):
timestamp, rate = self.get_rate(to_currency)
return timestamp, float(usd_amount) * float(rate)
使用自定义的类
# 引入一个自定义的模块,货币转换的一个类
from currency_exchange import CurrencyExchange
my_currency_exchange = CurrencyExchange()
# 默认该货币转换的类基础货币是美元,转换为浮点数,需要增加try except 异常处理
usd_amount = float(input("输入待转换的美元金额: "))
# 将用户的输入统一转换为大写,这样输入jpy,JPY,jPy,jPY,程序一样可以运行
to_currency = input("输入目标货币的代号: 比如 CNY, JPY, 等等...").upper()
# 查询一下货币代码与名称映射
list_of_currency_code_mapping = my_currency_exchange.get_currency_code_mapping()
to_currency_area = None
to_currency_name = None
to_currency_id = None
# 根据用户输入的货币代码,查表获取对应的国家名称,以及货币名称
for item in list_of_currency_code_mapping:
if item[2] == to_currency:
to_currency_area = item[0]
to_currency_name = item[1]
to_currency_id = item[3]
# 给用户一个反馈
print(f'你输入美元 ${usd_amount}, 目标货币: {to_currency_area} {to_currency_name}')
break
# 调用自定义类货币转换的 calc方法: 负责将美元转成目标货币的金额
updated_timestamp, total = my_currency_exchange.calc(usd_amount, to_currency)
# 返回出错处理
if updated_timestamp == 0 and total == 0:
print("查询失败or不支持该货币汇率")
else:
if to_currency_name is not None:
print(f"[更新日期:{updated_timestamp}] 美元 ${usd_amount} 可换 {total:.2f} {to_currency_area} {to_currency_name}")
else:
print(f"[更新日期:{updated_timestamp}] 美元 ${usd_amount} 可换 {total:.2f} {to_currency}")
其他好玩的API
Next:
下次我们自己写个简单的API看看?