【爬虫】爬取股票数据写入数据库并显示(四)

在这里插入图片描述
本文所涉及代码已全部打包上传,需要可以到文章末尾查看获取方式,免费,仅做学习交流!!!

股票客户端软件

2024/05,本文主要内容如下:

  1. 使用python requests爬取东方财富官网数据。
  2. 将爬取的数据通过sqlalchemy写入sqlite数据库。
  3. 使用pyqt5写界面进行显示所有爬取的数据列表,以及历史K线信息。
  4. 如果本地数据库存在,则检查是否是最新数据,进行更新追加数据,否则直接显示本地数据。
  5. 可以根据时间段,查询显示K线组合。
  6. 后续计划:会不断完善,最终目标是做出一个简单的股票查看客户端,并能够根据条件查询选股。
  7. 本系列所有源码均无偿分享,仅作交流无其他,供大家参考。
    python依赖环境如下:
conda create --name xuan_gu python=3.9 --channel https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
conda remove --name xuan_gu --all
conda activate xuan_gu

pip install PyQt5==5.15.10 -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install pyqtgraph==0.13.6 -i https://pypi.tuna.tsinghua.edu.cn/simple
#python -m pyqtgraph.examples 查看图形化的pyqtgraph示例

pip install requests==2.31.0 -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install pandas==2.2.2 -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install jsonpath==0.8.2 -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install sqlalchemy==2.0.30 -i https://pypi.tuna.tsinghua.edu.cn/simple

1. 爬取数据并入库

可参考我之前写的文章,目前爬取的数据包括:

2. 界面逻辑

  1. 读取数据库填充左侧列表
  2. 点击左侧列表,查询本地数据库中的日期,如果不是最新日期,则爬取最新的K线入库并显示
  3. 时间可筛选K线显示
  4. 光标定位,会将信息提取到右上角显示
    主K线逻辑如下所示:
"""
股票软件用到的 股票K线图画板
class CandlestickItem: K线图绘制的封装类: 绘制K线图
"""
from PyQt5 import QtWidgets, QtCore
import pyqtgraph as pg
from pyqtgraph.Qt import QtGui
from K_UI.base_widget import CandlestickItem

class K_Widget(QtWidgets.QWidget):
    signal_TextShow = QtCore.pyqtSignal(str) # 定义信号
    def __init__(self):
        super().__init__()
        self.init_data()
        self.init_ui()
        
    def init_data(self):
        self.cur_code = 0
        self.cur_name = ''
        self.cur_candle_data = []
        pass
        
    def init_ui(self):
        self.pw = pg.PlotWidget()
        self.x_axis = self.pw.getAxis('bottom')
        self.x_axis.setHeight(50) # 设置X轴的高度
        self.x_axis.setStyle(tickFont=QtGui.QFont("Arial", 10))
        self.pw.setMouseEnabled(x=True, y=False)
        self.pw.setAutoVisible(x=False, y=True)
        
        layout = QtWidgets.QVBoxLayout()
        layout.addWidget(self.pw)
        self.setLayout(layout)
        
        self.pw.scene().sigMouseMoved.connect(self.mouseMoved)
        
    def caculate_and_show_data(self, code, name, candle_data):
        '''
            candle_data = 
            [(1/2/3, '2024-05-09', 1, 2, 3, 4, 5, 6, 7, 8, 9, 10)]
            1/2/3是编号, 从0开始
            1     2    3     4    5       6       7     8      9      10
            开盘, 收盘, 最高, 最低, 成交量, 成交额, 振幅, 涨跌幅, 涨跌额, 换手率
        '''
        self.pw.clear()

        self.cur_code = code
        self.cur_name = name
        self.cur_candle_data = candle_data
        # 自定义X轴标签
        x_labels, x_show_labels = [],[]  # 格式为 (位置, 标签字符串), 例如: [(0, 2025-05-10), (1, 2025-05-11)]
        for (t, time, open, close, max, min, cjl, cje, zf, zdf, zde, hsl) in candle_data:
            x_labels.append((t, time))
        
        # 获取自定义的X轴实例 并设置自定义标签 每间隔6个x轴的单位,显示x轴的时间串
        for i, label in enumerate(x_labels):
            if i % 6 == 0:
                lab_x = f'{label[1][:4]}\n{label[1][-5:]}'
                x_show_labels.append((i, lab_x))
                # x_show_labels.append((i, label[1]))
        self.x_axis.setTicks([x_show_labels])
        
        self.vLine = pg.InfiniteLine(angle=90, movable=False)
        self.hLine = pg.InfiniteLine(angle=0, movable=False)
        # self.label_tip = pg.TextItem()
        self.pw.addItem(self.vLine, ignoreBounds=True)
        self.pw.addItem(self.hLine, ignoreBounds=True)
        # self.pw.addItem(self.label_tip, ignoreBounds=True)
        
        self.vb = self.pw.getViewBox()
        candle_fixed_target = CandlestickItem(candle_data)
        self.pw.addItem(candle_fixed_target)

    def mouseMoved(self, evt):
        '''
self.cur_candle_data = 
[(0/1(编号0开始), '2024-05-09',  1, 2, 3, 4, 5, 6, 7, 8, 9, 10)]

                                1     2    3     4    5       6       7     8      9      10
                                开盘, 收盘, 最高, 最低, 成交量, 成交额, 振幅, 涨跌幅, 涨跌额, 换手率
        '''
        pos = evt
        if self.pw.sceneBoundingRect().contains(pos):
            if hasattr(self, 'vb'):
                mousePoint = self.vb.mapSceneToView(pos)
                index = int(mousePoint.x())
                # print('mouse x=', mousePoint.x(), 'mouse y=', mousePoint.y())
                # mouse x= 83.73188814580678 mouse y= 12.14799677228214
                if index > 0 and index < len(self.cur_candle_data):
                    zdf = self.cur_candle_data[index][9]
                    y = f"{mousePoint.y():.2f}"
                    html_str = f"<span style='font-size: 12pt'>【{self.cur_name}】 " \
                               f"<span style='font-size: 12pt'>({self.cur_candle_data[index][1]})</span> " \
                               f"<span style='font-size: 12pt'>价格: {y}</span> "
                    if int(zdf) > 0:
                        html_str += f"<span style='color: red'>涨跌幅: {zdf}%</span>  "
                    else:
                        html_str += f"<span style='color: green'>涨跌幅: {zdf}%</span>  "
                    
                    self.signal_TextShow.emit(html_str)
                    # self.label_text.setHtml(html_str)
                    # self.label_tip.setPos(mousePoint.x(), mousePoint.y())
                pass

                self.vLine.setPos(mousePoint.x())
                self.hLine.setPos(mousePoint.y())
        pass

结束语

由于本人能力有限,难免有疏漏之处。
文中源码文件【获取方式】:关注公众号:利哥AI实例探险
给公众号发送 爬虫股票客户端 获取下载方式,免费,无套路,只要关注!!!
原文链接如下:
【爬虫】爬取股票数据写入数据库并显示(四)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

利哥AI实例探险

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值