搭建自己的金融数据源和量化分析平台(三):读取深交所股票列表

深交所的股票信息读取比较简单:
在这里插入图片描述

看上图,爬虫读取到下载按钮的链接之后发起请求,得到XLS文件后直接解析就可以了。
这里放出深交所爬虫模块的代码:

# -*- coding: utf-8 -*-
# 深圳交易所爬虫
import osimport pandas as pd
import requests#读取最新深交所股票列表
def get_stock_list():cache_file_path = "./sotck_file.xlsx"url = "https://www.szse.cn/api/report/ShowReport?SHOWTYPE=xlsx&CATALOGID=1110&TABKEY=tab1"response = requests.get(url)open(cache_file_path, "wb").write(response.content)file = pd.read_excel(cache_file_path, dtype={'A股代码': str})stocks = []for index, row in file.iterrows():# 处理每一行的数据stocks.append(row)os.remove(cache_file_path)return stocks

爬虫模块向控制模块返回数据后由控制模块作格式统一处理:

import A_SH_basic
from MySQL import ExecInsert, ExecSelect
import A_SZ_basic
from Tools import CustomExceptionLIST = "L" #上市状态:上市
DELISTED = "D"#上市状态:退市
PAUSED = "P" #上市状态:暂停上市
SZSE = "SZSE" #交易所:深交所
SSE = "SSE" #交易所:上交所#更新A股股票列表
def update_A_stock_list(SZ=False,SH=False,BJ=False):database = "stock_a"if SZ == True:# 执行更新前先读取历史数据,若某条待更新数据与历史数据一致则跳过该条数据select_sql = "select * from stock_list where exchange = 'SZSE'"insert_sql = "insert into stock_list(stock_code,stock_name,province,industry,industry_2,enname,market,exchange,list_status,list_date,delist_date,total_share,float_share) values(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)"update_sql = "update stock_list set stock_name=%s,province=%s,industry=%s,industry_2=%s,enname=%s,market=%s,exchange=%s,list_status=%s,list_date=%s,delist_date=%s,total_share=%s,float_share=%s where stock_code=%s"select_result = ExecSelect(database, select_sql)  # 读取查询结果# 调用深交所爬虫读取上市股票列表stocks = A_SZ_basic.get_stock_list()insert_rows = []update_rows = []for stock in stocks:exist_flag = False# 遍历历史数据查询该股票是否在历史数据中for history in select_result:if history[0] == stock["A股代码"]:exist_flag = Truebreak# 该股票在历史数据中查得到,说明是旧股票,检查是否有需要更新的地方,有则放入update_rows等待写入,无则丢弃if exist_flag:if history[1] == stock["A股简称"] and history[2] == stock["省    份"] and history[3] == stock["所属行业"].split(" ")[0] and history[5] == stock["英文名称"] and history[6] == stock["板块"] and history[7] == SZSE and history[8] == LIST and history[9] == stock["A股上市日期"] and history[11] == stock["A股总股本"].replace(',', '') and history[12] == stock["A股流通股本"].replace(',', ''):passelse:stock_code = stock["A股代码"]stock_name = stock["A股简称"]province = stock["省    份"]industry = stock["所属行业"].split(" ")[0]  # 一级行业industry_2 = None  # 深交所数据无二级行业enname = stock["英文名称"]market = stock["板块"]  # 市场类型(主板、创业板、科创板、CDR)exchange = SZSE  # 交易所list_status = LIST  # 上市状态list_date = stock["A股上市日期"]delist_date = None  # 上市股暂无退市日期total_share = stock["A股总股本"].replace(',', '')float_share = stock["A股流通股本"].replace(',', '')update_rows.append((stock_name, province, industry, industry_2, enname, market, exchange,list_status, list_date, delist_date, total_share, float_share, stock_code))# 如果该股票在历史数据中查不到,说明是新股票,放入insert_rows等待写入else:stock_code = stock["A股代码"]stock_name = stock["A股简称"]province = stock["省    份"]industry = stock["所属行业"].split(" ")[0]  # 一级行业industry_2 = None  # 深交所数据无二级行业enname = stock["英文名称"]market = stock["板块"]  # 市场类型(主板、创业板、科创板、CDR)exchange = SZSE  # 交易所list_status = LIST  # 上市状态list_date = stock["A股上市日期"]delist_date = None  # 上市股暂无退市日期total_share = stock["A股总股本"].replace(',', '')float_share = stock["A股流通股本"].replace(',', '')insert_rows.append((stock_code, stock_name, province, industry, industry_2, enname, market, exchange,list_status, list_date, delist_date, total_share, float_share))# 写入数据库中不存在的新股票if len(insert_rows) > 0:result = ExecInsert(database, insert_sql, insert_rows)if result == 'success':print("写入深交所上市股票成功.")else:raise CustomException("写入深交所上市股票时发生数据库异常:" + result)# 更新数据库中存在的股票信息if len(update_rows) > 0:result = ExecInsert(database, update_sql, update_rows)if result == 'success':print("更新深交所上市股票成功.")else:raise CustomException("更新深交所上市股票时发生数据库异常:" + result)print("深交所上市股票更新结束.")

