• 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的文件夹中:

  • 相关阅读:
    【RocketMQ】基本使用:Java操作RocketMQ(rocketmq-client)
    【 第十六章 Lambda表达式】
    深度学习入门之线性代数(PyTorch)
    在CentOS7上增加swap空间
    Spring Cloud AWS配置中心使用
    ReactNative踩坑及技术方案总结(2022 持续更新中)
    Linux 下命令行启动与关闭WebLogic的相关服务
    Java中List不同实现类的对比
    java项目开发jsp编程web师生与家长交流论坛myeclipse开发sqlserver数据库计算机网页
    MQTT云台如何助力分布式农村污水处理的远程管理
  • 原文地址:https://blog.csdn.net/k1419197516/article/details/133723124