【辅助交易篇】1、上证新股提示 ——基于腾讯云函数和server酱

【辅助交易篇】1、上证新股提示 ——基于腾讯云函数和server酱

很久没更新了,主要是因为脑海空空,不知道应该干什么。嗯。。。 既然如此,那就先看看怎么赚钱吧。正好,前天又看到了东鹏上市十五连涨的新闻,于是想看看能不能在新股方面做一些事情,这就有了这篇文章。

本篇文章的原本目标是定时获取上证新股的上市预告情况,但由于腾讯云函数不支持数据的存储,无奈只得变成每日新股上市总结(我会这么认输吗??? 当然不,我们下篇文章解决这一问题)。。。。。

ok,说了这么多,该说说这篇文章的整体实现思路了。总体可以说是包含两大部分,第一部分是爬虫部分,爬取当日上证上市公告模块,解析获取企业欲上市信息;第二部分是微信推送模块,这边暂时使用的是server酱的api。当爬虫模块爬取完上市信息后,进行一定的数据处理和整合,将结果传递给微信推送模块,微信推送模块对数据进行解析,并将结果放入到markdown摸板里,最后将结果发送给server酱api,由server酱api将数据传递到我们的微信当中。

获取上证新股数据

确定目标url

网址:http://www.sse.com.cn/disclosure/announcement/listing/

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KiH53qX4-1624074626718)(C:\Users\lsy\AppData\Roaming\Typora\typora-user-images\image-20210619105534979.png)]

用chrome打开该网址,点击F12进入开发者模式,随后点击network准备抓包(记得勾上preserve log,防止跳转后,抓包结果被清空),点击下一页可以抓到如图所示的包。至此,我们已经获取到爬虫模块的目标url(注意:第一页的后缀不是index_1.htm,而是index.htm)。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UmeB1tjP-1624074626725)(C:\Users\lsy\AppData\Roaming\Typora\typora-user-images\image-20210619105835902.png)]

编写爬虫模块与数据解析

想了想,最后决定爬虫模块返回的结果为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 最大请求次数5001000

注册、并登录完成后,需要选择消息通道,我选择的是企业微信通道(略有点麻烦),然后企业微信通道方面,在该网页有设置教程。不再赘述、流程如下。地址:https://sct.ftqq.com/forward

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Xn7dDAC4-1624074626729)(C:\Users\lsy\AppData\Roaming\Typora\typora-user-images\image-20210619111710686.png)]

img

微信推送模块

首先获取发送密钥

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UrCI9XFL-1624074626735)(C:\Users\lsy\AppData\Roaming\Typora\typora-user-images\image-20210619112238854.png)]

随后在下面的提示中可以发现,发送的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/

登陆后,直接搜索云函数。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Iof6VQMv-1624074626738)(C:\Users\lsy\AppData\Roaming\Typora\typora-user-images\image-20210619112641914.png)]

进入管理控制台-》点击函数服务-》新建

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uMrcFU9o-1624074626739)(C:\Users\lsy\AppData\Roaming\Typora\typora-user-images\image-20210619112729035.png)]

点击自定义创建、并修改函数名为sz_check

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lMnHC2P3-1624074626741)(C:\Users\lsy\AppData\Roaming\Typora\typora-user-images\image-20210619112816991.png)]

粘贴代码,修改执行方法名称

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EfyieEsE-1624074626743)(C:\Users\lsy\AppData\Roaming\Typora\typora-user-images\image-20210619113025177.png)]

#!/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),

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lGdHO5Jg-1624074626746)(C:\Users\lsy\AppData\Roaming\Typora\typora-user-images\image-20210619113539055.png)]

随后进行触发器的配置,我们这里配置成每天晚上10点半进行一天的总结。随后点击完成。

0 30 22 * * * * 表示在每日的22点30分触发。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lNPTtdXM-1624074626747)(C:\Users\lsy\AppData\Roaming\Typora\typora-user-images\image-20210619113839407.png)]

这就创建完成了,可点击函数名进入云函数内部查看。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mjJMO3Qz-1624074626749)(C:\Users\lsy\AppData\Roaming\Typora\typora-user-images\image-20210619114019161.png)]

点击测试,可以进行试运行测试。(注意:每次修改完代码,都需要重新进行部署)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Y85jSBVb-1624074626750)(C:\Users\lsy\AppData\Roaming\Typora\typora-user-images\image-20210619114124687.png)]

结果展示

[(img-PrnDhYVS-1624074626753)(C:\Users\lsy\AppData\Roaming\Typora\typora-user-images\image-20210619114310428.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wSNialnk-1624074626754)(C:\Users\lsy\AppData\Roaming\Typora\typora-user-images\image-20210619114323451.png)]

微信公众号

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值