如何用Python獲取實時的股票數(shù)據(jù)?


代碼展示
獲取當(dāng)日分鐘線數(shù)據(jù)
from urllib.parse import urlencodeimport pandas as pdimport requestsdef gen_secid(rawcode: str) -> str:'''生成東方財富專用的secidParameters----------rawcode : 6 位股票代碼Return------str: 指定格式的字符串'''# 滬市指數(shù)if rawcode[:3] == '000':return f'1.{rawcode}'# 深證指數(shù)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線數(shù)據(jù)Parameters----------code : 6 位股票代碼beg: 開始日期 例如 20200101end: 結(jié)束日期 例如 20200201klt: k線間距 默認為 101 即日kklt:1 1 分鐘klt:5 5 分鐘klt:101 日klt:102 周fqt: 復(fù)權(quán)方式不復(fù)權(quán) : 0前復(fù)權(quán) : 1后復(fù)權(quán) : 2Return------DateFrame : 包含股票k線數(shù)據(jù)'''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'] = secidurl = 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 dfif __name__ == "__main__":# 股票代碼code = '600519'# 根據(jù)股票代碼、開始日期、結(jié)束日期獲取指定股票代碼指定日期區(qū)間的k線數(shù)據(jù)df = get_k_history(code)# 保存k線數(shù)據(jù)到表格里面df.to_csv(f'{code}.csv', encoding='utf-8-sig', index=None)print(f'股票代碼:{code} 的 k線數(shù)據(jù)已保存到代碼目錄下的 {code}.csv 文件中')
獲取當(dāng)日分鐘線數(shù)據(jù)(每分鐘運行一次,直到收盤)
from urllib.parse import urlencodeimport pandas as pdimport requestsimport timedef gen_secid(rawcode: str) -> str:'''生成東方財富專用的secidParameters----------rawcode : 6 位股票代碼Return------str: 指定格式的字符串'''# 滬市指數(shù)if rawcode[:3] == '000':return f'1.{rawcode}'# 深證指數(shù)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線數(shù)據(jù)Parameters----------code : 6 位股票代碼beg: 開始日期 例如 20200101end: 結(jié)束日期 例如 20200201klt: k線間距 默認為 101 即日kklt:1 1 分鐘klt:5 5 分鐘klt:101 日klt:102 周fqt: 復(fù)權(quán)方式不復(fù)權(quán) : 0前復(fù)權(quán) : 1后復(fù)權(quán) : 2Return------DateFrame : 包含股票k線數(shù)據(jù)'''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'] = secidurl = 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 dfif __name__ == "__main__":# 重復(fù) 1000 次for _ in range(1000):# 股票代碼code = '600519'# 根據(jù)股票代碼、開始日期、結(jié)束日期獲取指定股票代碼指定日期區(qū)間的k線數(shù)據(jù)df = get_k_history(code)# 保存k線數(shù)據(jù)到表格里面df.to_csv(f'{code}.csv', encoding='utf-8-sig', index=None)print(f'股票代碼:{code} 的 k線數(shù)據(jù)已保存到代碼目錄下的 {code}.csv 文件中')# 240 行說明收盤了,結(jié)束if len(df) >= 240:print('已收盤')breaktime.sleep(60)
運行環(huán)境說明
Python版本要求
Python 3
需要安裝的庫
pandas
requests
庫的安裝方法是:打開 cmd(命令提示符或者其他終端工具),輸入以下代碼:
pip install pandas requests輸入完畢,按 Enter 鍵執(zhí)行代碼,等待 successfully 出現(xiàn)即可。
原文鏈接:zhihu.com/question/438404653/answer/1794419766
文章轉(zhuǎn)載:Python編程學(xué)習(xí)圈
(版權(quán)歸原作者所有,侵刪)
![]()

點擊下方“閱讀原文”查看更多
評論
圖片
表情
