python获取股票数据接口

# encoding: utf8

#部分网站api数据有bug,这个bug问题不是自身程序的问题,而是第三方公司股票的问题

__author__ = 'nooper'

import re
from math import ceil
import datetime

from httpGet import httpGetContent
from common import decimal


def _get_content(content):
    "处理腾讯股票数据接口信息"
    regex = re.compile(r'"(.*)"')
    result = regex.findall(content)
    if result:
        return result[0].split('~')


def getStockPosition(code, market):
    """
    处理股票盘口数据分析,分析所占的百分比率
    http://qt.gtimg.cn/q=s_pksz000858
    v_s_pksz000858="0.196~0.258~0.221~0.325";
    以 ~ 分割字符串中内容,下标从0开始,依次为:
    0: 买盘大单
    1: 买盘小单
    2: 卖盘大单
    3: 卖盘小单
    所占有的百分比百分比率
    """
    if code and market:
        url = "http://qt.gtimg.cn/q=s_pk%s%s" % (market, code)
        content = httpGetContent(url)
        if content:
            result_list = _get_content(content)
            if result_list:
                stock_dict = {}
                stock_dict["code"] = code
                stock_dict["market"] = market
                stock_dict["buy_big_percent"] = float(result_list[0])     # 买盘大单所占百分比
                stock_dict["buy_small_percent"] = float(result_list[1])   # 买盘小单所占百分比
                stock_dict["sell_big_percent"] = float(result_list[2])    # 卖盘大单所占比重
                stock_dict["sell_small_percent"] = float(result_list[3])  # 买盘小单所占比重
                stock_dict["date"] = datetime.date.today()
                return stock_dict


# todo 数据对不上
def getStockCashFlow(code, market):
    """得到股票是资金流入流出
    http://qt.gtimg.cn/q=ff_sz000858
    v_ff_sz000858="sz000858~41773.67~48096.67~-6322.99~-5.53~10200.89~14351.02~-4150.13~-3.63~114422.25~53015.90~59770.57~五 粮 液~20121221";
    以 ~ 分割字符串中内容,下标从0开始,依次为:
     0: 代码
     1: 主力流入
     2: 主力流出
     3: 主力净流入
     4: 主力净流入/资金流入流出总和
     5: 散户流入
     6: 散户流出
     7: 散户净流入
     8: 散户净流入/资金流入流出总和
     9: 资金流入流出总和1+2+5+6
    10: 未知
    11: 未知
    12: 名字
    13: 日期
    """
    if code and market:
        url = "http://qt.gtimg.cn/q=ff_%s%s" % (market, code)
        content = httpGetContent(url)
        if content:
            result_list = _get_content(content)
            if result_list:
                stock_dict = {}
                stock_dict["code"] = code
                stock_dict["main_inflow"] = float(result_list[1])   # 主力流入
                stock_dict["main_outflow"] = float(result_list[2])  # 主力流出
                stock_dict["main_netflow"] = float(result_list[3])  # 主力净流入

                stock_dict["small_inflow"] = float(result_list[5])  # 散户流入
                stock_dict["small_outflow"] = float(result_list[6]) # 散户流出
                stock_dict["small_netflow"] = float(result_list[7]) # 散户净流入

                income = stock_dict["main_inflow"] + stock_dict["small_inflow"]
                outcome = stock_dict["main_outflow"] + stock_dict["main_outflow"]
                print income
                print outcome
                print income - outcome

                stock_dict["unknown_1"] = float(result_list[10])
                stock_dict["unknwon_2"] = float(result_list[11])
                stock_dict["date"] = result_list[13]                # 日期

                return stock_dict


def getStockCurrentDay(code, Market):
    '''
    获取股票当日数据
    腾讯API
    API地址:http://qt.gtimg.cn/q=sh600383
    sh:上海
    sz:深圳
    返回当天成交数据
    code:股票代码
    market:股票市场
    数据返回@return dict
    '''
    if code and Market:
        url = 'http://qt.gtimg.cn/q=%s%s' % (Market, code)
        headers = {'Content-type': 'application/x-javascript; charset=GBK'}
        result = httpGetContent(url=url, headers=headers, charset='gbk')
        if result:
            stocklist = _get_content(result)
            if stocklist:
                stockdict = {}
                stockdict['code'] = code                           # 股票代码
                stockdict['name'] = unicode(stocklist[1], 'utf8')  # 股票名称
                stockdict['last_closing'] = float(stocklist[4])    # 昨日收盘价格
                stockdict['start'] = float(stocklist[5])           # 开盘价格
                stockdict['end'] = float(stocklist[3])             # 当前收盘价格(可以是当前价格)
                stockdict['high'] = float(stocklist[33])           # 最高价格
                stockdict['low'] = float(stocklist[34])            # 最低价格
                stockdict['buyvol'] = int(stocklist[7])             # 外盘 todo 数据对不上
                stockdict["sellvol"] = int(stocklist[8])           # 内盘 todo 数据对不上

                stockdict['range_price'] = float(stocklist[31])    # 涨跌价格
                stockdict['range_percent'] = float(stocklist[32])  # 涨跌比%

                stockdict['volume'] = int(stocklist[6])            # 成交量(手)
                stockdict['total_price'] = int(stocklist[37])      # 成交额(万元)
                stockdict['change_rate'] = decimal(stocklist[38]) # 换手率
                stockdict['pe'] = decimal(stocklist[39])          # 市盈率
                stockdict['swing'] = float(stocklist[43])           # 振幅

                stockdict['pb'] = float(stocklist[46])              # 股票市净率
                stockdict['date'] = stocklist[30][:8]               # 时间
                stockdict["block"] = False if stockdict["start"] else True #股票是否停牌
                return stockdict


