# encoding:utf-8
import requests
import json
import pandas as qh_pd
import time
class QH_JiuFang_Spider(object):
def __init__(self,
qh_url,
qh_headers = "",
qh_params = "",
qh_code = "gbk",
):
self.qh_url = qh_url
self.qh_headers = qh_headers
self.qh_params = qh_params
self.qh_code = qh_code
def qh_timestamp_to_date(self,qh_timestamp, qh_format="%Y-%m-%d"):
"""
转换时间戳为日期函数 作者:阙辉
:param qh_timestamp:
:param qh_format:
:return:
"""
qh_timestamp = qh_timestamp
qh_format = qh_format
# 适应秒和毫秒
if len(str(qh_timestamp)) == 10:
qh_timestamp = int(qh_timestamp)
elif len(str(qh_timestamp)) == 13:
qh_timestamp = int(qh_timestamp) / 1000
# print(qh_timestamp)
qh_timeArray = time.localtime(qh_timestamp)
qh_otherStyleTime = time.strftime(qh_format, qh_timeArray)
return qh_otherStyleTime
def qh_jisuan(self, qh_close="", qh_zr_close="", qh_high="", qh_low="", qh_zongshou="", qh_liutong=""):
"""
计算指标函数;作者:阙辉
:param qh_close:
:param qh_zr_close:
:param qh_high:
:param qh_low:
:param qh_zongshou:
:param qh_liutong:
:return:
"""
if qh_close!= "": qh_close = float(qh_close) # 今日收盘价
if qh_zr_close != "":qh_zr_close = float(qh_zr_close) # 昨日收盘价
if qh_high != "":qh_high = float(qh_high) # 最高价
if qh_low != "":qh_low = float(qh_low) # 最低价
if qh_zongshou != "":qh_zongshou = float(qh_zongshou) # 总手
if qh_liutong != "":qh_liutong = float(qh_liutong) # 流通股/
qh_jieguo = []
# 涨跌额
if qh_close != "" and qh_zr_close != "":
qh_zdf_e = qh_close - qh_zr_close # 涨跌额 = 今日开盘价-昨日开盘价
qh_zdf_e = round(qh_zdf_e, 6)
qh_jieguo.append(str(qh_zdf_e)) # 涨跌幅插入列表
# 涨跌幅
if qh_close != "" and qh_zr_close != "":
try:
qh_zdf = qh_zdf_e / qh_zr_close # 涨跌幅 = (今日开盘价-昨日开盘价)/昨日开盘价
except:
qh_zdf = 0
qh_zdf = round(qh_zdf, 6)
qh_jieguo.append(str(qh_zdf)) # 涨跌幅插入列表
# 振幅
if qh_high != "" and qh_low !="":
try:
qh_zf = (qh_high - qh_low) / qh_zr_close # 计算振幅 = (最高价-最低价)/昨日收盘价
except:
qh_zf = 0
qh_zf = round(qh_zf, 6)
qh_jieguo.append(str(qh_zf)) # 涨跌幅插入列表
# 换手率
if qh_liutong != "" and qh_zongshou != "":
try:
qh_hsl = qh_zongshou / qh_liutong # 换手率 = 总手/流通股数
except:
qh_hsl = 0
qh_hsl = round(qh_hsl, 6)
qh_jieguo.append(str(qh_hsl)) # 换手率插入列表
return qh_jieguo
def QH_Requests_Get(self,qh_url, qh_headers, qh_params, qh_code='utf-8'):
"""
get请求函数 作者:阙辉
:param qh_url: url网址
:param qh_headers: 头信息
:param qh_params: getURL参数
:param qh_code: 解析格式
:return:
"""
qh_p = requests.get(qh_url, headers=qh_headers, params=qh_params)
print(qh_p.url)
qh_p.encoding = qh_code
qh_wangyi_request = qh_p.text
return qh_wangyi_request
def QH_ChuShiHua(self,qh_data):
qh_data = qh_data
try:
qh_data0 = json.loads(qh_data)
qh_data0 =[qh_data0]
except:
qh_data0 = []
# print(qh_data0)
return qh_data0
def QH_JieXi(self,qh_data):
if len(qh_data)>0:
qh_data = qh_data[0]
#历史行情数据
qh_data_list = qh_data["KlineData"]
qh_code = qh_data["Inst"]
qh_Market = qh_data["Market"]
qh_data_list_colunm = ["TradingDay","Time","High","Open","Low","Close","Volume","Amount"]
for qh_i,qh_row in enumerate(qh_data_list):
qh_data_list[qh_i] = [qh_row[qh_row00] for qh_row00 in qh_data_list_colunm] #解析数据
qh_data_list[qh_i][0] = self.qh_timestamp_to_date(qh_data_list[qh_i][0]) #翻译时间戳
if qh_i == 0:
qh_data_list[qh_i].insert(2, 0) #插入昨日成交价
else:
qh_data_list[qh_i].insert(2, qh_data_list[qh_i-1][8]) #插入昨日成交价
qh_close = qh_data_list[qh_i][6]
qh_zr_close = qh_data_list[qh_i][2]
qh_high = qh_data_list[qh_i][3]
qh_low = qh_data_list[qh_i][5]
qh_zongshou = qh_data_list[qh_i][7]
# qh_liutong = qh_data_list[qh_i][0]
qh_jisuan_list = self.qh_jisuan(qh_close,qh_zr_close,qh_high,qh_low,qh_zongshou,qh_liutong="") #计算指标
# print(qh_jisuan_list)
qh_data_list[qh_i].insert(2,qh_code) #插入股票代码
qh_data_list[qh_i].insert(2,qh_Market) #插入股票市场类别
qh_data_list[qh_i] = qh_data_list[qh_i] + qh_jisuan_list
# print(qh_data_list)
else:
qh_data_list = []
return qh_data_list
def QH_Main(self):
"""
主函数:作者:阙辉
:return:
"""
qh_url = self.qh_url
qh_headers = self.qh_headers
qh_params = self.qh_params
qh_code = self.qh_code
qh_reqs = self.QH_Requests_Get(qh_url,qh_headers, qh_params,qh_code)
# print(qh_reqs)
qh_csh_data = self.QH_ChuShiHua(qh_reqs)
qh_jx_data = self.QH_JieXi(qh_csh_data)
#
return qh_jx_data
def QH_His_Get_Spider(qh_code,qh_market,qh_count=-50000):
qh_url0 = """https://hq.techgp.cn/rjhy-gmg-quote/api/1/stock/quote/v1/historyv1?endtime={}&inst={}&limit={}&market={}&servicetype=KLINEB&starttime=0&resptype=JSON&period=DAY"""
qh_code = qh_code
qh_market = qh_market
qh_count = qh_count
qh_begin = int(time.time())*1000 #获取当前的时间戳
qh_url = qh_url0.format(qh_begin,qh_code,qh_count,qh_market)
qh_header = {
'accept' : 'application/json',
'accept-encoding' : 'gzip, deflate, br',
'accept-language' : 'zh-CN,zh;q=0.9',
'appcode' : 'com.rjhy.uranus',
'cache-control' : 'no-cache',
'origin' : 'https://stock.9fzt.com',
'pragma' : 'no-cache',
'referer' : 'https://stock.9fzt.com/index/{}_{}.html',
'sec-fetch-dest' : 'empty',
'sec-fetch-mode' : 'cors',
'sec-fetch-site' : 'cross-site',
'signature' : '25ca35a1a49b68cf9090c45b9dfd17de',
# 'timestamp' : '1633592035660',
'user-agent' : 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36',
}
qh_header["referer"] = qh_header["referer"].format(qh_market,qh_code)
#主程序
qh_object_spi = QH_JiuFang_Spider(qh_url,qh_header) #实例化对象
qh_jieguo_list = qh_object_spi.QH_Main() #运行主程序
# print(qh_jieguo_list)
return qh_jieguo_list
if __name__ == "__main__":
qh_code = "000002" #股票代码
qh_count = -50000 #数据数量
qh_market = "SZ" #证交所 SZ深交所 SH上交所
qh_jieguo_list = QH_His_Get_Spider(qh_code,qh_market,qh_count)
qh_data_list_colunm = ["TradingDay", "Time", "Market","code","zuori","High", "Open", "Low", "Close", "Volume", "Amount","zde","zdf","zf"]
# qh_data_list_colunm = ["TradingDay", "Time", "Market", "code", "zuori", "High", "Open", "Low", "Close", "Volume",
# "Amount"]
qh_jieguo_list_to_df = qh_pd.DataFrame(qh_jieguo_list,columns=qh_data_list_colunm)
qh_jieguo_list_to_df.set_index("TradingDay",inplace=True)
print(qh_jieguo_list_to_df)
qh_jieguo_list_to_df.to_csv("qh_jiufang_his_jiaoyi_{}.csv".format(qh_code))
历史股票行情API调用和下载
最新推荐文章于 2024-05-27 20:37:42 发布