連結:
zhihu.com/question/438404653/answer/1794419766
先上個展示圖股票代碼為 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' df = get_k_history(code) 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 pdimport 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__": for _ in range(1000): code = '600519' df = get_k_history(code) df.to_csv(f'{code}.csv', encoding='utf-8-sig', index=None) print(f'股票代碼:{code} 的 k線數據已保存到代碼目錄下的 {code}.csv 文件中')
if len(df) >= 240: print('已收盤') break time.sleep(60)運行環境說明Python版本要求
Python 3如果沒有安裝 Python,可以參考這篇安裝教程:
https://zhuanlan.zhihu.com/p/264318820
需要安裝的庫
pandas
requests庫的安裝方法是:打開 cmd(命令提示符或者其他終端工具),輸入以下代碼:
pip install pandas requests輸入完畢,按 Enter 鍵執行代碼,等待 successfully 出現即可。
求點讚