至此,我们实现了第一步:本地化存储两市5000多家股票的基本信息:
在这里插入图片描述
stock_list的字段结构如下:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/51034.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

fastapi教程(四):做出响应

请求体现的是后端的数据服务能力,而响应体现的是后端向前端的数据展示能力。 一,一个完整的web响应应该包含哪些东西 一个完整的 Web 响应通常包含以下几个主要部分: 1. 状态行- HTTP 版本- 状态码- 状态消息例如:HTTP/1.1 200…

全开源收银系统源码-支付通道

1.收银系统开发语言 核心开发语言: PHP、HTML5、Dart后台接口: PHP7.3后合管理网站: HTML5vue2.0element-uicssjs线下收银台(安卓/PC收银、安卓自助收银): Dart3框架:Flutter 3.19.6助手: uniapp商城: uniapp 2.支付通道 智慧新零售收银系统…

一下午连续故障两次,谁把我们接口堵死了?!

唉。。。 大家好,我是程序员鱼皮。又来跟着鱼皮学习线上事故的处理经验了喔! 事故现场 周一下午,我们的 编程导航网站 连续出现了两次故障,每次持续半小时左右,现象是用户无法正常加载网站,一直转圈圈。 …

小白学习webgis的详细路线

推荐打开boss直聘搜索相关岗位,查看岗位要求,对症下药是最快的。 第一阶段:基础知识准备 计算机基础 操作系统:理解Windows、Linux或macOS等操作系统的基本操作,学会使用命令行界面。网络基础:掌握TCP/I…

平价不入耳运动耳机哪款最好?五款回购榜优品种草

许多有健身运动习惯的朋友在选择耳机时会优先考虑不入耳耳机,因为它佩戴舒适,稳固性和安全性更高,不仅在运动时不会轻易掉落,还能够方便我们在进行户外运动时接收外界的声音。那么,平价不入耳运动耳机哪款最好&#xf…

docker-compose 根据yaml拉取镜像出问题

在学习go微服务时,用docker-compose启动nacos以及对应的mysql时出现上面的问题, 使用的yaml如下 version: "3.8" services:nacos:image: nacos/nacos-server:${NACOS_VERSION}container_name: nacos-standalone-mysqlenv_file:- ../env/cust…

javaEE(1)

一. Web开发概述 Web开发:指的是从网页中向后端程序发送请求,与后端程序进行交互 Web服务器:是一种软件,向浏览器等Web客户端提供文档等数据,实现数据共享,它是一个容器,是一个连接用户和程序之间的中间键 二. Web开发环境搭建 我们要实现前后端交互,首先需要中间键Web服务…

重生之“我打数据结构,真的假的?”--6.排序

1.排序的概念 排序:所谓排序,就是使⼀串记录,按照其中的某个或某些关键字的⼤⼩,递增或递减的排列起来的 操作。 1.1排序分类 2.排序算法实现 2.1插入排序 直接插⼊排序是⼀种简单的插⼊排序法,其基本思想是&#…

【Nginx】Windows生成ssl证书,Nginx反向代理HTTPS

