1. 为什么你需要这份实战指南?
如果你正在开发一个股票分析工具、量化交易策略,或者只是想自己动手做个行情看板,那么获取实时、准确、免费的股票数据就是你绕不开的第一步。我刚开始接触这块的时候,也是两眼一抹黑,网上资料零散,接口说变就变,返回的数据格式五花八门,踩过的坑能写满一张A4纸。后来我花了大量时间,把市面上常用的免费接口,特别是新浪和腾讯的,都摸了个遍,才算是理清了门道。
这份指南,就是把我这些年实战积累的经验,掰开揉碎了讲给你听。我不会只给你一个冷冰冰的接口地址,而是会告诉你每个接口怎么用、参数怎么调、返回的数据怎么解析、在实际项目中可能会遇到哪些“坑”。我们的目标很明确:让你看完就能动手,快速、稳定地把股票数据集成到自己的项目里。无论是Python新手,还是有一定经验的开发者,都能从这份指南里找到你需要的东西。记住,我们的核心是 “实战”,一切以能用、好用、稳定为准。
2. 新浪财经接口:老牌且全面的数据源
新浪财经的接口可以说是国内开发者使用最广泛的数据源之一,历史悠久,数据维度也比较全。它的特点是接口相对稳定,但返回的数据格式比较“原始”,需要我们自己动手解析。
2.1 实时行情数据:最核心的接口
这是你获取某只股票最新价格、成交量、买卖五档等核心信息的入口。接口地址非常简单:
http://hq.sinajs.cn/list=sh601006,sz000001
你只需要把股票代码按规则拼接在 list= 后面即可。上海股票(6开头)前面加 sh,深圳股票(0或3开头)前面加 sz,多个股票用逗号分隔。我实测下来,一次请求几十个代码都没问题,非常方便。
这个接口返回的数据,是那种让人又爱又恨的格式——一段JavaScript变量赋值语句。比如:
var hq_str_sh601006="大秦铁路,27.55,27.25,26.91,27.55,26.20,26.91,26.92,22114263,589824680,4695,26.91,57590,26.90,14700,26.89,14300,26.88,15100,26.87,3100,26.92,8900,26.93,14230,26.94,25150,26.95,15220,26.96,2008-01-11,15:05:32";
所有信息都用逗号连在一起,像个“数据串”。你需要按照固定的顺序去“拆解”它。根据我的经验,顺序是这样的(从0开始计数):
- 0 - 股票名称
- 1 - 今日开盘价
- 2 - 昨日收盘价
- 3 - 当前价格(最新价)
- 4 - 今日最高价
- 5 - 今日最低价
- 6 - 竞买价(买一价)
- 7 - 竞卖价(卖一价)
- 8 - 成交股数(注意单位是股,通常除以100得到“手”)
- 9 - 成交金额(单位是元,通常除以10000得到“万元”)
- 10 - “买一”申报股数
- 11 - “买一”报价
- 12-19 - “买二”到“买五”的申报股数和报价(两两一组)
- 20-29 - “卖一”到“卖五”的申报股数和报价(两两一组)
- 30 - 日期
- 31 - 时间
写代码解析时,一定要用 split(',') 分割后,严格按照这个索引去取值。这里有个小坑:不同股票的返回字段数严格一致,但如果你请求了一个不存在的代码,返回的字符串结构可能会变短,直接按索引取可能会报错。所以,稳健的做法是先判断分割后的数组长度。
下面是一个Python的解析示例,我加上了简单的错误处理:
import requests
def get_sina_realtime(stock_codes):
"""获取新浪实时行情数据
stock_codes: 列表,如 ['sh601006', 'sz000001']
"""
url = f"http://hq.sinajs.cn/list={','.join(stock_codes)}"
# 注意需要模拟浏览器请求头,否则可能被拒绝
headers = {'Referer': 'http://finance.sina.com.cn'}
try:
resp = requests.get(url, headers=headers, timeout=5)
resp.encoding = 'gbk' # 新浪接口返回编码通常是gbk
data_lines = resp.text.strip().split(';')
result = {}
for line in data_lines:
if not line:
continue
# 解析 var hq_str_sh601006="...";
parts = line.split('=')
if len(parts) < 2:
continue
code = parts[0].split('_')[-1] # 提取 sh601006


5795

被折叠的 条评论
为什么被折叠?



