如何实时爬取股票数据?Python爬虫实现方法与注意事项
摘要:
核心要点在开始之前,请务必了解以下几点:合法合规性:尊重 robots.txt:在爬取任何网站前,请务必检查其 robots.txt 文件(https://www.sina.com... 核心要点
在开始之前,请务必了解以下几点:
-
合法合规性:
-
实时性的定义:
- 免费数据源的延迟:绝大多数免费提供股票数据的网站,其数据本身就有 15分钟、30分钟甚至更长的延迟,你爬取到的是“准实时”数据,而不是真正的交易所级别的实时数据。
- 付费数据源:真正的、低延迟的实时数据(如 L1/L2 行情)通常需要向交易所或数据服务商(如 Wind、Bloomberg、同花顺 iFinD)付费购买,费用高昂。
-
技术选型:
- 静态网页:如果数据是直接渲染在 HTML 中的,可以使用
requests+BeautifulSoup或lxml。 - 动态网页/AJAX:如果数据是通过 JavaScript 异步加载的,需要使用
Selenium或Playwright等工具模拟浏览器行为。 - API 接口:这是最推荐、最高效、最稳定的方式,如果网站提供公开 API,优先使用 API。
- 静态网页:如果数据是直接渲染在 HTML 中的,可以使用
使用公开 API (推荐)
这是最简单、最稳定、效率最高的方法,许多金融数据网站都提供了免费的 API 接口。
新浪财经 API (示例)
新浪财经的 API 是国内最常用、最稳定的免费数据源之一,它不需要复杂的解析,直接返回 JSON 或文本格式数据。
接口示例 (获取腾讯股票 00700.HK 的实时数据):
https://hq.sinajs.cn/?list=rt_hk00700
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,才考虑解析网页,这种方法非常脆弱,网站一旦改版,代码就可能失效。
目标:同花顺网页
我们以同花顺网页为例,展示如何使用 requests 和 BeautifulSoup 解析数据。
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,能获取“隐藏”数据 | 效率低、不稳定、易失效、法律风险高 | ⭐ (仅作技术学习) |
给你的最终建议:
- 首选 Tushare:如果你是国内 A 股数据,Tushare 是不二之选,它集成了数据源,处理了各种异常,让你专注于数据分析本身。
- 次选新浪 API:如果只是简单获取几只股票的快照,新浪 API 的 Python 实现非常简单直接。
- 避免网页解析:除非有特殊需求且没有其他选择,否则不要轻易选择这条路,维护成本太高。
希望这份详细的指南能帮助你成功实现股票数据的实时爬取!
文章版权及转载声明
作者:咔咔本文地址:https://jits.cn/content/171.html发布于 2025-10-30
文章转载或复制请以超链接形式并注明出处杰思科技・AI 股讯



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