金融接口基方法Python

发布于:2025-05-16 ⋅ 阅读:(22) ⋅ 点赞:(0)
# encoding:utf-8
import sys,traceback,copy,time
from loguru import logger
from tqdm import tqdm
import pandas as pd
sys.path.append("..")
from QhSetting import QHJSPATH
from QhSpiderObj import QhQTSpider
from QhCsvMode import QhDBToCsv,QHQTDBJSON
from QhSpiderTool import QhDbPathJieXiIsMkdir,QhStarEndTime

@QhStarEndTime
def QhBaseInterface(QhFactionKey="QhJCJiaoYiRiLi",   # 01 主要用来获取配置
                    QhIsDf=True,                     # 02 返回df还是list 默认df
                    QhIsCsv=True,                    # 03 是否保存csv 默认保存
                    QhIsMd5 = True,                  # 04 id是否加密md5 默认加密
                    QhDateSort = "",                 # 05 日期排序字段名 只支持日子字段,默认空
                    QhPinJieName = None,             # 05 拼接文件名QhPinJieName = None, 支持多参数拼接逗号隔开;值为“交易日期”时,文件名会拼接交易日期
                    QhSdate=None,                    # 06 开始日期
                    QhType="A",                      # 07 循环获取类型  A表示按交易日期
                    QhParamsDic=None,                # 08 请求动态参数,支持url,param,payload三种方式,默认None
                    QhUrlCanShu="",                  # 09 url参数,必须是param参数内参数,否则无效,和QhParamsDic key一致 只会加到
                    QhIsJiaoYiDate=False,            # 10 是否加交易日期列表 默认不加
                    QhIsBanBenHao=False,             # 11 是否加版本号 默认不加
                    QhTongYongJson = QHQTDBJSON,     # 12 获取配置文件
                    QhShiLiSpider = QhQTSpider(),    # 13 请求对象实例化
                    QhInterfaceName = "其他网",       # 14 接口名称
                    **Qhkwargs,                      # **其他参数  可以动态传递到请求方法中
                    ):
    """
    金融接口基方法
    作者:阙辉
    """
    # QH001参数配置获取逻辑
    QhUrl = QhTongYongJson[QhFactionKey]["url"]                     # 默认URL # 01主要用来获取配置
    qh_method = QhTongYongJson[QhFactionKey].get("method",None)     # 请求方法 # 01主要用来获取配置
    qh_params = QhTongYongJson[QhFactionKey].get("params",None)     # 请求参数 # 01主要用来获取配置
    qh_payload = QhTongYongJson[QhFactionKey].get("payload",None)       # 请求参数 # 01主要用来获取配置

    fielddic = QhTongYongJson[QhFactionKey]["fielddic"]    # 结果字段 # 01主要用来获取配置

    QhUniqueValue = QhTongYongJson[QhFactionKey]["QhUniqueValue"]  # 唯一值参数获取 # 01主要用来获取配置
    QhCsvPath = QhTongYongJson[QhFactionKey]["QhCsvPath"]          # 存储路径 # 01主要用来获取配置
    QhCsvPath = QhDbPathJieXiIsMkdir(QhCsvPath,QHJSPATH)           # 存储路径检查,如果文件夹不存在则创建

    if isinstance(fielddic,dict):
        fielddic_keys = list(fielddic.keys())        # 原key
        fielddic_values = list(fielddic.values())    # 中文字段名

    QhSpiderOdj = QhShiLiSpider              # 请求对象实例化   13请求对象实例化
    QhJiaoYiDate = QhSpiderOdj.QhJiaoYiDate  # 交易日期列表
    QhSpiderOdj.qh_url = QhUrl               # 请求url传递给请求对象
    if qh_method not in [None,""]: QhSpiderOdj.qh_method = qh_method  # 请求方法 传递给请求对象

    # QH002请求逻辑
    if QhParamsDic in [None,""]:
        # QH00201请求逻辑>无动态参数传递逻辑
        if qh_params not in [None,""]: QhSpiderOdj.qh_params = qh_params  # 请求参数 url参数01
        if qh_payload not in [None,""]: QhSpiderOdj.qh_payload = qh_payload     # 请求参数 post参数01
        logger.warning("【{}请求-固定】无动态参数请求,QueHui!\n请求参数【{}】".format(QhInterfaceName,QhSpiderOdj.qh_params))
        # QhSpiderForMain 这个函数的命名必须一致
        QhJieGuoList = QhSpiderOdj.QhSpiderForMain(QhFielddicKeys=fielddic_keys,
                                                QhSdate=QhSdate,
                                                QhType=QhType,
                                                **Qhkwargs, # **其他参数
                                                )

        if QhIsDf:
            # 返回list,此函数组装df
            if len(QhJieGuoList) == 0 or QhJieGuoList in [None,""]: return
            QhJieGuoDf = pd.DataFrame(QhJieGuoList,columns=fielddic_values)
        else:
            # 返回df
            QhJieGuoDf = QhJieGuoList
    else:
        # QH00202请求逻辑>有动态参数传递逻辑

        # 动态参数,参数可变 设计说明 阙辉
        # QhParamsDic = {
        # "QhKey" : "请求参数01|请求参数02^|...",   # QhValue 的参数值位置要对应 ^表示是qh_proxy的动态参数
        # "QhFied" : "存储字段名01|存储字段名02|..",  # QhValue 的存储值位置要对应
        # "QhValue":{"请求参数值01|请求参数值02|...":"存储字段值01|存储字段值02|..."},}
        #  当QhKey与QhUrlCanShu01相等时,参数就是url参数 url多参数的情况通过","隔开分割 例:"参数01,参数02,..."

        QhI=0
        QhKeyList= QhParamsDic["QhKey"].split("|")
        QhFiedList= QhParamsDic["QhFied"].split("|")
        QhParamsDicVal = QhParamsDic["QhValue"]
        QhReqLen = len(QhParamsDicVal.items())  # 获取动态参数的总数量 即请求次数
        # QhPbar = tqdm(total=len(QhParamsDicVal.items()))
        # QhPbar.set_description("【{}请求-进度条】".format(QhInterfaceName))
        for QhKey,QhValue in QhParamsDicVal.items():
            QhUrl01 = copy.deepcopy(QhUrl)
            QhKeyListv = QhKey.split("|")
            QhFiedListv = QhValue.split("|")
            for i,QhRow in enumerate(QhKeyListv):
                QhCanShuKey = QhKeyList[i]
                QhCanShuValue = QhRow
                if "^" in QhCanShuKey: 
                    # ^符号代表是payload参数 post请求参数
                    QhCanShuKey = QhCanShuKey.replace("^","")  # 去掉^符号,^一般放在参数最后,代表是payload参数
                    qh_payload[QhCanShuKey] = QhCanShuValue
                elif QhUrlCanShu == QhCanShuKey and "{}" in QhUrl01:
                    # 财联社url内部参数添加  已支持多参数传递,但是需要顺序一致 阙辉
                    # 目前已解决  支持url多个参数拼接
                    QhCanShuValue = QhCanShuValue.split(",")  # 多个参数拼接是由“,”隔开,然后再切分成列表
                    QhUrl01 = QhUrl01.format(*QhCanShuValue)  # 组装url
                    QhSpiderOdj.qh_url = QhUrl01              # 重新赋值url到请求对象 只能赋值一次 所以直接赋值对象
                else:
                    # params参数 主要是get请求的参数
                    qh_params[QhCanShuKey] = QhCanShuValue

            if qh_params not in [None,""]: QhSpiderOdj.qh_params = qh_params  # 请求参数 url参数02
            if qh_payload not in [None,""]: QhSpiderOdj.qh_proxy = qh_payload     # 请求参数 post参数02
            QhReqsCount = QhI + 1
            logger.warning("【{}请求-动态】第[{}]次请求,有动态参数,共[{}]次请求,QueHui!\n请求参数【{}】".format(QhInterfaceName,
                                                                                      QhReqsCount,QhReqLen,
                                                                                      QhSpiderOdj.qh_params))
            # QhSpiderForMain 这个函数的命名必须一致
            QhJieGuoList=QhSpiderOdj.QhSpiderForMain(QhFielddicKeys=fielddic_keys,
                                                QhSdate=QhSdate,
                                                QhType=QhType,
                                                **Qhkwargs, # **其他参数
                                                )
            # QhPbar.update(1)
            if QhIsDf:
                # 返回list,此函数组装df
                if len(QhJieGuoList) == 0 or QhJieGuoList in [None,""]: continue
                QhJieGuoDfRow = pd.DataFrame(QhJieGuoList,columns=fielddic_values)

                for i,QhRow in enumerate(QhFiedListv):
                    # 动态参数存储字段值增加到pandas对象中
                    # 字段名不为空的时候才赋值新的列,否则不赋值 
                    if QhFiedList[i] != "":QhJieGuoDfRow[QhFiedList[i]] = QhRow

                # 合并多次请求的数据
                if QhI == 0:
                    QhJieGuoDf = QhJieGuoDfRow
                else:
                    QhJieGuoDf = pd.concat([QhJieGuoDf,QhJieGuoDfRow],axis=0, ignore_index=True)
            else:
                # 返回List  
                # 合并多次请求的数据 不会做存储处理,直接返回list
                if QhI == 0:
                    QhJieGuoDfList = QhJieGuoList
                else:
                    QhJieGuoDfList = QhJieGuoDfList + QhJieGuoList

            QhI+=1   # 计数器+1
            
    # QH003请求结束后的处理逻辑 阙辉
    if QhIsDf:
        # QH00301数据处理逻辑 阙辉
        if QhIsJiaoYiDate: QhJieGuoDf["交易日期"] = QhJiaoYiDate[2]   # 添加交易日期
        if QhIsBanBenHao: QhJieGuoDf["版本号"] = "Q{}".format(time.strftime("%Y%m%d%H%M%S",time.localtime()))  # 添加版本号

        # QH00302文件名和路径处理逻辑 阙辉
        QhCsvName0 = copy.deepcopy(QhTongYongJson[QhFactionKey]["QhCsvName"])   # 01主要用来获取配置
        # 表格名拼接可以考虑放在是否存储后添加,
        if "{}" in QhCsvName0 and QhPinJieName not in [None]:
            # 判断表名是否需要加股票代码
            # 需要加股票代码
            # symbol = QhSpiderOdj.qh_params["symbol"]
            QhCsvNameA = copy.deepcopy(QhCsvName0)
            if QhPinJieName in ["交易日期"]:
                # 交易日期拼接到文件名  仅拼接交易日期,其他参数不拼接
                QhJiaoYiDate00 = QhJiaoYiDate[2]
                QhCsvNameA = QhCsvNameA.format(QhJiaoYiDate00.replace("-",""))
            else:
                if QhPinJieName not in [None]:
                    if "." in QhPinJieName: QhPinJieName = QhPinJieName.replace(".","_")  # 替换文件名中的点
                QhPinJieName = QhPinJieName.split(",")         # 多个参数拼接是由“,”隔开,然后再切分成列表
                QhCsvNameA = QhCsvNameA.format(*QhPinJieName)  # 支持多个参数拼接 但是位置要一致
            QhCsvPath = "{}\{}".format(QhCsvPath,QhCsvNameA)
        else:
            # 不需要加股票代码
            QhCsvPath = "{}\{}".format(QhCsvPath,QhCsvName0)
            
        # QH00303数据存储处理逻辑 阙辉
        if QhIsCsv:
            # QhJieGuoDf = QhDBToCsv(QhCsvPath,
            QhDBToCsv(QhCsvPath,
                    QhUniqueValue,
                    QhJieGuoDf=QhJieGuoDf,
                    QhDateSort=QhDateSort,
                    QhIsCsv=QhIsCsv,
                    QhIsMd5=QhIsMd5) 
    else:
        # 返回List  
        # 合并多次请求的数据 不会做存储处理,直接返回list  阙辉
        QhJieGuoDf = QhJieGuoDfList

    return QhJieGuoDf

if __name__ == '__main__':
    
    pass

本文介绍了一个名为QhDFBaseInterface的金融接口基方法,主要用于获取金融数据并处理。该方法支持多种配置选项,如返回数据类型(DataFrame或List)、是否保存为CSV文件、是否对ID进行MD5加密等。通过动态参数传递,可以灵活处理不同的请求逻辑,包括URL参数、POST参数等。方法还支持交易日期、版本号等字段的自动添加,并提供了文件名拼接功能。最终,数据可以存储为CSV文件或直接返回。该方法的设计旨在简化金融数据的获取与处理流程,适用于多种金融数据接口的调用场景。

 


网站公告

今日签到

点亮在社区的每一天
去签到