做 Python 项目时,如果需要展示黄金、白银的最新价格,单靠手动更新数据显然不太现实。更常见的做法是接入行情 API,让程序定时获取报价,再用于行情展示、价格监控等场景。
这篇文章从实际开发出发,介绍如何使用 Python 请求贵金属行情 API,并处理接口异常和数据校验。示例采用通用 REST API 调用方式,具体请求地址和参数需要以所选服务的官方文档为准。
一、接入前要确认哪些信息?
黄金和白银的行情标识通常与报价市场有关,例如 XAU/USD 代表黄金兑美元,XAG/USD 代表白银兑美元。不同服务商的代码格式可能不同,不能直接假定所有接口都使用相同的标识。
选择接口时,我一般会关注以下几点:
- 数据类型:是否提供实时报价、Tick 数据或历史行情。
- 更新频率:接口返回的是最新报价,还是存在一定延迟的数据。
- 认证方式:API Key 应放在请求头还是其他指定位置。
- 调用限制:每秒请求次数和每日调用额度是多少。
- 返回结构:价格、时间戳和交易标的分别对应哪个字段。
这些信息确认清楚后,编写请求代码会简单很多。
二、使用 Python 请求行情接口
Python 可以通过 requests 发送 HTTP 请求。先安装依赖:
pip install requests
下面是一个通用的 REST API 请求模板。为了避免把不同服务商的接口格式混为一谈,实际使用时需要根据官方文档配置地址、参数和认证方式。
import os
import requests
API_URL = os.getenv("DEEPTICK_API_URL")
API_KEY = os.getenv("DEEPTICK_API_KEY")
def get_quote(symbol):
if not API_URL or not API_KEY:
raise RuntimeError("请配置 API 地址和密钥")
response = requests.get(
API_URL,
params={"symbol": symbol},
headers={"Authorization": f"Bearer {API_KEY}"},
timeout=10
)
response.raise_for_status()
data = response.json()
if not isinstance(data, dict):
raise ValueError("返回数据格式不正确")
return data
if __name__ == "__main__":
for symbol in ("XAUUSD", "XAGUSD"):
try:
print(symbol, get_quote(symbol))
except (requests.RequestException,
ValueError, RuntimeError) as exc:
print(f"{symbol} 请求失败:{exc}")
这里使用环境变量保存接口地址和密钥,避免把敏感信息直接写入代码。需要注意,示例中的参数名、认证头和标的代码都是通用写法,不能直接认定为某个服务的实际规范。
例如,查看 DeepTick API 的 REST Quote 文档时,可以依据其实际接口说明配置请求地址、参数和返回字段,而不是直接套用通用模板。
三、拿到数据后,还需要做什么?
接口返回 JSON,并不代表数据一定可以直接用于业务。实际开发中,我会重点检查三个方面。
价格是否有效。 判断价格字段是否存在、能否转换为数字,并排除明显异常的值。价格字段的具体名称应以接口返回结构为准。
行情是否过期。 如果接口提供时间戳,可以记录数据更新时间,并根据业务要求判断数据是否仍然有效。需要注意秒级与毫秒级时间戳的区别。
请求是否稳定。 设置合理的超时时间,对临时网络错误进行有限次数的重试,同时记录错误日志。遇到认证失败或参数错误时,应优先检查配置,而不是不断重复请求。
四、REST API 和 Tick 数据有什么区别?
如果只是制作一个定时刷新的行情页面,REST API 通常比较容易接入。如果需要观察更密集的价格变化,则需要确认服务是否提供 Tick 数据,以及实际更新频率和数据覆盖范围。
无论选择哪种方式,都建议将数据采集、字段解析和业务逻辑分开。这样在后续增加白银报价、历史行情或价格提醒功能时,不需要反复修改核心代码。
对我来说,贵金属行情接入最值得关注的,并不只是能否获取一个价格,而是数据来源是否明确、更新时间是否可靠,以及异常发生时程序能否正确处理。把这些基础环节做好,后续扩展功能也会更有把握。

