本文目录导读:

** 从零到一:用Python脚本高效抓取股票行情数据的实战指南(附规避反爬策略)
目录导读
- 为什么你需要一套“股票数据脚本”?—— 手动查股的三个痛点
- 选对武器:主流数据源(Tushare / AkShare / 东方财富接口)横评
- 核心实战:10行代码拉取实时股价与历史K线(含注释)
- 进阶技巧:如何优雅处理“数据频率限制”与“反爬虫指纹”
- 避坑指南:常见报错及解决方案(HTTP 403 / 字段缺失)
- 问答精华:免费接口稳定性”与“数据延迟”的灵魂拷问
在信息爆炸的交易时代,靠F5刷新网页看行情,不仅效率低下,更容易错过关键的买卖点,当你同时关注30只股票时,手动复制粘贴到Excel的行为,几乎等于职业交易员的“自杀式袭击”。用脚本批量、定时、自动化获取股票数据,早就是量化交易与个人投研的基础门槛,我们不谈晦涩的金融工程,只谈如何用最直白的Python代码,构建你自己的“数据水管”。
为什么你需要一套“股票数据脚本”?
痛点很现实:第一,时效性差——网页刷新有延迟,盘口异动无法实时捕捉;第二,维度单一——网页只显示市盈率、涨跌幅,但你想要“北向资金连续5日净流入”这种衍生指标,手动算会崩溃;第三,无法复盘——你需要分钟级的历史Tick数据来回测策略,网页端只给前复权日线,脚本的本质,是把“看盘”变成“算盘”。
选对武器:主流数据源横评
搜索引擎上充斥着各种“免费API”,但真正能用的只有三类:
- Tushare Pro:积分制,注册有基础分,能拿日线,想要高频或财务数据需攒积分。优点:数据规范,字段全(含市净率、总市值)。缺点:有调用频次限制(每分钟200次)。
- AkShare:纯开源、免积分,直接爬取新浪、东财等公开网页并解析。优点:接口极其丰富(期货、期权、基金都有)。缺点:依赖第三方网页结构,对方改版你就得更新代码。
- 东方财富 Push2 API:非官方但极其稳定,返回JSON格式,速度最快。适合:纯实时报价,但字段需要自己对照文档。
核心实战:10行代码拉取实时股价
这里我们以 AkShare 为例(因为它零门槛),先安装依赖:pip install akshare。
import akshare as ak
import pandas as pd
# 1. 获取实时行情快照(包含最新价、涨跌幅、成交量)
def get_realtime_quote(stock_code="sh600519"): # 贵州茅台
# 注意前缀:sh/sz/bj
df = ak.stock_zh_a_spot_em() # 获取沪深京A股全量数据
# 筛选指定股票(注意代码格式需6位数字)
result = df[df["代码"] == stock_code[-6:]]
return result[["代码", "名称", "最新价", "涨跌幅", "成交额"]]
# 2. 获取历史日线数据(用于回测或趋势判断)
def get_history(stock_code="600519", days=250):
# 这里直接用东财的接口,更稳定
df = ak.stock_zh_a_hist(symbol=stock_code, period="daily",
start_date="20240101", end_date="20241231", adjust="qfq")
return df[["日期", "开盘", "收盘", "最高", "最低", "成交量"]]
if __name__ == "__main__":
print(get_realtime_quote("sh600519"))
print(get_history().tail(3))
注意:如果你需要“实时”且“高速”的盘口,建议使用东方财富的 push2.eastmoney.com 接口,但上述代码已满足90%的日常分析需求。
进阶技巧:优雅规避“反爬”与“频率限制”
搜索引擎上讨论最多的坑就是“明明代码没问题,突然返回空值”,原因多半是触发了反爬,解决方案如下:
- 加UA头:伪装成浏览器,不要用默认的
Python-requests。 - 随机延时:在循环请求中
time.sleep(random.uniform(0.5, 1.5))打散节奏。 - 使用代理IP池(仅限大规模采集时)。
- 最稳妥方案:对于Tushare,尽量使用
pro.trade_cal()先获取交易日历,再循环取数,避免对非交易日发请求浪费配额。
避坑指南:常见报错及解决方案
- 报错
KeyError: '日期':说明字段名变了,AkShare版本更新后,通常将中文列名改为date,请查看官方文档。 - 报错
HTTP 403 Forbidden:IP被临时封禁,停止请求10分钟,或切换数据源。 - 数据缺失(NaN):停牌股无实时数据,处理策略:用
ffill()向前填充,或用dropna()剔除。
问答精华
Q1:免费接口的数据延迟多久? A:AkShare 的东财源延迟约 2-5 秒,Tushare Pro 的实时接口延迟约 1 秒,对于超短线打板交易,建议直接用券商提供的 Level-2 行情或期货CTP接口,个人投研和日线策略,完全够用。
Q2:脚本获取的数据能直接用于实盘交易吗? A:不能,这属于“参考数据”,实盘下单必须通过券商官方API(如华泰、中金)或第三方交易终端(如QMT、Ptrade),脚本只负责“决策前的情报”,不负责“扣动扳机”。
Q3:我电脑关机了,怎么定时跑脚本?
A:部署到云服务器(阿里云轻量级99元/年),用 crontab 设定每天早上8:30运行,自动拉取数据存入MySQL或CSV,这样开盘前你就能收到邮件推送的“自选股异动清单”。
Q4:有没有无需写代码的方案? A:有,Excel 的 Power Query 可以从网页直接拉表格,但复杂逻辑仍需M语言,或者使用第三方商业数据平台(如Wind、Choice),但年费动辄数万。Python脚本是性价比最优解。