Py学习  »  Python

如何用Python获取实时的股票数据?

马哥Linux运维 • 2 年前 • 2219 次点击  

先上个展示图


股票代码为 600519 的股票 1 分钟数据

代码展示

获取当日分钟线数据

from urllib.parse import urlencodeimport pandas as pdimport requests

def gen_secid(rawcode: str) -> str: ''' 生成东方财富专用的secid
Parameters ---------- rawcode : 6 位股票代码
Return ------ str: 指定格式的字符串
''' # 沪市指数 if rawcode[:3] == '000': return f'1.{rawcode}' # 深证指数 if rawcode[:3] == '399': return f'0.{rawcode}' # 沪市股票 if rawcode[0] != '6': return f'0.{rawcode}' # 深市股票 return f'1.{rawcode}'

def get_k_history(code: str, beg: str = '16000101', end: str = '20500101', klt: int = 1, fqt: int = 1) -> pd.DataFrame: ''' 功能获取k线数据
Parameters ---------- code : 6 位股票代码 beg: 开始日期 例如 20200101 end: 结束日期 例如 20200201 klt: k线间距 默认为 101 即日k klt:1 1 分钟 klt:5 5 分钟 klt:101 日 klt:102 周 fqt: 复权方式 不复权 : 0 前复权 : 1 后复权 : 2 Return ------ DateFrame : 包含股票k线数据 ''' EastmoneyKlines = { 'f51': '日期', 'f52': '开盘', 'f53': '收盘', 'f54': '最高', 'f55': '最低', 'f56': '成交量', 'f57': '成交额', 'f58': '振幅', 'f59': '涨跌幅', 'f60': '涨跌额', 'f61': '换手率',

} EastmoneyHeaders = { 'Host': '19.push2.eastmoney.com', 'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; Touch; rv:11.0) like Gecko', 'Accept': '*/*', 'Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2', 'Referer': 'http://quote.eastmoney.com/center/gridlist.html', } fields = list(EastmoneyKlines.keys()) columns = list(EastmoneyKlines.values()) fields2 = ",".join(fields) secid = gen_secid(code) params = ( ('fields1', 'f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13'), ('fields2', fields2), ('beg', beg), ('end', end), ('rtntype', '6'), ('secid', secid), ('klt', f'{klt}'), ('fqt', f'{fqt}'), ) params = dict(params) base_url = 'https://push2his.eastmoney.com/api/qt/stock/kline/get' url = base_url+'?'+urlencode(params) json_response: dict = requests.get( url, headers=EastmoneyHeaders).json()
data = json_response.get('data') if data is None: if secid[0] == '0': secid = f'1.{code}' else: secid = f'0.{code}' params['secid'] = secid url = base_url+'?'+urlencode(params) json_response: dict = requests.get( url, headers=EastmoneyHeaders).json() data = json_response.get('data') if data is None: print('股票代码:', code, '可能有误') return pd.DataFrame(columns=columns)
klines = data['klines']
rows = [] for _kline in klines:
kline = _kline.split(',') rows.append(kline)
df = pd.DataFrame(rows, columns=columns)
return df

if __name__ == "__main__": # 股票代码 code = '600519' # 根据股票代码、开始日期、结束日期获取指定股票代码指定日期区间的k线数据 df = get_k_history(code) # 保存k线数据到表格里面 df.to_csv(f'{code}.csv', encoding='utf-8-sig', index=None) print(f'股票代码:{code} 的 k线数据已保存到代码目录下的 {code}.csv 文件中')

获取当日分钟线数据(每分钟运行一次,直到收盘)

from urllib.parse import urlencodeimport pandas as pd


    
import requestsimport time

def gen_secid(rawcode: str) -> str: ''' 生成东方财富专用的secid
Parameters ---------- rawcode : 6 位股票代码
Return ------ str: 指定格式的字符串
''' # 沪市指数 if rawcode[:3] == '000': return f'1.{rawcode}' # 深证指数 if rawcode[:3] == '399': return f'0.{rawcode}' # 沪市股票 if rawcode[0] != '6': return f'0.{rawcode}' # 深市股票 return f'1.{rawcode}'

def get_k_history(code: str, beg: str = '16000101', end: str = '20500101', klt: int = 1, fqt: int = 1) -> pd.DataFrame: ''' 功能获取k线数据
Parameters ---------- code : 6 位股票代码 beg: 开始日期 例如 20200101 end: 结束日期 例如 20200201 klt: k线间距 默认为 101 即日k klt:1 1 分钟 klt:5 5 分钟 klt:101 日 klt:102 周 fqt: 复权方式 不复权 : 0 前复权 : 1 后复权 : 2 Return ------ DateFrame : 包含股票k线数据 ''' EastmoneyKlines = { 'f51': '日期', 'f52': '开盘', 'f53': '收盘', 'f54': '最高', 'f55': '最低', 'f56': '成交量', 'f57': '成交额', 'f58': '振幅', 'f59': '涨跌幅', 'f60': '涨跌额', 'f61': '换手率',

} EastmoneyHeaders = { 'Host': '19.push2.eastmoney.com', 'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; Touch; rv:11.0) like Gecko', 'Accept': '*/*', 'Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2', 'Referer': 'http://quote.eastmoney.com/center/gridlist.html', } fields = list(EastmoneyKlines.keys()) columns = list(EastmoneyKlines.values()) fields2 = ",".join(fields) secid = gen_secid(code) params = ( ('fields1', 'f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13'), ('fields2', fields2), ('beg', beg), ('end', end), ('rtntype', '6'), ('secid', secid), ('klt', f'{klt}'), ('fqt', f'{fqt}'), ) params = dict(params) base_url = 'https://push2his.eastmoney.com/api/qt/stock/kline/get' url = base_url+'?'+urlencode(params) json_response: dict = requests.get( url, headers=EastmoneyHeaders).json()
data = json_response.get('data') if data is None: if secid[0] == '0': secid = f'1.{code}' else: secid = f'0.{code}' params['secid'] = secid url = base_url+'?'+urlencode(params) json_response: dict = requests.get( url, headers=EastmoneyHeaders).json() data = json_response.get('data') if data is None: print('股票代码:', code, '可能有误') return pd.DataFrame(columns=columns)
klines = data['klines']
rows = [] for _kline in klines:
kline = _kline.split(',') rows.append(kline)
df = pd.DataFrame(rows, columns=columns)
return df

if __name__ == "__main__": # 重复 1000 次 for _ in range(1000): # 股票代码 code = '600519' # 根据股票代码、开始日期、结束日期获取指定股票代码指定日期区间的k线数据 df = get_k_history(code) # 保存k线数据到表格里面 df.to_csv(f'{code}.csv', encoding='utf-8-sig', index=None) print(f'股票代码:{code} 的 k线数据已保存到代码目录下的 {code}.csv 文件中')
# 240 行说明收盘了,结束 if len(df) >= 240: print('已收盘') break time.sleep(60)

运行环境说明

Python版本要求

Python 3

需要安装的库

pandas
requests

库的安装方法是:打开 cmd(命令提示符或者其他终端工具),输入以下代码

pip install pandas requests

输入完毕,按 Enter 键执行代码,等待 successfully 出现即可

原文链接:zhihu.com/question/438404653/answer/1794419766

文章转载:Python编程学习圈
(版权归原作者所有,侵删)

点击下方“阅读原文”查看更多

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/120116
 
2219 次点击