def getStockMarket(code):
    """
    大盘数据接口信息
    上证:code:000001 set=zs
    深证:code:399001 set=zs
    中小板:code:399005 set=zs
    创业板: code:399006 set=zs
    http://q.stock.sohu.com/qp/hq?type=snapshot&code=000001&set=zs
    """
    url = "http://q.stock.sohu.com/qp/hq?type=snapshot&code=%s&set=zs" % code

    result = httpGetContent(url=url, charset="gbk")
    if result:
        result = eval(result)
        stock_dict = {}
        stock_dict["date"] = result[0][:10] #日期
        stock_dict["name"] = unicode(result[2], 'utf8') #名称
        stock_dict["range_price"] = float(result[4]) #上涨价格
        stock_dict["range_percent"] = float(result[5].strip("%")) #涨幅

        stock_dict["start"] = float(result[9]) #开盘价格
        stock_dict["high"] = float(result[11]) #最高价格
        stock_dict["low"] = float(result[13]) #最低价格
        stock_dict["last_closing"] = float(result[7]) #昨日收
        stock_dict["end"] = float(result[3]) #收盘价格

        stock_dict["total_sum"] = int(result[18]) #多少万元

        stock_dict["volume"] = int(result[14]) #多少手

        return stock_dict


tonghuashun_headers = {
    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
    "Accept-Encoding": "gzip,deflate,sdch",
    "Accept-Language": "zh-CN,zh;q=0.8",
    "Cache-Control": "no-cache",
    "Connection": "keep-alive",
    "Host": "qd.10jqka.com.cn",
    "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.93 Safari/537.36"
}

# def getstockBlock():
#     """
#     新浪股票黑名单数据
#     ”需要得到单点登录信息“
#
#     新浪股票黑名单个股
#     http://weibo.gxq.com.cn/stock/disallowStock
#     """
#     headers = {
#         'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
#         'Cache-Control': "max-age=0",
#         'Host': 'weibo.gxq.com.cn',
#         'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.93 Safari/537.36',
#         'Cookie': "PHPSESSID=c32fbi3m3sf0he8v1rdem3t006; gxqSignId=02d9c361fe5fc1ab; WBStore=d6acd6adea5a82d3|undefined"
#
#     }
#     url = "http://weibo.gxq.com.cn/stock/disallowStock"
#     content = httpGetContent(url=url, headers=headers)
#     if content:
#         soup = BeautifulSoup(content)
#         td_list = soup.find_all(text=re.compile('\d+'))
#         return td_list


def __convert_MIN(content):
    content = content.split('=')[1]
    content_list = content.split('|')
    stock_dict = {}
    for sub in content_list:
        if sub:
            items = sub.split('~')
            date = items[0]
            price_list = items[1].split(';')
            price_dict = {}
            for a in price_list:
                b = a.split(',')
                start = float(b[0]) #开盘价
                high = float(b[1]) #最高价格
                low = float(b[2]) #最低价格
                end = float(b[3]) #结束价格
                volum = int(ceil(float(b[4]))) #成交量多少买入
                total_price = int(ceil(float(b[5]))) #成交额
                time = b[6] #时间格式是1030,11:30,1400,1500

                price_dict[time] = {
                    "high": high,
                    'low': low,
                    "end": end,
                    "start": start,
                    "volumn": volum,
                    "total_price": total_price
                }
            stock_dict[date] = price_dict
    return stock_dict


def getStock60MIN(code, market, type=''):
    """
    不推荐向后复权
    得到股票60分钟数据线
    API接口数据
    http://qd.10jqka.com.cn/api.php?p=stock_min60&info=k_sz_000005&fq=q
    q是向前复权
    b事项后复权
    q= 空是不复权
    """
    if market not in ('sz', 'sh'):
        return

    url = "http://qd.10jqka.com.cn/api.php?p=stock_min60&info=k_%s_%s&fq=%s" % (market, code, type)

    content = httpGetContent(url=url)
    if content:
        return __convert_MIN(content)


