这里给大家介绍一下,当时初学几天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来运行。

上面的功能实现了 根据股票号和名称模糊查询实时股票数据,删除、插入股票到数据库,更新所有股票价格等。
查询展示:模糊查询包含好字的股票数据
在这里插入图片描述

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