• 011:获取上证50的所有股票代码,并下载各个股K线数到excel表中


    我们结合《获取上证50的所有股票代码》《根据股票代码和起始日期获取K线数据到excel表》两文中的脚本,搞出新的脚本:
     

    1. import tkinter as tk
    2. from tkinter import messagebox
    3. from tkcalendar import Calendar
    4. import pandas as pd
    5. import requests
    6. from urllib.parse import urlencode
    7. import requests
    8. from bs4 import BeautifulSoup
    9. import os
    10. import shutil
    11. def gen_secid(rawcode: str) -> str:
    12. '''
    13. 生成东方财富专用的secid
    14. Parameters
    15. ----------
    16. rawcode : 6 位股票代码
    17. Return
    18. ------
    19. str: 指定格式的字符串
    20. '''
    21. # 沪市指数
    22. if rawcode[:3] == '000':
    23. return f'1.{rawcode}'
    24. # 深证指数
    25. if rawcode[:3] == '399':
    26. return f'0.{rawcode}'
    27. # 沪市股票
    28. if rawcode[0] != '6':
    29. return f'0.{rawcode}'
    30. # 深市股票
    31. return f'1.{rawcode}'
    32. def get_k_history(code: str, beg: str, end: str, klt: int = 101, fqt: int = 1) -> pd.DataFrame:
    33. '''
    34. 功能获取k线数据
    35. -
    36. 参数
    37. code : 6 位股票代码
    38. beg: 开始日期 例如 20200101
    39. end: 结束日期 例如 20200201
    40. klt: k线间距 默认为 101 即日k
    41. klt:1 1 分钟
    42. klt:5 5 分钟
    43. klt:101 日
    44. klt:102 周
    45. fqt: 复权方式
    46. 不复权 : 0
    47. 前复权 : 1
    48. 后复权 : 2
    49. '''
    50. EastmoneyKlines = {
    51. 'f51': '日期',
    52. 'f52': '开盘',
    53. 'f53': '收盘',
    54. 'f54': '最高',
    55. 'f55': '最低',
    56. 'f56': '成交量',
    57. 'f57': '成交额',
    58. 'f58': '振幅',
    59. 'f59': '涨跌幅',
    60. 'f60': '涨跌额',
    61. 'f61': '换手率',
    62. }
    63. EastmoneyHeaders = {
    64. 'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; Touch; rv:11.0) like Gecko',
    65. 'Accept': '*/*',
    66. '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',
    67. 'Referer': 'http://quote.eastmoney.com/center/gridlist.html',
    68. }
    69. fields = list(EastmoneyKlines.keys())
    70. columns = list(EastmoneyKlines.values())
    71. fields2 = ",".join(fields)
    72. secid = gen_secid(code)
    73. params = (
    74. ('fields1', 'f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13'),
    75. ('fields2', fields2),
    76. ('beg', beg),
    77. ('end', end),
    78. ('rtntype', '6'),
    79. ('secid', secid),
    80. ('klt', f'{klt}'),
    81. ('fqt', f'{fqt}'),
    82. )
    83. params = dict(params)
    84. base_url = 'https://push2his.eastmoney.com/api/qt/stock/kline/get'
    85. url = base_url+'?'+urlencode(params)
    86. json_response: dict = requests.get(
    87. url, headers=EastmoneyHeaders).json()
    88. data = json_response.get('data')
    89. if data is None:
    90. if secid[0] == '0':
    91. secid = f'1.{code}'
    92. else:
    93. secid = f'0.{code}'
    94. params['secid'] = secid
    95. url = base_url+'?'+urlencode(params)
    96. json_response: dict = requests.get(
    97. url, headers=EastmoneyHeaders).json()
    98. data = json_response.get('data')
    99. if data is None:
    100. print('股票代码:', code, '可能有误')
    101. return pd.DataFrame(columns=columns)
    102. klines = data['klines']
    103. rows = []
    104. for _kline in klines:
    105. kline = _kline.split(',')
    106. rows.append(kline)
    107. df = pd.DataFrame(rows, columns=columns)
    108. return df
    109. def select_start_date():
    110. def on_date_selected():
    111. selected_date = cal.selection_get()
    112. start_date_entry.delete(0, tk.END)
    113. start_date_entry.insert(0, selected_date.strftime('%Y%m%d'))
    114. top.destroy()
    115. top = tk.Toplevel(root)
    116. cal = Calendar(top, selectmode='day')
    117. cal.pack()
    118. confirm_button = tk.Button(top, text='确认', command=on_date_selected)
    119. confirm_button.pack()
    120. def select_end_date():
    121. def on_date_selected():
    122. selected_date = cal.selection_get()
    123. end_date_entry.delete(0, tk.END)
    124. end_date_entry.insert(0, selected_date.strftime('%Y%m%d'))
    125. top.destroy()
    126. top = tk.Toplevel(root)
    127. cal = Calendar(top, selectmode='day')
    128. cal.pack()
    129. confirm_button = tk.Button(top, text='确认', command=on_date_selected)
    130. confirm_button.pack()
    131. def get_kline_data(code,index):
    132. # code = stock_code_entry.get()
    133. start_date = start_date_entry.get()
    134. end_date = end_date_entry.get()
    135. # 修改文件保存的位置
    136. save_path = os.path.join('sz50_all_k_data', f'{code}.csv')
    137. try:
    138. df = get_k_history(code, start_date, end_date)
    139. df.to_csv(save_path, encoding='utf-8-sig', index=None)
    140. print(index,'提示', f'股票代码:{code} 的 k线数据已保存到代码目录下的 {code}.csv 文件中')
    141. except:
    142. print(index,'错误',{code}, '获取K线数据失败')
    143. def get_sz50_all_data():
    144. url = "https://q.stock.sohu.com/cn/bk_4272.shtml"
    145. response = requests.get(url)
    146. soup = BeautifulSoup(response.text, "html.parser")
    147. # 找到包含class为'e1'的元素
    148. elements = soup.find_all(class_="e1")
    149. # 提取数据并剔除非数字的成员
    150. data_list = [element.text for element in elements if element.text.isdigit()]
    151. # 打印list最终的成员
    152. print(data_list)
    153. #遍历所有成员,并调用get_kline_data
    154. # 检查并创建目录
    155. if not os.path.exists('sz50_all_k_data'):
    156. os.makedirs('sz50_all_k_data')
    157. else:
    158. shutil.rmtree('sz50_all_k_data')
    159. os.makedirs('sz50_all_k_data')
    160. index=0
    161. for code_tmp in data_list:
    162. index += 1
    163. get_kline_data(code_tmp,index)
    164. print(">>>>>>>>>>>>>>>>完成")
    165. root = tk.Tk()
    166. root.title('上证50所有个股数据获取')
    167. # stock_code_label = tk.Label(root, text='股票代码')
    168. # stock_code_label.pack()
    169. # stock_code_entry = tk.Entry(root)
    170. # stock_code_entry.pack()
    171. start_date_label = tk.Label(root, text='起始日期')
    172. start_date_label.pack()
    173. start_date_entry = tk.Entry(root)
    174. start_date_entry.pack()
    175. select_start_date_button = tk.Button(root, text='选择日期', command=select_start_date)
    176. select_start_date_button.pack()
    177. end_date_label = tk.Label(root, text='结束日期')
    178. end_date_label.pack()
    179. end_date_entry = tk.Entry(root)
    180. end_date_entry.pack()
    181. select_end_date_button = tk.Button(root, text='选择日期', command=select_end_date)
    182. select_end_date_button.pack()
    183. get_data_button = tk.Button(root, text='获取K线数据', command=get_sz50_all_data)
    184. get_data_button.pack()
    185. root.mainloop()

    效果:

    保存到名为sz50_all_k_data的文件夹中:

  • 相关阅读:
    G4012溧宁高速青云岭隧道隧道高清晰广播现场测试效果视频
    S5的未来:即将到来的协议改进和可能性
    js 锚点定位的方法
    导致静脉炎的因素有哪些呢?
    SiR-BCN 硅基罗丹明-环丙烷环辛炔 | SIR荧光染料
    Pytest----如何打开或关闭实时日志和捕获日志
    NoSQL之Redis配置与优化
    【Swift】【json】通过json字符串直接生成swift实体类
    YoloV8改进策略:FastVit与YoloV8完美融合,重参数重构YoloV8网络(全网首发)
    算法题笔记 6-10 (青蛙跳台阶)
  • 原文地址:https://blog.csdn.net/k1419197516/article/details/133723124