在上一篇文章中分享到了如何去获取股票历史行情数据,接下来的文字我们讲讲如何将获取的数据进行保存;
1.梳理思路
在进行写代码之前我们先思考一下:1.数据以什么形式保存 2.如果有重复的数据怎么进行处理
3.如果想要爬多个股票的数据是否需要自动创建表格 4.如何大批量存数据到数据库中提升速度;
下面针对上述的4个问题进行代码分析:
2.数据保存
2.1数据一条条的插入到数据库
def save_to_mysql(name,data):
try:
# 打开数据库连接
conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='*****', db='gupiao',
charset='utf8')
# 使用cursor方法创建一个游标
cursor = conn.cursor()
# # 执行sql语句
query = f'INSERT IGNORE into {name}(riqi, start_price, end_price, highest, minimum, cheng_jiao_liang,cheng_jiao_e,zheng_fu,zhang_die_fu,zhang_die_e,huan_shou_lv,zhang_ting,die_ting) values(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)'
values = tuple(data) #因为在上述文章中构造的数据是列表,所以这里需要将数据进行类型转换
cursor.execute(query, values)
# 提交之前的操作,如果之前已经执行多次的execute,那么就都进行提交
conn.commit()
except Exception as e:
print(f'数据插入失败,提示为:',e)
# 回滚
conn.rollback()
# 关闭cursor对象
cursor.close()
# 关闭数据库连接
conn.close()
2.2数据集体插入
def save_many_to_mysql(name,new_list):
try:
# 打开数据库连接
conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='', db='gupiao',
charset='utf8')
# 使用cursor方法创建一个游标
cursor = conn.cursor()
# # 执行sql语句
query = f'insert into {name}(riqi, start_price, end_price, highest, minimum, cheng_jiao_liang,cheng_jiao_e,zheng_fu,zhang_die_fu,zhang_die_e,huan_shou_lv,zhang_ting,die_ting) values(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)'
# values = tuple(data)
cursor.executemany(query, new_list)
# 提交之前的操作,如果之前已经执行多次的execute,那么就都进行提交
conn.commit()
except Exception as e:
print(f'数据插入失败,提示为:',e)
# 回滚
conn.rollback()
# 关闭cursor对象
cursor.close()
# 关闭数据库连接
conn.close()
2.3创建数据表
功能:因为要给每个上市公司建立一张数据表来存储数据,所以要自动创建数据表
def create(table_name,sql_key):
"""
table:你需要创建的表
sql_key:你想在表中创建的字段
"""
big_char_list = ["图片五", "图片四", "图片三", "图片二", "图片一", "用户反映"]
db = pymysql.connect(
host="127.0.0.1",
port=3306,
user='root',
password='',
db='gupiao',
charset='utf8'
)
# 连接数据库
# 更改自己的密码和testdb,这个很重要,等下表单创建好了可以在Navicat for MySQL中查询。
# 我这里的数据库名字是root,密码是liulinxs,你自己的不同得修改
cursor = db.cursor()
# db.commit()
cursor.execute("DROP TABLE IF EXISTS {}".format(table_name))
# 建表之前先删掉以前的表。
str_sql=[]
for sk in sql_key:
if sk in big_char_list:
str_sql.append(sk+" varchar(255)")
else:
str_sql.append(sk+" varchar(255)")
sql_str=",\n".join(str_sql)
#建表的sql语句,根据你自己的类型添加修改,
# 不定长数据用varchar,
# 比较确定长度的字段用char好一点,不要将char中的数字调太高
# 记得,两处地方都要修改,否则数据存储会出现问题。
#sql="CREATE TABLE usename"
# sql="ALTER TABLE student ADD age INT(4)"
sql = r"""CREATE TABLE {}({})ENGINE=InnoDB DEFAULT CHARSET=utf8""".format(
table_name, sql_str)
# 出现1064之类的错误,注意列命名:"You have an error in your SQL syntax; check the manual that corresponds
# to your MySQL server version for the right syntax to use near 'like varchar(100))
# ENGINE=InnoDB DEFAULT CHARSET=utf8mb4' at line 6")
#这里是重中之重,一般这里指定为CHARSET=utf8mb3,但是,你要插入的数据中如含有表情符号等,会报1366错误,因此要指定为utf8mb4,这样才能将表情符号插入。
cursor.execute(sql)
cursor.close()
db.commit()
db.close()
2.4判断表格是否存在
功能:因为当有新的公司数据存入时,需要判断是否有这个表
def table_exists(table_name): #这个函数用来判断表是否存在
sql = "show tables;"
# 打开数据库连接
conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='自己的密码', db='gupiao',
charset='utf8')
# 使用cursor方法创建一个游标
cursor = conn.cursor()
cursor.execute(sql)
tables = [cursor.fetchall()]
table_list = re.findall('(\'.*?\')',str(tables))
table_list = [re.sub("'",'',each) for each in table_list]
if table_name in table_list:
return 1 #存在返回1
else:
return 0 #不存在返回0
2.5 取出数据
功能:因为在后面进行可视化的时候我们需要将存入数据库的数据取出进行可视化
def fetch_daytoday_data(name,day1,day2):
data = fetch_data(name)
start = datetime.datetime.strptime(day1, "%Y-%m-%d")
end = datetime.datetime.strptime(day2, "%Y-%m-%d")
new_data=[]
for i in data:
now = datetime.datetime.strptime(i[0], "%Y-%m-%d")
if start <= now <= end:
new_data.append(i)
return tuple(new_data)
到这里我们对数据库的操作就告一段落了;
3.数据进行可视化
本文使用flask框架+echats结合,通过从数据库拿取数据后,进行数据处理,然后通过Ajax将数据从后台传到前端;
echart操作可以参考官网示例:Examples - Apache ECharts
实现效果如下:
总结
该案例的整个思路如下:编写前端html,用flask将前后端进行连接起来,用户在前端输入上市公司,按下搜索按钮后将输入框的数据传给后端,后台接收到公司名称去excel里面寻找对应的股票代码,然后通过爬虫将该公司的数据爬取存到数据库中,再取出数据进行处理,通过Ajax传数据给前端进行显示。
源码连接:https://download.csdn.net/download/fengku1/86513315
觉得有用的朋友点点关注,后续分享更多有关python的案例知识
微信公众号同步更新