本文作者:咔咔

如何实时爬取股票数据?Python爬虫实现方法与注意事项

咔咔 2025-10-30 6 抢沙发
如何实时爬取股票数据?Python爬虫实现方法与注意事项摘要: 核心要点在开始之前,请务必了解以下几点:合法合规性:尊重 robots.txt:在爬取任何网站前,请务必检查其 robots.txt 文件(https://www.sina.com...

核心要点

在开始之前,请务必了解以下几点:

  1. 合法合规性

    • 尊重 robots.txt:在爬取任何网站前,请务必检查其 robots.txt 文件(https://www.sina.com/robots.txt),了解网站是否允许爬取以及爬取的频率限制,直接违反 robots.txt 可能会带来法律风险
    • 频率限制:高频请求会给目标服务器带来巨大压力,可能导致你的 IP 地址被封禁,请务必控制请求频率,例如使用 time.sleep() 在请求之间增加延迟。
    • 数据使用目的:确保你爬取数据的用途是合法的,不用于商业出售、操纵市场或其他违法活动。
  2. 实时性的定义

    如何实时爬取股票数据?Python爬虫实现方法与注意事项

    • 免费数据源的延迟:绝大多数免费提供股票数据的网站,其数据本身就有 15分钟、30分钟甚至更长的延迟,你爬取到的是“准实时”数据,而不是真正的交易所级别的实时数据。
    • 付费数据源:真正的、低延迟的实时数据(如 L1/L2 行情)通常需要向交易所或数据服务商(如 Wind、Bloomberg、同花顺 iFinD)付费购买,费用高昂。
  3. 技术选型

    • 静态网页:如果数据是直接渲染在 HTML 中的,可以使用 requests + BeautifulSouplxml
    • 动态网页/AJAX:如果数据是通过 JavaScript 异步加载的,需要使用 SeleniumPlaywright 等工具模拟浏览器行为。
    • API 接口:这是最推荐、最高效、最稳定的方式,如果网站提供公开 API,优先使用 API。

使用公开 API (推荐)

这是最简单、最稳定、效率最高的方法,许多金融数据网站都提供了免费的 API 接口。

新浪财经 API (示例)

新浪财经的 API 是国内最常用、最稳定的免费数据源之一,它不需要复杂的解析,直接返回 JSON 或文本格式数据。

接口示例 (获取腾讯股票 00700.HK 的实时数据): https://hq.sinajs.cn/?list=rt_hk00700

如何实时爬取股票数据?Python爬虫实现方法与注意事项

Python 代码实现:

import requests
import time
import json
def get_realtime_stock(stock_code):
    """
    从新浪财经获取实时股票数据
    :param stock_code: 股票代码,格式如 'hk00700' (港股腾讯) 或 'sh600519' (A股茅台)
    :return: 包含股票信息的字典
    """
    url = f"https://hq.sinajs.cn/?list=rt_{stock_code}"
    try:
        # 设置一个 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'
        }
        response = requests.get(url, headers=headers, timeout=10)
        response.raise_for_status()  # 如果请求失败则抛出异常
        # 新浪返回的数据格式是:var hq_str_rt_hk00700="腾讯控股,320.200,321.000,318.800,322.400,316.800,322.400,12184548,39102695472,538,321.000,2000,321.200,5000,321.400,2000,321.600,1000,320.800,1000,320.600,3000,320.400,1000,320.200,1000,319.800,2000,319.600,5000,319.400,2000,2025-07-31,15:59:59,00";
        # 我们只需要引号内的部分
        data_str = response.text.split('"')[1]
        data_list = data_str.split(',')
        stock_info = {
            "name": data_list[0],
            "current_price": float(data_list[1]),
            "open_price": float(data_list[2]),
            "close_price_prev": float(data_list[3]), # 昨收
            "high_price": float(data_list[4]),
            "low_price": float(data_list[5]),
            "volume": int(data_list[8]),
            "timestamp": data_list[30] + " " + data_list[31]
        }
        return stock_info
    except requests.exceptions.RequestException as e:
        print(f"请求失败: {e}")
        return None
if __name__ == "__main__":
    # 腾讯控股的代码是 00700.HK,在新浪 API 中是 'hk00700'
    # 贵州茅台的代码是 600519.SH,在新浪 API 中是 'sh600519'
    stock_code = "hk00700" 
    while True:
        data = get_realtime_stock(stock_code)
        if data:
            print(f"股票名称: {data['name']}")
            print(f"当前价格: {data['current_price']:.2f}")
            print(f"今日最高: {data['high_price']:.2f}")
            print(f"今日最低: {data['low_price']:.2f}")
            print(f"成交量: {data['volume']:,}")
            print(f"更新时间: {data['timestamp']}")
            print("-" * 20)
        # 每 5 秒更新一次,避免请求过于频繁
        time.sleep(5)

其他 API 资源

  • Alpha Vantage:提供全球股票、外汇、加密货币数据,有免费额度,但请求次数有限制。
  • Financial Modeling Prep:也提供免费的股票数据 API。
  • Tushare:一个强大的 Python 财务数据接口库,集成了国内多个数据源,需要注册获取 Token。

网页解析 (不推荐,仅作技术演示)

如果找不到合适的 API,或者网站没有提供 API,才考虑解析网页,这种方法非常脆弱,网站一旦改版,代码就可能失效。

目标:同花顺网页

我们以同花顺网页为例,展示如何使用 requestsBeautifulSoup 解析数据。

Python 代码实现:

如何实时爬取股票数据?Python爬虫实现方法与注意事项

import requests
from bs4 import BeautifulSoup
import time
import re
def get_stock_data_from_10jqka(stock_code):
    """
    从同花顺网页获取股票数据
    :param stock_code: A股股票代码,如 '600519'
    :return: 股票信息字典
    """
    # 同花顺 A股 股票页 URL
    url = f"http://quote.eastmoney.com/sh{stock_code}.html"
    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, timeout=10)
        response.raise_for_status()
        soup = BeautifulSoup(response.text, 'html.parser')
        # 同花顺的数据通常在特定的 script 标签内,需要用正则表达式提取
        # 这里是一个简化的例子,实际页面结构可能更复杂
        # 我们寻找包含 "pageData" 的 script 标签
        script_with_data = None
        for script in soup.find_all('script'):
            if 'pageData' in script.text:
                script_with_data = script
                break
        if not script_with_data:
            print("未找到数据脚本")
            return None
        # 使用正则表达式提取 JSON 数据
        json_data_str = re.search(r'pageData = (.*?);', script_with_data.text).group(1)
        data_list = json.loads(json_data_str)
        # data_list 是一个列表,第一个元素是当前股票的信息
        stock_info = {
            "name": data_list[0],
            "current_price": float(data_list[3]),
            "open_price": float(data_list[1]),
            "close_price_prev": float(data_list[2]),
            "high_price": float(data_list[4]),
            "low_price": float(data_list[5]),
            "volume": int(data_list[8].replace(',', ''))
        }
        return stock_info
    except Exception as e:
        print(f"解析失败: {e}")
        return None
