不知道公众号有多少读者买基金或者炒股,分享一下如何用python获取证券信息
import requests
from lxml import etree
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.101 Safari/537.36'
}
def parse_url(url):
response = requests.get(url, headers=headers)
if response.status_code == 200:
return etree.HTML(response.content)
return False
def get_date(response):
# 得到股票代码,开始和结束的日期
start_date = ''.join(response.xpath('//input[@name="date_start_type"]/@value')[0].split('-'))
end_date = ''.join(response.xpath('//input[@name="date_end_type"]/@value')[0].split('-'))
code = response.xpath('//h1[@class="name"]/span/a/text()')[0]
return code, start_date, end_date
def download(code, start_date, end_date):
download_url = "http://quotes.money.163.com/service/chddata.html?code=1" + code + "&start=" + start_date + "&end=" + end_date + \
"&fields=TCLOSE;HIGH;LOW;TOPEN;LCLOSE;CHG;PCHG;TURNOVER;VOTURNOVER;VATURNOVER;TCAP;MCAP"
print(download_url)
data = requests.get(download_url, headers=headers)
f = open(code + '.csv', 'wb')
for chunk in data.iter_content(chunk_size=10000):
if chunk:
f.write(chunk)
print('股票---', code, '历史数据正在下载')
download('000002', '20210401', '20210516')
提取的数据结果如下
from urllib import request
import json
import pandas as pd
def get_stock_data(id, scale, data_len):
'''
symnol = 股票代码
scale = 5,15,30,60 时间间隔
datalen = 获取数据长度,最大1023
'''
# 拼接API的url
url = 'http://quotes.sina.cn/cn/api/json_v2.php/CN_MarketDataService.getKLineData?symbol={0}&scale={1}&datalen={2}'.format(
id, scale, data_len)
# 发起请求
req = request.Request(url)
# 获取响应
rsp = request.urlopen(req)
# 读取响应结果
res = rsp.read()
# 将json序列转换为Python对象
res_json = json.loads(res)
# bar列表
bar_list = []
# 将结果逆序
res_json.reverse()
# 遍历列表
for dict in res_json:
bar = {}
bar['date'] = dict['day']
bar['open'] = float(dict['open'])
bar['high'] = float(dict['high'])
bar['low'] = float(dict['low'])
bar['close'] = float(dict['close'])
bar['vol'] = int(dict['volume'])
bar_list.append(bar)
# 将结果转换为DataFrame对象
df = pd.DataFrame(data=bar_list)
print(df)
return df
df = get_stock_data('sz002415', 5, 30)
df.head()
from urllib import request
import json
import pandas as pd
def get_future_data(id, scale):
# 拼接API的url
url = 'http://stock2.finance.sina.com.cn/futures/api/json.php/IndexService.getInnerFuturesMiniKLine{0}m?symbol={1}'.format(scale, id)
# 发起请求
req = request.Request(url)
# 获取响应
rsp = request.urlopen(req)
# 读取响应结果
res = rsp.read()
# 将json序列转换为Python对象
res_json = json.loads(res)
# bar列表
# print(res_json)
bar_list = []
# 将结果逆序
res_json.reverse()
# 遍历列表
for line in res_json:
bar = {}
bar['date'] = line[0]
bar['open'] = float(line[1])
bar['high'] = float(line[2])
bar['low'] = float(line[3])
bar['close'] = float(line[4])
bar['vol'] = int(line[5])
bar_list.append(bar)
# 将结果转换为DataFrame对象
df = pd.DataFrame(data=bar_list)
print(df)
return df
df = get_future_data('rb1910', 5)
df.head()
3、其他的股票接口
3.1 东方财富接口
http://pdfm.eastmoney.com/EM_UBG_PDTI_Fast/api/js?rtntype=2&id=0003001&type=m30k&_=1546486249481
rtntype = 返回数据格式,支持:1,2,3,4,5,6
id = 股票代码,后面多加个1
type = k线类型,m5k,m15k,m30k,m60k
返回结果,注意结果为jsonp格式,需要去掉前后括号
[{"time":"2018-11-21 10:00",
"open":"3187.10",
"close":"3214.17",
"high":"3221.20",
"low":"3185.24",
"volume":"24250345",
"amount":"244亿",
"amplitude":"-",
"turnoverrate":"0"},
{"time":"2018-11-21 10:30",
"open":"3213.24",
"close":"3213.52",
"high":"3230.12",
"low":"3210.60",
"volume":"13652304",
"amount":"138亿",
"amplitude":"0.61%",
"turnoverrate":"0"}]
http://api.finance.ifeng.com/akmin?scode=sh000300&type=30
{
"record": [
[
"2018-10-31 11:00:00", # 日期
"3146.23", # 开盘价
"3146.23", # 最高价
"3130.41", # 收盘价
"3130.21", # 最低价
107709, # 成交量
"-15.82", # 价格变动
-0.5, # 涨跌幅
"3130.04", # 5日均价
"3119.8", # 10日均价
"3109.55", # 20日均价
159535, # 5日均量
150064, # 10日均量
138100, # 20日均量
0 # 换手率[注:指数无此项]
],
[
"2018-10-31 11:30:00",
"3130.19",
"3144.97",
"3143.7",
"3126.95",
105828,
"13.51",
0.43,
"3132.92",
"3126.49",
"3107.94",
160857,
147627,
137719,
0
]
]
}
证券之星
http://cq.ssajax.cn/interact/getTradedata.ashx?pic=qlpic_000300_1_4
结果数据与同花顺数据存在差异
{
"type": 'ThirtyMinutesK',
"code": '000300',
"picWidth": 630,
"left": 46,
"right": 46,
"top": 18,
"bottom": 3,
"mainHeight": 137.6087,
"count": 80,
"IsIndex": true,
"datas": [
['2019-1-2', '3017.07', '3018.78', '2976.94', '2977.05', '-33.61', '-1.12%', '1830.1744万手', '2099974.5988亿元', '']
['2019-1-2', '2977.90', '2982.50', '2972.32', '2975.34', '-1.71', '-0.06%', '870.7015万手', '1014299.3089亿元', '']
['2019-1-2', '2975.13', '2979.70', '2968.10', '2976.03', '0.70', '0.02%', '662.5779万手', '774487.0416亿元', '']
['2019-1-2', '2975.48', '2975.77', '2969.99', '2972.75', '-3.28', '-0.11%', '512.8981万手', '561504.6466亿元', '']
['2019-1-2', '2973.24', '2974.20', '2963.05', '2963.05', '-9.70', '-0.33%', '520.6500万手', '555401.0954亿元', '']
['2019-1-2', '2963.28', '2968.06', '2958.49', '2959.38', '-3.66', '-0.12%', '652.6460万手', '706160.9067亿元', '']
['2019-1-2', '2959.49', '2976.24', '2958.53', '2976.24', '16.86', '0.57%', '777.2934万手', '814835.7428亿元', '']
['2019-1-2', '2976.06', '2976.49', '2967.92', '2969.54', '-6.71', '-0.23%', '873.9827万手', '892372.3176亿元', '']
['2019-1-3', '2963.02', '2986.05', '2953.50', '2984.97', '15.43', '0.52%', '1644.8468万手', '1847877.8024亿元', '']
['2019-1-3', '2985.19', '3000.23', '2979.27', '2981.37', '-3.60', '-0.12%', '1368.3392万手', '1468697.7891亿元', '']
['2019-1-3', '2980.99', '2982.08', '2968.90', '2969.30', '-12.07', '-0.40%', '732.6996万手', '773648.5164亿元', '']
['2019-1-3', '2969.35', '2969.70', '2959.27', '2968.37', '-0.92', '-0.03%', '652.7249万手', '736984.9307亿元', '']
['2019-1-3', '2968.24', '2968.24', '2957.01', '2966.63', '-1.75', '-0.06%', '505.6024万手', '588579.1725亿元', '']
['2019-1-3', '2966.86', '2970.24', '2961.55', '2968.43', '1.80', '0.06%', '625.2699万手', '628144.8810亿元', '']
['2019-1-3', '2968.56', '2968.70', '2957.19', '2959.19', '-9.24', '-0.31%', '643.2986万手', '673772.6590亿元', '']
['2019-1-3', '2959.17', '2964.84', '2953.94', '2964.84', '5.65', '0.19%', '913.9289万手', '948774.1302亿元', '']]
}
和讯网
http://webstock.quote.hermes.hexun.com/a/kline?code=sse000300&start=20190103150000&number=-1000&type=3&callback=callback
5,15,30,60 统计时间和其他不一样
{
"KLine": [
{
"Time": "时间"
},
{
"LastClose": "前收盘价"
},
{
"Open": "开盘价"
},
{
"Close": "收盘价"
},
{
"High": "最高价"
},
{
"Low": "最低价"
},
{
"Volume": "成交量"
},
{
"Amount": "成交额"
}
],
"TABLE": [
{
"KLine[]": "K线列表"
},
{
"BeginTime": "最早时间"
},
{
"EndTime": "最后时间"
},
{
"Total": "总数"
},
{
"PriceWeight": "价格倍数"
}
],
"Data": [
[
[
20181226140000,
300240,
300224,
300750,
301374,
300163,
770036600,
6793688860
]
],
20181109130000,
20190103143000,
300,
100
]
}