熟悉我的小伙伴都知道我沉迷于炒股,那炒股有没有什么诀窍呀?在股市中有这么一股资金总是可以做出准确的判断高抛低吸,被投资者称为聪明资金——北向资金。那我们岂不是可以抄作业,根据北向资金的流入流出情况判断之后股市的行情,不多说了直接写个爬虫监控ta先。
目标网站:
aHR0cDovL2RhdGEuZWFzdG1vbmV5LmNvbS9oc2d0L2luZGV4Lmh0bWw=
目录
1、分析请求
2、获取数据
1、分析请求
北向资金分为沪股通、深股通两个渠道,目标数据就是下图圈起来的数据。

这个网站是老朋友了像这个10.28亿,接口发送给我们的不是10.28而可能是1028…搜的时候要搜1028,结果发现没有(打脸),那就再搜2515,结果如下图

ta还进行了四舍五入难怪搜索1028搜不到。找到了接口就看看有没有加密。

看起来有加密了,但其实都是固定的,别问我为什么知道(多测试几遍就知道了)。
既然获取了北向资金的总体流向,那不如再加多一个北向资金前10大成交股

这个和北向资金那个接口类型差不多,这就不过多赘述了
2、数据获取
我现在写爬虫的时候都是先用postman获取一个初步的爬虫,具体操作可以看三秒完成一个爬虫,然后在这个基础上进行功能的添加。
获取北向资金
由于参数都可以写死,直接请求拿到数据就好了。
def get_page(url, data_mode='{'):
return jquery_list(requests.get(url=url, headers=headers).text, data_mode=data_mode)
def north_fund():
"""北向资金"""
north_url = 'http://push2.eastmoney.com/api/qt/kamt/get?cb=jQuery112307554364681569443_1613660190289&' \
'fields1=f1%2Cf2%2Cf3%2Cf4&fields2=f51%2Cf52%2Cf53%2Cf54%2Cf63&' \
'ut=b2884a393a59ad64002292a3e90d46a5&_=1613660190290'
total_fund, text, step = 0, '', 0
for i in get_page(url=north_url, data_mode='{')['data'].items():
rjlr = round(i[1]['netBuyAmt'] / 10000, 2)
if i[0] == 'hk2sh':
text += f'沪股通流入:{rjlr}亿\n'
total_fund += rjlr
if i[0] == 'hk2sz':
text += f'深股通流入:{rjlr}亿\n'
total_fund += rjlr
step += 1
text = f'北向资金净流入{round(total_fund, 3)}亿\n' + text
return text
获取北向资金10大成交股
def top10_rank():
"""top10成交榜"""
hs = {'HGT': '1', 'SGT': '3'}
timestamp = int(time.time() * 1000) - 300
text = ''
for x, y in hs.items():
sgt_url = 'http://dcfm.eastmoney.com/em_mutisvcexpandinterface/api/js/get?' \
f'callback=jQuery112305742757220060151_{timestamp}&st=DetailDate%2CRank&sr=1&ps=10&p=1&' \
f'type=HSGTCJB&token=70f12f2f4f091e459a279469fe49eca5&filter=(MarketType%3D{y})&sty={x}'
stock_code, name_list, jme_list, percent_list = [], [], [], []
if x == 'HGT':
hsgt = '沪股通'
else:
hsgt = '深股通'
text += f'--------------------------------\n{hsgt}\n'
for i in get_page(url=sgt_url):
code = i['Code']
stock_code.append(code)
name = i['Name']
name_list.append(name)
close = i['Close']
change_percent = round(i['ChangePercent'], 2)
percent_list.append(change_percent)
jme = round(i[f'{x}JME'] / 100000000, 2)
jme_list.append(jme)
mrje = round(i[f'{x}MRJE'] / 100000000, 2)
mcje = round(i[f'{x}MCJE'] / 100000000, 2)
cjje = round(i[f'{x}CJJE'] / 100000000, 2)
data = {'code': code, 'name': name, 'close': close, '涨跌幅': change_percent,
'净买额': jme, '买入金额': mrje, '卖出金额': mcje, '成交金额': cjje}
for i in range(len(stock_code)):
text += f'{stock_code[i]} {name_list[i]} 净买额:{jme_list[i]}亿 涨跌幅:{percent_list[i]}%\n'
return text
这个网站返回的数据看起来像json格式,但其实又不是,一开始我只想到了用正则提取数据。

后来我了解到了eval()的作用,如下:
a = '[1, 2, 3]'
print(type(a), a) <class 'str'> [1, 2, 3]
print(type(eval(a)), eval(a)) <class 'list'> [1, 2, 3]
eval()不单对列表有效,字典等其他数据类型也可以这样用。知道了这个方法就不用使用正则这么麻烦了,直接把花括号中的片段截取下来进行eval()就转为json格式了。
def jquery_list(jquery, data_mode='{'):
reverse_mode = {'[': ']', '{': '}', '(': ')'}
tail_str = jquery[-5:][::-1]
return eval(jquery[jquery.index(data_mode): -tail_str.index(reverse_mode[data_mode])])
运行结果:

本节讲的网站没有什么难度,这只是构成我量化体系的一部分。