【思路】
- 工具-Python程序的网络应用,可以使用requests模块
- 获取地址-网上随便一搜就可找到,我用的是搜狐股票数据
【编程实现】
分析搜狐股票接口的语法
搜狐股票接口语法
网上搜索得到:语法为:‘https://q.stock.sohu.com/hisHq?code=cn_XXXXXX’,
第一步:在浏览器输入这句话,股票代码我们就以贵州茅台的代码600519。代替XXXXXX。那么这句话就是:‘https://q.stock.sohu.com/hisHq?code=cn_600519’
第二步:得到浏览器返回数据如下图:
第三步:我们在python里面编程实现它
3.1编写一个函数stk_req_jsontxt(url),这个函数通过给定的url,返回的就是上面浏览器返回的文本部分。
def stk_req_jsontxt(url):
user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
header = {'User-Agent': user_agent}
s = requests.session()
s.headers = header
s.keep_alive = False # 关闭多余连接
r = s.get(url)
r.encoding = chardet.detect(r.content)['encoding']
#print('r.text\n',r.text)
if 'An error occurred' in r.text:
print('code not in use')
return None
return r.text
3.2我们在pycharm上运行一下这个函数,看打印出来的是什么。
运行的代码如下:
def stk_req_jsontxt(url):
user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
header = {'User-Agent': user_agent}
s = requests.session()
s.headers = header
s.keep_alive = False # 关闭多余连接
r = s.get(url)
r.encoding = chardet.detect(r.content)['encoding']
#print('r.text\n',r.text)
if 'An error occurred' in r.text:
print('code not in use')
return None
return r.text
url='https://q.stock.sohu.com/hisHq?code=cn_600519'
rtext=stk_req_jsontxt(url)
print(rtext)
程序运行的打印结果如下图:
打印内容其实是json格式的文本,接下来我们使用json模块转换就可以转化成为我们需要的python格式的列表、字典等【这个具体查询json模块的使用教程】
输出分析:
我们看到上面图片中的内容很像一个列表,那么用如下语句可以把它转化为python的列表:
datalist=list(json.loads(rtext))
通过上面的办法,我们获得了个股的历史数据。分析得其数据格式为列表。我们进一步分析其数据结构,先运行如下代码:
url='https://q.stock.sohu.com/hisHq?code=cn_600519'
rtext=stk_req_jsontxt(url)
#print(rtext)
listdata=list(json.loads(rtext))
for i in range(len(listdata)):
print(i)
print(listdata[i])
输出为下面2图,第1图是最左侧,第2图是最右侧。受限于pycharm的输出超出屏幕,只能这样了。
通过分析上面函数的打印输出,我们可以知道,列表只有一个元素,所以只打了1个下标 0
列表的唯一元素是一个字典,假设该字典命名为dict,则它的key如下:“status”,“hq”,“code”。
而“hq”的value对应的则是一个2层嵌套列表,如果可以理解为
dict[hq]=[date1的数据列表,date2的数据列表,…dateN的数据列表]
我们通过如下的程序验证上面关于字典的猜想
url='https://q.stock.sohu.com/hisHq?code=cn_600519'
rtext=stk_req_jsontxt(url)
#print(rtext)
listdata=list(json.loads(rtext))
dict=listdata[0]
hisDataList=dict['hq']
for i in range(len(hisDataList)):
print(i)
print(hisDataList[i])
则运行后的打印输出为
由于滚动条关系,只贴了第一张图和最后一张图。我们看到,这就是打印了下标从0到79的共80个元素。每个元素又是一个固定数据结构的列表。因此证明前面关于字典的猜想是正确的。
接下来我们再来看个股数据,从而分析出内部嵌套列表的数据结构
先从股票网站找到贵州茅台的K线图
再比对k线图中体现的数据与我们上面程序运行的数据(下图)
我们发现,列表根据下标,对应的数据如下:
下标 内容
0 date(格式为yyyy-mm-dd)
1 开盘价
2 收盘价
3 涨跌幅度
4 …
…
如上,我们就可以成功地获取个股历史数据并得到想要的值。比如我要获取昨天的收盘价,代码如下:
listdata=list(json.loads(rtext))
dict=listdata[0]
hisDataList=dict['hq']
hisDataList.reverse()
yesterdayClose=hisDataList[-2][2]
print('昨天收盘价为:',yesterdayClose)
输出如下: