【辅助交易篇】1、上证新股提示 ——基于腾讯云函数和server酱
很久没更新了,主要是因为脑海空空,不知道应该干什么。嗯。。。 既然如此,那就先看看怎么赚钱吧。正好,前天又看到了东鹏上市十五连涨的新闻,于是想看看能不能在新股方面做一些事情,这就有了这篇文章。
本篇文章的原本目标是定时获取上证新股的上市预告情况,但由于腾讯云函数不支持数据的存储,无奈只得变成每日新股上市总结(我会这么认输吗??? 当然不,我们下篇文章解决这一问题)。。。。。
ok,说了这么多,该说说这篇文章的整体实现思路了。总体可以说是包含两大部分,第一部分是爬虫部分,爬取当日上证上市公告模块,解析获取企业欲上市信息;第二部分是微信推送模块,这边暂时使用的是server酱的api。当爬虫模块爬取完上市信息后,进行一定的数据处理和整合,将结果传递给微信推送模块,微信推送模块对数据进行解析,并将结果放入到markdown摸板里,最后将结果发送给server酱api,由server酱api将数据传递到我们的微信当中。
获取上证新股数据
确定目标url
网址:http://www.sse.com.cn/disclosure/announcement/listing/
用chrome打开该网址,点击F12
进入开发者模式,随后点击network准备抓包(记得勾上preserve log,防止跳转后,抓包结果被清空),点击下一页可以抓到如图所示的包。至此,我们已经获取到爬虫模块的目标url(注意:
第一页的后缀不是index_1.htm,而是index.htm)。
编写爬虫模块与数据解析
想了想,最后决定爬虫模块返回的结果为dict类型,这样即方便数据整合(每个上市公司有href、title两种属性),也方便快速寻找所要数据(依据dict关键字)。
import re
import time
import requests
def get_sz_new_stock_data(url):
# 传入的url内容为: 'http://www.sse.com.cn/disclosure/announcement/listing/s_index{_index}.htm'
date = []
href = []
title = []
# today_date = '2021-06-17'
today_date = time.strftime("%Y-%m-%d", time.localtime(time.time()))
data = {
'time': today_date,
'zb': {'zb_num': 0, 'zb_data': {}},
'kc': {'kc_num': 0, 'kc_data': {}}
}
num = 1
while True:
if num == 1:
__url = url.format(_index='')
num = num + 1
else:
__url = url.format(_index='_' + str(num))
num = num + 1
res = requests.post(url=__url, verify=False).content.decode('utf-8', 'ignore')
date_compile = re.compile('<dd><span>(.*?)</span><a href="')
href_compile = re.compile('<a href="(.*?)" title="')
title_compile = re.compile('title="(.*?)" target="_blank">')
date = date + date_compile.findall(res)
href = href + href_compile.findall(res)
title = title + title_compile.findall(res)
if date[-1] != today_date:
break
kc_num = 0
zb_num = 0
for i in range(len(date)):
if date[i] == today_date:
if title[i][-18:] == '人民币普通股股票科创板上市交易的公告':
data['kc']['kc_data'].update({kc_num: {'href': 'http://www.sse.com.cn/' + href[i], 'title': title[i]}})
kc_num = kc_num + 1
if title[i][-15:] == '人民币普通股股票上市交易的公告':
data['zb']['zb_data'].update({zb_num: {'href': 'http://www.sse.com.cn/' + href[i], 'title': title[i]}})
zb_num = zb_num + 1
data['kc']['kc_num'] = kc_num
data['zb']['zb_num'] = zb_num
return data
返回结果大致如下:
{'time': '2021-06-19', 'zb': {'zb_num': 0, 'zb_data': {}}, 'kc': {'kc_num': 0, 'kc_data': {}}}
微信推送模块
注册server酱并配置企业微信
server酱(turbo版):https://sct.ftqq.com/
因为免费版在6月30日之后就会停止注册、并在随后的一个月左右逐步下架。。。 所以我使用的是turbo版、turbo版注册送七天会员,会员期过后,每天免费额度为5条(对于仅推送新股上市情况来说,差不多刚好够用)
标准版 | Turbo版 | |
---|---|---|
收费方式 | 免费 | 少量免费额度+捐赠提升额度 |
API | 发送接口 | 发送接口和状态查询接口 |
登入方式 | GitHub 登入 | 微信扫码登入 |
通道 | 服务号 | 多通道(微信、客户端、群机器人、邮件和短信) |
推送内容保留时间 | 48小时 | 7天 |
每天 API 最大请求次数 | 500 | 1000 |
注册、并登录完成后,需要选择消息通道,我选择的是企业微信通道(略有点麻烦),然后企业微信通道方面,在该网页有设置教程。不再赘述、流程如下。地址:https://sct.ftqq.com/forward
微信推送模块
首先获取发送密钥
随后在下面的提示中可以发现,发送的api和参数说明
url:https://sctapi.ftqq.com/{sendKey}.send
- title: 消息标题,必填。最大长度为 32 。
- desp: 消息选择。支持Markdown语法,最大长度填充为32KB,消息内容截取前30显示。
- openid:选择填填。抄寄其他关注你测试号的openid,多个openid用,隔开。为支持大家对给多个/不同类型的人的需求,企业信应用消息通道也支持了openid参数。openid 参数,内容为接收人在企业微信中的UID,请多人| | 隔开,不会有特定的人/多人。填则发送给通道配置页面的接收人。
随后即可写出如下python代码,其中text即为我们要展示的结果(格式为markdown)
def pull_data_to_server(sendKey, data):
url = 'https://sctapi.ftqq.com/{sendKey}.send'.format(sendKey=sendKey)
send_data = {
'title': data['time'],
'desp': '',
'openid': '@all',
}
zb_titles = ''
kc_titles = ''
for i in range(data['zb']['zb_num']):
zb_titles = zb_titles +'['+ data['zb']['zb_data'][i]['title'] +']('+data['zb']['zb_data'][i]['href']+')' + '\n'
for i in range(data['kc']['kc_num']):
kc_titles = kc_titles +'['+ data['kc']['kc_data'][i]['title'] +']('+data['kc']['kc_data'][i]['href']+')' + '\n'
text = '# 当日总共上市预告数量:{total_num} \n## 主板上市预告数量:{zb_num}\n{zb_titles}\n## 科创版上市预告数量:{kc_num}\n{kc_titles}'.format(
total_num=str(data['zb']['zb_num'] + data['kc']['kc_num']), zb_num=str(data['zb']['zb_num']),
zb_titles=zb_titles, kc_num=str(data['kc']['kc_num']), kc_titles=kc_titles)
send_data['desp'] = text
requests.post(url=url, data=send_data, verify=False)
部署到腾讯云
网址:https://cloud.tencent.com/
登陆后,直接搜索云函数。
进入管理控制台-》点击函数服务-》新建
点击自定义创建、并修改函数名为sz_check
粘贴代码,修改执行方法名称
#!/usr/bin/env python
# _*_ coding: utf-8 _*_
# @Time : 2021/6/18 10:56
# @Author : asyu17
# @File : main.py.py
# @Version : 1.0
import re
import time
import requests
def get_sz_new_stock_data(url):
date = []
href = []
title = []
# today_date = '2021-06-17'
today_date = time.strftime("%Y-%m-%d", time.localtime(time.time()))
data = {
'time': today_date,
'zb': {'zb_num': 0, 'zb_data': {}},
'kc': {'kc_num': 0, 'kc_data': {}}
}
num = 1
while True:
if num == 1:
__url = url.format(_index='')
num = num + 1
else:
__url = url.format(_index='_' + str(num))
num = num + 1
res = requests.post(url=__url, verify=False).content.decode('utf-8', 'ignore')
date_compile = re.compile('<dd><span>(.*?)</span><a href="')
href_compile = re.compile('<a href="(.*?)" title="')
title_compile = re.compile('title="(.*?)" target="_blank">')
date = date + date_compile.findall(res)
href = href + href_compile.findall(res)
title = title + title_compile.findall(res)
if date[-1] != today_date:
break
kc_num = 0
zb_num = 0
for i in range(len(date)):
if date[i] == today_date:
if title[i][-18:] == '人民币普通股股票科创板上市交易的公告':
data['kc']['kc_data'].update({kc_num: {'href': 'http://www.sse.com.cn/' + href[i], 'title': title[i]}})
kc_num = kc_num + 1
if title[i][-15:] == '人民币普通股股票上市交易的公告':
data['zb']['zb_data'].update({zb_num: {'href': 'http://www.sse.com.cn/' + href[i], 'title': title[i]}})
zb_num = zb_num + 1
data['kc']['kc_num'] = kc_num
data['zb']['zb_num'] = zb_num
return data
def pull_data_to_server(sendKey, data):
url = 'https://sctapi.ftqq.com/{sendKey}.send'.format(sendKey=sendKey)
send_data = {
'title': data['time'],
'desp': '',
'openid': '@all',
}
zb_titles = ''
kc_titles = ''
for i in range(data['zb']['zb_num']):
zb_titles = zb_titles +'['+ data['zb']['zb_data'][i]['title'] +']('+data['zb']['zb_data'][i]['href']+')' + '\n'
for i in range(data['kc']['kc_num']):
kc_titles = kc_titles +'['+ data['kc']['kc_data'][i]['title'] +']('+data['kc']['kc_data'][i]['href']+')' + '\n'
text = '# 当日总共上市预告数量:{total_num} \n## 主板上市预告数量:{zb_num}\n{zb_titles}\n## 科创版上市预告数量:{kc_num}\n{kc_titles}'.format(
total_num=str(data['zb']['zb_num'] + data['kc']['kc_num']), zb_num=str(data['zb']['zb_num']),
zb_titles=zb_titles, kc_num=str(data['kc']['kc_num']), kc_titles=kc_titles)
send_data['desp'] = text
requests.post(url=url, data=send_data, verify=False)
def main(event, context):
# event和context 是腾讯云函数的要求,会传入这两个参数(主要是环境变量和一些自定义参数的传递)
url = 'http://www.sse.com.cn/disclosure/announcement/listing/s_index{_index}.htm'
sendKey = '你的sendKey'
sz_data = get_sz_new_stock_data(url)
pull_data_to_server(sendKey, sz_data)
随后,修改描述和内存配置(实际占用约16MB),
随后进行触发器的配置,我们这里配置成每天晚上10点半进行一天的总结。随后点击完成。
0 30 22 * * * *
表示在每日的22点30分触发。
这就创建完成了,可点击函数名进入云函数内部查看。
点击测试,可以进行试运行测试。(注意
:每次修改完代码,都需要重新进行部署)