# 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()