<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
在前面的文章中,我們一起學習瞭如何通過 Python 抓取東方財富網的實時股票資料,連結如下
今天我們就在這個基礎上,實現一個 Tkinter GUI 程式,完成無程式碼股票抓取!
首先對於 Tkinter 相信大家都是比較瞭解的,如果有小夥伴對於 Tkinter 的相關用法不是特別熟悉的話,可以看如下文章
首先我們先看一下 GUI 程式的最終效果
該程式共分三個區域:
下面我們就來看看該如何從頭完成這個 GUI 程式
首先就是程式佈局,這裡我們使用了 ttkbootstrap
庫來美化整體程式
程式初始化部分
import ttkbootstrap as ttk from ttkbootstrap.constants import * import tkinter.messagebox as messbox class MainCreator(ttk.Window): def __init__(self): super().__init__("股票抓取工具", themename="solar", resizable=(False, False)) self.configure_frame = ttk.Frame(self, padding=(10, 10, 5, 10)) self.configure_frame.pack(side=LEFT, fill=BOTH, expand=YES) self.demo_frame = ttk.Frame(self, padding=(5, 10, 10, 10)) self.demo_frame.pack(side=LEFT, fill=BOTH, expand=YES)
程式布區域性分
def create_frame(self): """Create all the frame widgets""" container = ttk.Frame(self) container.pack(side=LEFT, fill=BOTH, expand=YES, padx=5) color_group = ttk.Labelframe( master=container, text="個股查詢", padding=10 ) color_group.pack(fill=X, side=TOP) en_command = super().register(self.en_validate) self.en0 = ttk.Entry(color_group, width=5, text='', bootstyle='warning', validate='key', validatecommand=(en_command, '%P')) self.en0.insert('0', 1) self.en0.config(state=DISABLED) ...
總體上來說,我們所有的元件都是從 ttk 當中範例化的,也就是直接複用了庫 ttkbootstrap
的相關美化功能,使得我們的程式看起來更加高階美觀
下面我們編寫股票抓取程式碼和對應的儲存程式碼
股票抓取
def get_A_mins(code): if code.startswith("3") or code.startswith("0"): url = shang_A_url.replace("%s", code) elif code.startswith("6"): url = shen_A_url.replace("%s", code) else: return False res = requests.get(url) result = res.text.split("cb_1659146437934_51841953")[1].split("(")[1].split(");")[0] result_json = json.loads(result) stock_data = result_json['data'] return stock_data def get_A_days(code): if code.startswith("3") or code.startswith("0"): url = shang_A_days.replace("%s", code) elif code.startswith("6"): url = shen_A_days.replace("%s", code) else: return False res = requests.get(url) result = res.text.split("cb_1659171393020_15037673")[1].split("(")[1].split(");")[0] result_json = json.loads(result) stock_data = result_json['data'] return stock_data def get_hsj(date): total_data = [] try: for i in range(1, 5): res = requests.get(hsj_url.replace("%s", str(i))) result = res.text.split("jQuery112402508937289440778_1658838703304")[1].split("(")[1].split(");")[0] result_json = json.loads(result) stock_data = result_json['data'] if stock_data: total_data.append(stock_data) saveFunc.save_data_hsj(stock_data['diff'], date) else: return total_data return total_data except Exception as e: return False def get_Center(): total_data = [] for i in range(1, 20): res = requests.get(center_url.replace("%s", str(i))) result = res.text.split("jQuery112404177389105264733_1659176039486")[1].split("(")[1].split(");")[0] result_json = json.loads(result) center_data = result_json['data'] if center_data: total_data.append(center_data) else: return total_data def get_shang_A(): pass def get_shen_A(): pass def get_bei_A(): pass
股票程式碼分為上交所,深交所和北交所以及大盤行情資料,所以我們分別編寫函數進行處理
資料儲存
import os def save_data_mins(data, date): Code = data['code'] Name = data['name'] if not os.path.exists(r"stock_data_%s_%s_%s_mins.csv" % (Code, Name, date)): with open("stock_data_%s_%s_%s_mins.csv" % (Code, Name, date), "a+", encoding='utf-8') as f: f.write("時間,最新價,成交量(手),成交額n") for i in data['trends']: i_list = i.split(",") time = i_list[0] price = i_list[2] mount = i_list[5] count = i_list[6] row = '{},{},{},{}'.format( time,price,mount,count) f.write(row) f.write('n') else: ... def save_data_days(data, days): print(days) Code = data['code'] Name = data['name'] if not os.path.exists(r"stock_data_%s_%s_days.csv" % (Code, Name)): with open("stock_data_%s_%s_days.csv" % (Code, Name), "a+", encoding='utf-8') as f: f.write("時間,開盤價,收盤價,最高價,最低價,成交量(手),成交額,振幅,漲跌幅,漲跌額,換手率n") for i in data["klines"][::-1][:int(days)]: i_list = i.split(",") time = i_list[0] Open = i_list[1] close = i_list[2] heigh = i_list[3] low = i_list[4] mount = i_list[5] count = i_list[6] amplitude = i_list[7] changePercent = i_list[8] change = i_list[9] turnoverRate = i_list[10] row = '{},{},{},{},{},{},{},{},{},{},{}'.format( time,Open,close,heigh,low,mount,count,amplitude,changePercent,change,turnoverRate) f.write(row) f.write('n') else: ... def save_data_hsj(data, date): if not os.path.exists(r'stock_data_%s.csv' % date): with open("stock_data_%s.csv" % date, "a+", encoding='utf-8') as f: f.write("股票程式碼,股票名稱,最新價,漲跌幅,漲跌額,成交量(手),成交額,振幅,換手率,市盈率,量比,最高,最低,今開,昨收,市淨率n") for i in data: Code = i["f12"] Name = i["f14"] Close = i['f2'] ChangePercent = i["f3"] Change = i['f4'] Volume = i['f5'] Amount = i['f6'] Amplitude = i['f7'] TurnoverRate = i['f8'] PERation = i['f9'] VolumeRate = i['f10'] Hign = i['f15'] Low = i['f16'] Open = i['f17'] PreviousClose = i['f18'] PB = i['f22'] row = '{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{}'.format( Code,Name,Close,ChangePercent,Change,Volume,Amount,Amplitude, TurnoverRate,PERation,VolumeRate,Hign,Low,Open,PreviousClose,PB) f.write(row) f.write('n') else: ... def save_data_center(): pass def save_data_shang_A(): pass
接下來就是為佈局好的 GUI 程式新增各種響應功能
為個股查詢的抓取按鈕繫結方法catch
self.bt = ttk.Button(color_group, text='抓取', bootstyle='success', command=self.catch)
方法catch
的定義如下
def catch(self): self.txt.yview_moveto(1) now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') day = datetime.datetime.now().strftime('%Y-%m-%d') if self.cbvar.get() == 1: catch_day = self.en0.get() if self.en.get(): code = self.en.get() result = catchFunc.get_A_days(code) if result: saveFunc.save_data_days(result, catch_day) self.txt.insert(ttk.INSERT, "抓取股票%s成功 %s" % (code, now)) self.txt.insert(ttk.INSERT, "n") self.txt.update() self.txt.yview_moveto(1) else: print("股票程式碼錯誤") messbox.showerror("股票程式碼錯誤", "請輸入正確的股票程式碼!") else: print("請輸入股票程式碼") messbox.showerror("股票程式碼為空", "請輸入股票程式碼!") else: ...
對於批次查詢,我們是通過一個多選框開關控制的
self.cb_batch = ttk.Checkbutton(cr_group, text="開啟批次", variable=self.cbvar1, command=self.cb_button)
繫結的方法如下
def cb_button(self): if self.cbvar1.get() == 1: self.bt_batch.config(state=NORMAL) else: self.bt_batch.config(state=DISABLED)
以上就是Python+Tkinter製作股票資料抓取小程式的詳細內容,更多關於Python Tkinter股票資料抓取的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45