下载 OpenSSL 环境 Windows、Linux, 证书我是在Windows上生成的自签证书。 https://slproweb.com/products/Win32OpenSSL.htmlWin64 OpenSSL v3.3.1 EXE(这个) | MSISelect Additional Tasks页面勾选 The OpenSSL binaries (/bin) directory 然后将Op…

一篇文章学完Python基础

1. 字符串 str1 "Hello" str2 " World" print(str1 str2) # 输出:HelloWorld 1.1 字符替换 text "Hello, World!" new_text text.replace("World", "Python") print(new_text) # 输出:…

2024第八届自然语言处理与信息检索国际会议 (NLPIR 2024)即将召开!

2024第八届自然语言处理与信息检索国际会议 (NLPIR 2024)将于2024年12月13-15日在日本冈山的冈山大学举行。NLPIR 2024将为自然语言处理与信息检索领域的专家学者提供一个交流与合作的平台,推动该领域的学术进步和技术创新。同时,本次会议也将为相关企业…

Golang 高性能 Websocket 库 gws 使用与设计(一)

前言 大家好这里是,白泽,这期分析一下 golang 开源高性能 websocket 库 gws。 视频讲解请关注📺B站:白泽talk 介绍 gws:https://github.com/lxzan/gws |GitHub 🌟 1.2k,高性能的 …

0724,select +tcp 聊天室喵

目录 TCP协议喵 723__01:使用select实现一个基于UDP的一对一即时聊天程序。 001: 002: TIMEWAI OR BUG 721作业: 01:在一对一聊天的基础上,使用select实现一对多的回显服务。(回显服务即接收到客户端发送的数…

Pyppeteer 的使用

puppeteer 是基于Node.js 开发的一个工具, 有了它,我们可以利用 JavaScript 控制 Chrome 浏览器的一些操作。当然, puppeteer 也可以用于网络爬虫,其 API 及其完善,功能非常强大。 Pyppeteer 其实是 puppeteer 的 python 实现&…

.net 连接达梦数据库开发环境部署

.net 开发环境部署 1. 环境准备 测试工具 Visual Studio2022 数据库版本 dm8 2. 搭建过程 1 )创建新项目 2 )选择创建空项目 3 )配置新项目 4 )右键 DM1 新建一个项 5 )加 载 驱 动 , 新 建 …

0722_驱动3 地址映射驱动点灯

一、为什么需要地址映射 在芯片手册上查看到的地址属于物理地址,在硬件层 在内核空间地址属于虚拟地址,在内核层 在驱动中,操作的是虚拟地址 需要将物理地址《--mmu内存管理单元--》虚拟地址映射 二、映射API接口 void *ioremap(unsigned lon…

backtrace

介绍 arm平台的调用栈与x86平台的调用栈大致相同,稍微有些区别,主要在于栈帧的压栈内容和传参方式不同。在arm平台的不同程序,采用的编译选项不同,程序运行期间的栈帧也会不同。有些工具在对arm的调用栈回溯时,可能会…

电商项目之如何判断线程池是否执行完所有任务

文章目录 1 问题背景2 前言3 4种常用的方法4 代码4.1 isTerminated()4.2 线程池的任务总数是否等于已执行的任务数4.3 CountDownLatch计数器4.4 CyclicBarrier计数器 1 问题背景 真实生产环境的电商项目,常使用线程池应用于执行大批量操作达到高性能的效果。应用场景…

Dify中语音和文字间转换问题的一种暂时注释方式

本文主要解释了Dify中语音和文字间转换可能会遇到的问题,并给出了一种暂时注释的解决方案。 一.文本转语音可能问题 本地部署文本转语音时,如果遇到如下问题,安装ffmpeg即可。但是如果安装后,重启系统还是遇到这个问题该如何办&…

分库分表——从理论到最佳实践

目录 1、为什么要分库分表?2、切分方案有哪些?2.1 分库2.1.1 垂直分库2.1.2 水平分库 2.2 分表2.2.1 垂直分表2.2.2 水平分表 2.3 分库分表 3、数据水平分片方法3.1 Hash分片3.2 一致性Hash分片3.3 Range分片 4、分库分表的挑战4.1 分布式id4.2 分布式事…