【使用Python编写一个访问实时股票数据的工具】包括获取股票信息、与数据库交互等
python股票信息数据库
·
这里给大家介绍一下,当时初学几天python时写的一个小工具,访问实时股票信息,之前用java写过一个模拟股票交易网站,后来玩python随便写了一个简单的来玩。
整体思路
根据以下几个方面介绍
访问股票信息的接口
使用的接口是新浪的一个股票数据接口,最开始这个接口可以直接访问,最近发现加了一个请求头的要求
代码如下:
#获取股票信息的方法
def getStocksMessages(src_num):
index=0
list=[]
header = {"Referer":"https://finance.sina.com.cn"}
request=urllib.request.Request('http://hq.sinajs.cn/list='+src_num,headers=header)
# for line in urlopen('http://hq.sinajs.cn/list='+src_num,headers=header):
for line in urlopen(request):
line = line.decode('gbk') # Decoding the binary data to text.
#print("stocks===="+line)
i=line.index('"')
if(line.find(',')>0):
j=line.index(',')
else :
continue
num=line[11:19]
name=line[i+1:j]
ls=line.split(',')
price=float(ls[3])
#print(ls)
dict={"股票代码":num,'股票名称':name,"当前股价":price}
list.append(dict)
index+=1
#返回列表,列表内的数据类型为字典 一个字典对应一支股票
return list
数据库以及表结构
一个存贮了所有上市A股的股票代码表,总共有几千条数据,之前是用JS写的一个方法存进来的,这里没贴了。
这里是一张用来存贮股票实时价格的表,方便后面进入界面显示数据的初始数据,接口可以获取很多股票的相关信息,这里只是获取了一个价格,没写复杂了。
后台数据库使用的是mysql,相关交互代码:
#连接数据库方法
def getConnectMysql():
mydb=mysql.connector.connect(
host="localhost",
user="root",
passwd="你自己的数据库密码",
database="test"
)
return mydb
#数据插入方法 当前写死
#1 插入成功 0 失败 -1已经存在
def insertIntoMysql(stocknums):
mydb=getConnectMysql()
mycursor=mydb.cursor()
#先判断股票id是否在数据库中已经存在
list_s=stocknums.split(',')
#标识符
flag=0
bad_stockid=''
for l in list_s:
f=IsExistData(l)
if(f!=flag):
flag=1
bad_stockid=l
print(l+'已经存在不能插入!')
break
else :
pass
if(flag==0):
#无论什么数据类型 都使用%s占位符
sql='insert into test_python (num,name,price) values (%s,%s,%s)'
#调用获取股票信息方法
list_stocks=getStocksMessages(stocknums)
val=[]
for l in list_stocks:
tuples=(l['股票代码'],l['股票名称'],float(l['当前股价']))
val.append(tuples)
#执行插入到数据库中
#批量插入方法 executemany
print(val)
try:
mycursor.executemany(sql,val)
mydb.commit()
return 1
except Exception as e:
print('数据插入出错:',e)
return 0
else:
print("数据插入成功!")
return 1
else:
#数据已经存在
return -1
#数据查询方法
def queryDataFromMysql(sql):
#连接数据库
mydb=getConnectMysql()
mycursor=mydb.cursor()
mycursor.execute(sql)
#fetchall()获取所有记录 #fetchone()获取一条记录
#返回结果是集合,集合里面是元组数据类型
myresult=mycursor.fetchall()
return myresult
#模糊查询 输入文字也能查询到股票数据
def queryByChars(values):
sql=" select src_num from stocks where src_num like %s or scr_name like %s "
mydb=getConnectMysql()
mycursor=mydb.cursor()
mycursor.execute(sql,values)
listdata=mycursor.fetchall()
#print(listdata)
#获取股票代码字符串
str_srcnum=''
for ln in listdata:
str_srcnum=str_srcnum+ln[0]+','
print("querybychars"+str_srcnum)
list_query=getStocksMessages(str_srcnum)
#print(list_query)
return list_query
#更新股票价格到数据库中
def updataPrice():
#先查询数据库获取所有的股票名称
strsql='select num from test_python'
mydb=getConnectMysql()
mycursor=mydb.cursor()
mycursor.execute(strsql)
listnum=mycursor.fetchall()
#print(listnum)
#更新数据
#先获得最新price
str_srcnum=''
for ln in listnum:
str_srcnum=str_srcnum+ln[0]+','
#print(str_srcnum)
# 获得新的数据列表
listnew=getStocksMessages(str_srcnum)
update_val=[]
for ln in listnew:
tuples=(float(ln['当前股价']),ln['股票代码'])
update_val.append(tuples)
#print(update_val)
update_sql='update test_python set price=%s where num=%s'
try:
mycursor.executemany(update_sql,update_val)
mydb.commit()#必须commit不然不生效
except Exception as e:
print('数据更新失败!!!',e)
raise
else:
print('数据更新成功!!')
#删除指定数据
def deleteDataByStockid(stockid):
sql="delete from test_python where num = %s"
mydb=getConnectMysql()
mycursor=mydb.cursor()
#传值类型必须为元组
val_tup=(stockid,)
try:
mycursor.execute(sql,val_tup)
mydb.commit()
print("数据删除成功!")
return 1
except Exception as e:
print("数据删除失败!"+e)
return 0
#使用到的外部库
from urllib.request import urlopen
import urllib
import mysql.connector
import os
简单的界面设计
python界面设计使用的是 tkinter 模块,这个一开始也没有完全玩明白,然后就做了个简单的外壳,能正常显示数据就行,大家有兴趣的可以自己研究,个人觉得还是用pyqt5好些,可以自己拖拽设计界面。
直接贴代码了,有兴趣的可以先运行起来,然后再去做自己的修改,不然直接看代码会很烦。
#from tkintertable import TableCanvas, TableModel
import tkinter,time,decimal,math,string
import opt_database as wt
from tkinter import ttk,messagebox
import os
#清空表格方法
def deleteData():
#清空组件
x=tree.get_children()
for item in x:
tree.delete(item)
#print(sys.version_info)
#查询数据到表格方法
def queryData(stocks,flag):
#先清空表格,再做查询
deleteData()
#sql='select * from test_python'
#如何输入文本框没有内容,就执行查询所有股票信息的代码
input_text=textinput.get()
if(input_text=="" or flag==1):
listdata=wt.queryDataFromMysql("select * from test_python")
#添加数据到表格中
i=0
for l in listdata:
tree.insert('',i,text='第'+str(i+1)+'行',values=l)
#print(i,'line'+str(i))
#添加右键功能
i+=1
#否则根据文本框信息查询
else:
input_text='%'+input_text+'%'
#查询过来的是列表{字典}
t_val=(input_text,input_text)
print(t_val)
list_data=wt.queryByChars(t_val)
list_val_tuple=[]
for l in list_data:
tuples=(l['股票代码'],l['股票名称'],float(l['当前股价']))
list_val_tuple.append(tuples)
#添加数据到表格中
i=0
for lv in list_val_tuple:
tree.insert('',i,text='第'+str(i+1)+'行',values=lv)
#print(i,'line'+str(i))
i+=1
#插入数据方法
def InsertData():
#获取用户输入的字段
stocknum=textinput.get()
#print(stocknum)
if(stocknum!=""):
ret=wt.insertIntoMysql(stocknum)
if(ret==-1):
messagebox.showerror(title='错误',message='该股票已经存在!')
elif(ret==1):
messagebox.showinfo(title='通知',message='数据插入成功!')
else:
messagebox.showinfo(title='通知',message='不输入股票代码你插什么???')
#更新价格函数
def updateprice():
wt.updataPrice()
queryData("",1)
#右键表格时触发事件
def clickTree(event):
if(tree.focus()!=""):
menu_bar.post(event.x_root,event.y_root)
#选中数据右键点击删除事件
def deleteDataFromMysql():
#获得当前选中的行的第一列值 即股票代码
stockid='';
for item in tree.selection():
item_text=tree.item(item,"values")
stockid=item_text[0]
#弹窗提示:
bool_res=messagebox.askyesno('询问', '确定删除代码为'+stockid+'的数据吗', parent=root)
#调用删除数据代码
if(bool_res==True):
#print(stockid)
ret=wt.deleteDataByStockid(stockid)
if(ret==1):
messagebox.showinfo(title='通知',message='数据删除成功!')
#更新列表数据
queryData("",1)
elif(ret==0):
messagebox.showerror(title='错误',message='数据删除失败!')
else:
pass
#将选中的数据插入到数据库
def select_Insert():
stockid='';
for item in tree.selection():
item_text=tree.item(item,"values")
stockid=item_text[0]
ret =wt.insertIntoMysql(stockid)
if(ret==1):
messagebox.showinfo(title='通知',message='插入成功!')
#更新列表数据
queryData("",1)
elif(ret==-1):
messagebox.showerror(title='错误',message='该调数据已经存在,不能再插入!')
else:
messagebox.showerror(title='错误',message='插入数据失败!')
#生成root主窗体
root=tkinter.Tk();
root.geometry('800x600');#设置主框体大小
root.title('测试')#设置标题
root.resizable(0,0)
#标签
label=tkinter.Label(root,text='股票数据',fg='red')#生成标签
label.pack();#将标签添加到主窗体中
#定义文本输入框
textinput=tkinter.Entry(width=50)
textinput.pack()
#按钮
button1=tkinter.Button(root,text='更新价格',width=10,command=updateprice) ##command绑定按钮事件
#sqlstr="select * from test_python"
#传参用lambda关键字
button2=tkinter.Button(root,text='查询数据',width=10,command=lambda:queryData("",0))
button3=tkinter.Button(root,text='清空表格',width=10,command=deleteData)
button4=tkinter.Button(root,text='插入数据',width=10,command=InsertData)
#将按钮显示
#button1.pack(side=tkinter.LEFT)
button1.pack(padx=200,pady=10,ipadx=10)
button2.pack(padx=10)
button3.pack(padx=10)
button4.pack(padx=10,ipadx=10,after=textinput)
#表格显示
tree=ttk.Treeview(root)
tree.pack(padx=65,before=button1,after=label)
#定义列
tree['columns']=('股票代码','股票名称','当前价格')
#设置列 不显示
tree.column('股票代码',width=150)
tree.column('股票名称',width=150)
tree.column('当前价格',width=150)
#显示表头
tree.heading('股票代码',text='股票代码(num)')
tree.heading('股票名称',text='股票名称(name)')
tree.heading('当前价格',text='当前价格(price)')
#绑定回车键与拆线呢数据按钮效果一致
#button2.bind('<Return>',lambda:queryData(sqlstr,0))
#右键表格出现选择标签
#菜单
menu_bar=tkinter.Menu(root,tearoff=False)
menu_bar.add_cascade(label='删除',command=deleteDataFromMysql)
menu_bar.add_cascade(label="插入到数据库",command=select_Insert)
tree.bind('<3>',clickTree)
#进入界面就查询数据显示出来
queryData("",1)
#进入消息循环(必须组件)
root.mainloop()
# os.system("pause")
功能说明
简单的界面设计 上面的所有代码,放在第一个py文件里面,下面的所有代码放在第二个文件里面
下面的代码文件需要引用第一个文件,就是 opt_database 这个模块,可以自定义名字
然后直接运行第二个文件就行了,有兴趣的可以打包成一个exe来运行。
上面的功能实现了 根据股票号和名称模糊查询实时股票数据,删除、插入股票到数据库,更新所有股票价格等。
查询展示:模糊查询包含好字的股票数据
更多推荐
已为社区贡献2条内容
所有评论(0)