最近在做一个小项目,需要把美股行情实时展示出来。一开始我以为找个接口拉点数据就能解决,结果真正动手做才发现,有些细节会让“免费+实时”变得没那么随意。
我的目标很明确:
-
能获取主流美股的实时行情
-
页面和脚本里都能秒级刷新
-
数据稳定又尽量不超出接口限制
这看似简单,但做起来才发现,每一次小改动都会影响整个体验。
1、选择接口
面对市面上免费的接口,第一步是明确目标。很多接口要么延迟高,要么覆盖不全。我那时就想着先保证稳定,再考虑速度。
通常有两种方式:HTTP 查询和 Websocket 推送。HTTP 查询适合后台定时获取或初始化数据,但秒级刷新不现实;Websocket 推送能主动把最新行情送过来,适合页面实时更新和监控。
2、HTTP 查询实践
在 Python 里,用 HTTP 获取行情的过程很直接。比如我这样写:
|
import
requests
url =
"https://api.alltick.io/market/quote"
params = {
"symbols"
:
"AAPL,TSLA"
,
"exchange"
:
"US"
}
headers = {
"Authorization"
:
"Bearer YOUR_API_KEY"
}
response = requests.get(url, params=params, headers=headers)
print(response.json())
|
这段代码主要用来初始化数据。刚打开页面,先把当前价格拉下来,保证用户第一眼看到的是最新行情。简单,但效果很直观。
3、Websocket 实时推送
真正有趣的是 Websocket。HTTP 是你去问一次,数据才回来;Websocket 是数据主动送过来,秒级更新。逻辑很直接:订阅你关注的股票代码,就能第一时间收到推送。
|
import
websocket
import
json
def
on_message
(ws, message):
data = json.loads(message)
print(
"实时行情:"
, data)
def
on_open
(ws):
ws.send(json.dumps({
"action"
:
"subscribe"
,
"symbols"
: [
"AAPL"
,
"TSLA"
,
"AMZN"
],
"exchange"
:
"US"
}))
ws = websocket.WebSocketApp(
"wss://stream.alltick.io/market"
,
>
>
)
ws.run_forever()
|
每次收到消息,我都感觉像在盯着股市脉搏跳动。这种实时感比单纯拉接口看 JSON 要直观多了。
4、前端可视化
把推送数据接到页面,用 ECharts 画个折线图,就能直接看到价格变化:
|
<div id=
"priceChart"
style=
"height:400px;"
></div>
<script>
var chart = echarts.init(document.getElementById(
'priceChart'
));
var option = { xAxis:{ type:
'category'
, data:[] }, yAxis:{ type:
'value'
}, series:[{ type:
'line'
, data:[] }] };
chart.setOption(option);
var ws = new WebSocket(
"wss://stream.alltick.io/market"
);
ws.{
var update = JSON.parse(evt.data);
option.xAxis.data.push(update.time);
option.series[0].data.push(update.price);
chart.setOption(option);
}
</script>
|
看到折线随着价格跳动,整个项目都变活了,体验比单纯查看数据舒服很多。
5、控制请求频率
免费接口都会有限制。刚开始我直接轮询,很快就被限速了。后来总结几条经验:
-
批量请求,多支股票一起拉
-
短时间重复请求直接用缓存
-
Websocket 替代轮询
这样既能保证实时性,又不会触碰接口限制。
6、Python 实战记录
最后,我做了一个小脚本,把实时行情记录下来,同时观察波动:
|
import
websocket, json, datetime
symbols = [
"AAPL"
,
"TSLA"
]
def
on_message
(ws, message):
data = json.loads(message)
now = datetime.datetime.now().strftime(
"%Y-%m-%d %H:%M:%S"
)
with
open(
"prices.log"
,
"a"
)
as
f:
f.write(
f"{now} {data}\n"
)
def
on_open
(ws):
ws.send(json.dumps({
"action"
:
"subscribe"
,
"symbols"
: symbols,
"exchange"
:
"US"
}))
ws = websocket.WebSocketApp(
"wss://stream.alltick.io/market"
,
>
>
)
ws.run_forever()
|
每次看到日志里写入最新价格,都会觉得数据不是冰冷的数字,而像在呼吸。开发的过程也因此更有乐趣。
用这种方式,把美股行情接入项目变得顺畅了。数据实时、稳定,页面和脚本都能秒级刷新,也不会被频率限制干扰。整个体验很自然,开发过程中每一步都能感受到数据流动的节奏。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70048654/viewspace-3111320/
,如需转载,请注明出处,否则将追究法律责任。