def getStock30MIN(code, market, type=''):
    """
    30分钟数据接口信息
    http://qd.10jqka.com.cn/api.php?p=stock_min30&info=k_sz_000005&fq=
    """
    if market not in ('sz', 'sh'):
        return
    url = "http://qd.10jqka.com.cn/api.php?p=stock_min30&info=k_%s_%s&fq=%s" % (market, code, type)
    content = httpGetContent(url=url)
    if content:
        return __convert_MIN(content)


def getStock15MIN(code, market, type=''):
    """
    15分钟数据接口
    http://qd.10jqka.com.cn/api.php?p=stock_min15&info=k_sz_000005&fq=
    """
    if market not in ('sz', 'sh'):
        return
    url = "http://qd.10jqka.com.cn/api.php?p=stock_min15&info=k_%s_%s&fq=%s" % (market, code, type)
    content = httpGetContent(url=url)
    if content:
        return __convert_MIN(content)


def __convert_inner(stock, stock_dict={}):
    stock_day = stock.split(',')
    if all(stock_day):
        date = stock_day[0] #日期
        start = float(stock_day[1]) #开盘价格
        high = float(stock_day[2]) #最高价格
        low = float(stock_day[3]) #最低价格
        end = float(stock_day[4]) #收盘价格
        volume = int(ceil(float(stock_day[5]))) #成交量
        total = int(ceil(float(stock_day[6]))) #成交额

        stock_dict[date] = {
            "date": date,
            'start': start,
            'high': high,
            'low': low,
            'end': end,
            'volume': volume,
            'total': total,
        }
        return stock_dict


def __convert_day(content):
    stock_list = content.split('=')[1].split('|')
    stock_dict = {}
    for stock in stock_list:
        if stock and stock.strip():
            __convert_inner(stock, stock_dict)
            # stock_day = stock.split(',')
            # date = stock_day[0] #日期
            # start = stock_day[1] #开盘价格
            # high = stock_day[2] #最高价格
            # low = stock_day[3] #最低价格
            # end = stock_day[4] #收盘价格
            # volume = int(ceil(float(stock_day[5]))) #成交量
            # total = int(ceil(float(stock_day[6]))) #成交额
            # stock_dict[date] = {
            #         "date": date,
            #         'start': start,
            #         'high': high,
            #         'low': low,
            #         'end': end,
            #         'volume': volume,
            #         'total': total,
            #     }
    return stock_dict


def __convert_week(content):
    content_list = content.split(';')
    regex = re.compile('=(.*)$')
    stock_dict = {}
    for s in content_list:
        p = regex.findall(s)[0]
        stock_list = p.split('|')
        for week in stock_list:
            if week:
                __convert_inner(week, stock_dict)

    return stock_dict

#todo 测试完成
def getStockDayHistory(code, market, year='2013', type=''):
    """
    http://qd.10jqka.com.cn/api.php?p=stock_day&info=k_sz_000005&year=2012,2013&fq=
    sz:深证
    sh:上海
    return dict
    """
    url = "http://qd.10jqka.com.cn/api.php?p=stock_day&info=k_%s_%s&year=%s&fq=%s" % (market, code, year, type)
    content = httpGetContent(url=url)
    if content:
        return __convert_day(content)

#todo 测试完成
def getStockWeekHistory(code, market, year='2012,2013', type=''):
    """
    xhttp://qd.10jqka.com.cn/api.php?p=stock_week&info=k_sz_000005&year=2011,2012,2013&fq=
    pass
    """
    url = "http://qd.10jqka.com.cn/api.php?p=stock_week&info=k_%s_%s&year=%s&fq=%s" % (market, code, year, type )
    content = httpGetContent(url, tonghuashun_headers)
    if content:
        return __convert_week(content)


def __convertMonth(content):
    pass


def getStockMonthHistory(code, market, type=''):
    """
    http://qd.10jqka.com.cn/api.php?p=stock_month&info=k_sz_000671&fq=
    """
    url = "http://qd.10jqka.com.cn/api.php?p=stock_month&info=k_%s_%s&fq=%s" % (market, code, type)
    content = httpGetContent(url)
    if content:
        pass


def main():
    # g = getStock60MIN('600847', 'sh')
    # for k in g:
    #     print k
    #     print g[k]
    # g = getStockDayHistory("600198", "sh")
    # print g

    # import config
    #
    # print getStockMarket(config.SHANGHAI)
    print getStockCurrentDay("600383", "sh")


if __name__ == "__main__":
    main()

 

posted @ 2020-04-25 23:14  程式交易  阅读(6102)  评论(1编辑  收藏  举报