本文作者:咔咔

新浪行情API的数据获取方式与调用限制是怎样的?

新浪行情API的数据获取方式与调用限制是怎样的?摘要: 新浪财经是国内最主流的金融数据提供商之一,其行情接口因其免费、稳定、数据全面而被广大开发者广泛使用,虽然新浪官方没有提供正式的、文档化的 API,但其网页通过 JavaScript...

新浪财经是国内最主流的金融数据提供商之一,其行情接口因其免费、稳定、数据全面而被广大开发者广泛使用,虽然新浪官方没有提供正式的、文档化的 API,但其网页通过 JavaScript 动态加载数据的方式,形成了一套事实上的“非官方 API”。

核心概念:新浪行情 API 是什么?

这套 API 本质上是新浪财经网页为了在前端展示数据而设计的,开发者通过模拟浏览器向新浪的服务器发送请求,获取 JSON 格式的原始数据,然后在自己的程序中进行解析和使用。

新浪行情API的数据获取方式与调用限制是怎样的?
(图片来源网络,侵删)

API 端点

新浪提供了多个不同功能的端点,用于获取不同类型的数据,以下是一些最常用和最核心的端点:

a) 获取实时行情数据

这是最核心的功能,用于获取单个或多个股票的实时价格、涨跌幅等信息。

  • 接口地址: https://hq.sinajs.cn/list=

  • 参数说明:

    新浪行情API的数据获取方式与调用限制是怎样的?
    (图片来源网络,侵删)
    • list: 这是关键的查询参数,你需要传入一个或多个股票代码,多个代码用逗号 分隔。
  • 股票代码格式:

    • A股: sh (上海) 或 sz (深圳) + 6位数字。sh600519 (贵州茅台), sz000858 (五粮液)。
    • 港股: hk + 5位数字。hk00700 (腾讯控股)。
    • 美股: gb_ + 美股代码。gb_aapl (苹果公司), gb_msft (微软)。
  • 返回数据格式:

    • 返回的是一段 JavaScript 代码,格式为 var hq_str_s_sh600519="...";
    • 你需要提取 和 之间的字符串,它是一个由逗号 分隔的文本数据。
    • 数据字段顺序(非常重要):
      1. 当前价
      2. 昨收价
      3. 今开价
      4. 最高价
      5. 最低价
      6. 买一价
      7. 卖一价
      8. 成交量 (手)
      9. 成交额 (万)
      10. 涨跌幅 (注意:这个值是原始字符串,需要计算)
      11. 换手率
      12. 市盈率 (PE)
      13. ... (还有其他一些字段,如总市值、流通市值等)
  • 示例请求:

    • 获取贵州茅台和腾讯控股的实时数据: https://hq.sinajs.cn/list=sh600519,hk00700
  • 示例响应:

    var hq_str_s_sh600519="贵州茅台,1800.000,1810.000,1815.000,1830.000,1795.000,1798.00,1801.00,100,180000.00,-0.55,0.50,40.15,28560.00,28560.00,2025-10-27,15:00:00,00";
    var hq_str_hk_00700="腾讯控股,320.600,325.400,322.000,328.600,318.200,318.60,319.00,10000,322000.00,-1.47,0.45,9.89,312000000.00,312000000.00,2025-10-27,15:00:00,00";

    你需要解析 和 之间的内容,然后按逗号分割。

b) 获取分时/历史K线数据

这个接口用于获取股票的分时图数据或历史K线数据。

  • 接口地址: https://quotes.sina.cn/cn/api/openapi-proxy/marketdata/getMiniKLine?symbol=

  • 参数说明:

    • symbol: 股票代码,格式与上面类似,sh600519
    • 数据类型: 这个接口的返回数据中有一个 data 字段,里面包含了不同周期的K线数据,你需要根据 data 对象中的键来获取:
      • day: 日K线
      • week: 周K线
      • month: 月K线
      • 5min: 5分钟K线
      • 15min: 15分钟K线
      • 30min: 30分钟K线
      • 60min: 60分钟K线
  • 返回数据格式: JSON,数据是一个数组,每个元素代表一根K线,通常包含 date, open, high, low, close, volume 等字段。

  • 示例请求:

    • 获取贵州茅台的日K线数据: https://quotes.sina.cn/cn/api/openapi-proxy/marketdata/getMiniKLine?symbol=sh600519

c) 获取板块/行业数据

获取某个板块或行业内所有股票的列表和概况。

  • 接口地址: https://hq.sinajs.cn/list=

  • 参数说明:

    • list: 传入板块代码,板块代码通常以 gb 开头,后面是拼音或英文。
      • gb_zs: 上证指数
      • gb_zh: 深证成指
      • gb_hk: 恒生指数
      • gb_us: 美股指数
      • gb_mlhy: 麻辣烫行业 (一个示例)
      • gb_zn: 新能源
  • 示例请求:

    • 获取新能源板块的所有股票: https://hq.sinajs.cn/list=gb_zn

使用方法(代码示例)

下面提供 Python 和 JavaScript 的示例,展示如何调用这些接口。

Python 示例

你需要安装 requests 库。