if __name__ == "__main__":
    stock_code = "600519" # 贵州茅台
    while True:
        data = get_stock_data_from_10jqka(stock_code)
        if data:
            print(f"股票名称: {data['name']}")
            print(f"当前价格: {data['current_price']:.2f}")
            print(f"成交量: {data['volume']:,}")
            print("-" * 20)
        # 同花顺对爬虫限制较严,间隔时间要长一些
        time.sleep(10) 

使用成熟的第三方库 (最推荐)

对于国内数据,强烈推荐使用 Tushare,它封装了数据获取、清洗的整个过程,非常稳定和方便。

安装 Tushare

pip install tushare

获取 Token

  • 访问 Tushare 官网 注册。
  • 在个人主页获取你的 API Token。

Python 代码实现

import tushare as ts
import time
# 设置你的 Tushare Token
# ts.set_token('你的Tushare Token')
# pro = ts.pro_api()
# 或者直接设置环境变量
# export TUSHARE_TOKEN='你的Tushare Token'
def get_realtime_data_with_tushare(stock_code):
    """
    使用 Tushare 获取实时行情数据
    :param stock_code: A股股票代码
    :return: DataFrame
    """
    try:
        # 获取实时行情
        df = ts.get_realtime_quotes(stock_code)
        if df.empty:
            print("未获取到数据")
            return None
        # 将结果转换为字典
        return df.to_dict(orient='records')[0]
    except Exception as e:
        print(f"Tushare API 调用失败: {e}")
        return None
if __name__ == "__main__":
    # 初始化 pro API (推荐使用 pro 接口,功能更全)
    # �要先设置 token
    # pro = ts.pro_api()
    # df = pro.query('daily', ts_code='600519.SH', start_date='20250101', end_date='20250731')
    # 这里使用旧的 get_realtime_quotes 接口作为实时示例
    stock_code = '600519' # 贵州茅台
    while True:
        data = get_realtime_data_with_tushare(stock_code)
        if data:
            print(f"股票名称: {data['name']}")
            print(f"当前价格: {data['price']}")
            print(f"成交量: {data['volume']}")
            print(f"更新时间: {data['time']}")
            print("-" * 20)
        # Tushare 免费版有调用频率限制,通常1秒1次
        time.sleep(1)

总结与建议

方案 优点 缺点 推荐度
公开 API 高效、稳定、数据格式友好 可能存在延迟,需遵守频率限制 ⭐⭐⭐⭐⭐
第三方库 功能强大、数据全面、稳定可靠 需要注册和 Token,部分功能付费 ⭐⭐⭐⭐⭐
网页解析 不依赖 API,能获取“隐藏”数据 效率低、不稳定、易失效、法律风险高 ⭐ (仅作技术学习)

给你的最终建议:

  1. 首选 Tushare:如果你是国内 A 股数据,Tushare 是不二之选,它集成了数据源,处理了各种异常,让你专注于数据分析本身。
  2. 次选新浪 API:如果只是简单获取几只股票的快照,新浪 API 的 Python 实现非常简单直接。
  3. 避免网页解析:除非有特殊需求且没有其他选择,否则不要轻易选择这条路,维护成本太高。

希望这份详细的指南能帮助你成功实现股票数据的实时爬取!

文章版权及转载声明

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

阅读
分享

发表评论

快捷回复:

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

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