pip install requests
import requests
import json
def get_realtime_quotes(stock_codes):
    """
    获取实时行情数据
    :param stock_codes: 股票代码列表,如 ['sh600519', 'sz000858']
    :return: 解析后的行情数据字典
    """
    # 将股票代码列表用逗号连接
    code_str = ",".join(stock_codes)
    url = f"https://hq.sinajs.cn/list={code_str}"
    # 设置 User-Agent 模拟浏览器访问
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
    }
    try:
        response = requests.get(url, headers=headers)
        response.raise_for_status()  # 如果请求失败则抛出异常
        response.encoding = 'gbk'  # 新浪返回的数据编码是 gbk
        # 解析返回的JS格式字符串
        data_str = response.text
        quotes = {}
        for item in data_str.split(';'):
            if not item:
                continue
            # 提取 var hq_str_x_xxxx="..." 中的内容
            parts = item.split('="')
            if len(parts) == 2:
                stock_key = parts[0].split('_')[-1]  # 获取 sh600519 这样的键
                quote_data_str = parts[1][:-1]  # 去掉末尾的引号
                quote_list = quote_data_str.split(',')
                # 将数据存入字典
                quotes[stock_key] = {
                    "name": quote_list[0],
                    "current_price": float(quote_list[1]),
                    "open": float(quote_list[2]),
                    "high": float(quote_list[3]),
                    "low": float(quote_list[4]),
                    "volume": int(quote_list[8]),
                    # ... 可以根据需要添加更多字段
                }
        return quotes
    except requests.exceptions.RequestException as e:
        print(f"请求失败: {e}")
        return None
# --- 使用示例 ---
if __name__ == "__main__":
    stocks = ['sh600519', 'sz000858', 'hk00700']
    realtime_data = get_realtime_quotes(stocks)
    if realtime_data:
        for code, data in realtime_data.items():
            print(f"股票代码: {code}")
            print(f"名称: {data['name']}")
            print(f"当前价: {data['current_price']}")
            print(f"成交量: {data['volume']}")
            print("-" * 20)

JavaScript (Node.js) 示例

你需要安装 axios 库。

npm install axios
const axios = require('axios');
async function getRealtimeQuotes(stockCodes) {
    const codeStr = stockCodes.join(',');
    const url = `https://hq.sinajs.cn/list=${codeStr}`;
    const headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
    };
    try {
        const response = await axios.get(url, { headers, responseType: 'arraybuffer' });
        // 将 Buffer 转换为 GBK 编码的字符串
        const dataStr = iconv.decode(response.data, 'gbk'); // 需要安装 iconv-lite: npm install iconv-lite
        const quotes = {};
        const items = dataStr.split(';');
        for (const item of items) {
            if (!item) continue;
            const parts = item.split('="');
            if (parts.length === 2) {
                const stockKey = parts[0].split('_')[-1];
                const quoteDataStr = parts[1].slice(0, -1); // 去掉末尾的引号
                const quoteList = quoteDataStr.split(',');
                quotes[stockKey] = {
                    name: quoteList[0],
                    currentPrice: parseFloat(quoteList[1]),
                    open: parseFloat(quoteList[2]),
                    high: parseFloat(quoteList[3]),
                    low: parseFloat(quoteList[4]),
                    volume: parseInt(quoteList[8]),
                };
            }
        }
        return quotes;
    } catch (error) {
        console.error('请求失败:', error);
        return null;
    }
}
// --- 使用示例 ---
(async () => {
    const stocks = ['sh600519', 'sz000858', 'hk00700'];
    const realtimeData = await getRealtimeQuotes(stocks);
    if (realtimeData) {
        for (const [code, data] of Object.entries(realtimeData)) {
            console.log(`股票代码: ${code}`);
            console.log(`名称: ${data.name}`);
            console.log(`当前价: ${data.currentPrice}`);
            console.log(`成交量: ${data.volume}`);
            console.log('---------------------');
        }
    }
})();

重要注意事项

  1. 非官方接口:

    • 稳定性无保障: 新浪随时可能修改接口地址或数据格式,导致你的代码失效。
    • 频率限制: 如果请求过于频繁,可能会被临时封禁 IP,建议在代码中加入适当的延迟(如 time.sleep(1))。
    • 仅供学习/个人使用: 严禁用于商业用途或高频数据抓取,否则有法律风险
  2. 数据编码:

    • 返回的数据流通常是 GBK 编码,而不是常见的 UTF-8,在 Python 中需要设置 response.encoding = 'gbk',在 Node.js 中需要使用 iconv-lite 等库进行解码。
  3. 数据格式变化:

    虽然接口稳定了很多年,但新浪仍有可能在不通知的情况下更新数据结构,增加或减少字段,你的解析逻辑需要具备一定的鲁棒性。

  4. 替代方案:

    • 如果新浪 API 无法满足你的需求(例如需要更稳定、更正式的服务),可以考虑使用官方或商业金融数据 API,
      • Tushare: 提供丰富的A股数据,有免费和付费套餐,社区活跃。
      • AKShare: 一个开源的金融数据接口库,集成了多个数据源,包括新浪,封装得很好,易于使用。
      • Wind (万得): 国内金融数据领域的龙头,但价格非常昂贵,主要面向机构客户。
      • 东方财富Choice: 同样是专业的金融数据终端。

新浪行情 API 是一个非常强大且方便的免费数据源,非常适合个人开发者、学生和量化交易初学者进行学习和项目原型开发,但在使用时,一定要清楚地认识到它的“非官方”属性,并做好应对其可能发生变化的准备,对于需要长期稳定运行的生产环境,建议转向更专业的数据服务提供商。

文章版权及转载声明

作者:咔咔本文地址:https://www.jits.cn/content/33582.html发布于 04-20
文章转载或复制请以超链接形式并注明出处杰思科技・AI 股讯

阅读
分享

发表评论

快捷回复:

评论列表 (暂无评论,1人围观)参与讨论

还没有评论,来说两句吧...