【zabbix监控+python爬虫+shell脚本】 理财对接天天基金网实现相关基金波动邮件/钉钉提醒

摘要:
在Python中,本机Python 2.7用作爬虫。因为我的python 7.7对8有点抵触。至于为什么有人问,我不知道,我也不想说,哈。外壳非常简单。这无非是推送python抓取的数据并将其扔给zabbix。顺便说一下,我对zabbix使用活动模式。至于我为什么使用活动模式,因为我的zabbix被放入docker中,所以每次设置监视器时,我都会直接导入zabbix图像,然后进入并启动相关过程。它是干净的。

前序

刚开始接触理财, 第一次朋友介绍的是[安信证券]这款app, 看了几天, 以每笔500的价格入手了两个基金玩玩接触一下行情, 后来发现, 每次都不知道它什么时候更新这个变动净值参数,每次都要自己去搜索, 或者又要登录一遍去看盈亏, 够懒吧, 嘿嘿, 后来突发奇想, 跟朋友了解一下是不是有什么公式能计算得到相关的净值参数的, 于是翻了一遍, 发现对[天天基金网]这个web来比较轻松愉快一些, 那么既然有了想法, 就开干吧。

目的展示

当基金发现波动的时候, 来信息提示, -代表下跌,正数代表上涨

【zabbix监控+python爬虫+shell脚本】 理财对接天天基金网实现相关基金波动邮件/钉钉提醒第1张

架构拓展

容器:

zabbix-server : Docker

zabbix-agent : CentOS Linux release 7.7.1908 (Core)

版本:

nginx1.17 + mysql5.7.22 + php7 + zabbix4.2.5

python2.7.5

技术模型

【zabbix】

zabbix这块, 使用到的无非就是一个开源的项目而已, 不难,  自行搭建, 至于有伙伴说不知道怎么搭, 那么建议你去找度娘聊一下, 或者搜一下我之前写的zabbix搭建的文章, 但是我的文章水平都很有限,没办法,人就这样,还想上天不成[/哭泣/]。

【python】

python这块, 用爬虫,使用的是原生的python2.7, 由于我的是centos7.7, 有点抗拒8, 至于有人问为什么呢,俺不知道,也不想说,哈。

【shell】

shell这个就很简单了, 无非就是推送一下python爬去下来的数据, 扔给zabbix, 对了, zabbix我用的是主动模式, 至于为什么用主动模式, 因为我的zabbix是扔在docker里面的, 所以我每次搭建一个监控的时候就直接导入我的zabbix镜像, 然后进去start一下相关进程就好了, 干净。

提醒:进行下面操作之前,zabbix得预先搭建好, 我这边就不再演示了。

代码目录文件简介

【zabbix监控+python爬虫+shell脚本】 理财对接天天基金网实现相关基金波动邮件/钉钉提醒第2张

-rwxr-xr-x 1 zabbix zabbix   21 Jan 14 20:32 fund.code              基金代码
-rwxr-xr-x 1 zabbix zabbix  119 Jan 14 22:44 fund.dict              基金代码+基金名称
-rwxr-xr-x 1 zabbix zabbix  909 Jan 15 11:19 fund_dict2.sh          基金净值百分比筛选shell
-rwxr-xr-x 1 zabbix zabbix  801 Jan 15 09:56 fund_dict.sh           基金净值筛选shell
drwxr-xr-x 2 zabbix zabbix 4096 Jan 15 11:50 fund_log               日志目录
-rwxr-xr-x 1 zabbix zabbix 1713 Jan 15 14:20 fund.py                爬虫
-rwxr-xr-x 1 zabbix zabbix 1211 Jan 15 10:13 fund.sh                筛选今天和昨天净值

fund.code

[root@mail script]# cat fund.code 
001071
003986
007244

fund.dict

[root@mail script]# cat fund.dict 
001071,华安媒体互联网混合
003986,申万菱信中证500指数优选增强A
007244,安信核心竞争力混合C

fund_dict2.sh

fund_dict.sh与fund_dict2.sh基本相同, 不过就是后面筛选的参数不一样,自动获取今天的时间和昨天的时间(以今天的为标准), 当今天的基金净值为更新的时候拿到的参数是空的, 这个时间会进入判断, 如果拿到的参数为空,那就是说今天的相关基金净值还没有更新, 那么这个时候就取昨天的为准, 一旦发现更新, 就推送到监控上面去触发, 然后提醒, 告诉自己今天的基金是涨还是跌。

[root@mail script]# cat fund_dict2.sh 
#*************************************************************************
#         > File Name: fund_dict.sh
#         > Author: chenglee
#         > Main : chengkenlee@sina.com
#         > Blog : http://www.cnblogs.com/chenglee/
#         > Created Time : Tue 14 Jan 2020 10:48:10 PM CST
#*************************************************************************
#!/bin/bash

today=`date +"%Y-%m-%d"`
yesterday=`date -d"yesterday ${today}" +%Y-%m-%d`
fund_code=$1

cd /zabbix/zabbix-agent/script
todaydata=`cat fund_log/fund_${fund_code}.log | grep "${today}" | sed 's/ //g' | awk -F '|' '{print$5}'`
if [ -z "$todaydata" ];then
    yesterdaydata=`cat fund_log/fund_${fund_code}.log | grep "${yesterday}" | sed 's/ //g' | awk -F '|' '{print$5}'`
    echo $yesterdaydata
    #echo $yesterdaydata > fund_log/${fund_code}.profit
else
    echo $todaydata
    #echo $todaydata > fund_log/${fund_code}.profit
fi

fund_dict.sh

#*************************************************************************
#         > File Name: fund_dict.sh
#         > Author: chenglee
#         > Main : chengkenlee@sina.com
#         > Blog : http://www.cnblogs.com/chenglee/
#         > Created Time : Tue 14 Jan 2020 10:48:10 PM CST
#*************************************************************************
#!/bin/bash

today=`date +"%Y-%m-%d"`
yesterday=`date -d"yesterday ${today}" +%Y-%m-%d`
fund_code=$1

cd /zabbix/zabbix-agent/script
todaydata=`cat fund_log/fund_${fund_code}.log | grep "${today}" | sed 's/ //g' | awk -F '|' '{print$4}'`
if [ -z "$todaydata" ];then
    yesterdaydata=`cat fund_log/fund_${fund_code}.log | grep "${yesterday}" | sed 's/ //g' | awk -F '|' '{print$4}'`
    echo $yesterdaydata
else
    echo $todaydata
fi

fund_log

total 12
-rw-r--r-- 1 zabbix zabbix 546 Jan 15 14:30 fund_001071.log
-rw-r--r-- 1 zabbix zabbix 546 Jan 15 14:30 fund_003986.log
-rw-r--r-- 1 zabbix zabbix 546 Jan 15 14:30 fund_007244.log

fund.py

爬虫, 实现将相关基金的净值参数根据相关日期拿下来

#!/usr/bin/env python
"""
# Author: chenglee
# Created Time : Tue 14 Jan 2020 08:16:54 PM CST
# File Name: ji.py
# Description:
"""
# -*- coding:utf-8 -*-
# url:http://fund.eastmoney.com/f10/F10DataApi.aspx?type=lsjz&code=007244&sdate=2020-01-01&edate=2020-01-15&per=20

import requests
from bs4 import BeautifulSoup
from prettytable import *


def get_url(url, params=None, proxies=None):
    rsp = requests.get(url, params=params, proxies=proxies)
    rsp.raise_for_status()
    return rsp.text


def get_fund_data(code, start='', end=''):
    record = {'Code': code}
    url = 'http://fund.eastmoney.com/f10/F10DataApi.aspx'
    params = {'type': 'lsjz', 'code': code, 'page': 1, 'per': 65535, 'sdate': start, 'edate': end}
    html = get_url(url, params)
    soup = BeautifulSoup(html, 'html.parser')
    records = []
    tab = soup.findAll('tbody')[0]
    for tr in tab.findAll('tr'):
        if tr.findAll('td') and len((tr.findAll('td'))) == 7:
            record['Date'] = str(tr.select('td:nth-of-type(1)')[0].getText().strip())
            record['NetAssetValue'] = str(tr.select('td:nth-of-type(2)')[0].getText().strip())
            record['ChangePercent'] = str(tr.select('td:nth-of-type(4)')[0].getText().strip())
            records.append(record.copy())
    return records


def demo(code, start, end):
    table = PrettyTable()
    table.field_names = ['Code', 'Date', 'NAV', 'Change']
    table.align['Change'] = 'r'
    records = get_fund_data(code, start, end)
    for record in records:
        table.add_row([record['Code'], record['Date'], record['NetAssetValue'], record['ChangePercent']])
    return table


if __name__ == "__main__":
    print demo('001071', '2020-01-01', '2020-01-15')

爬下来的数据是怎么样的呢, 是这样的

【zabbix监控+python爬虫+shell脚本】 理财对接天天基金网实现相关基金波动邮件/钉钉提醒第3张

fund.sh

过滤, 调用爬虫去获取, 我定义的是每5分钟获取一次, 扔进crontab里面自生自灭了。

#*************************************************************************
#         > File Name: fund.sh
#         > Author: chenglee
#         > Main : chengkenlee@sina.com
#         > Blog : http://www.cnblogs.com/chenglee/
#         > Created Time : Tue 14 Jan 2020 08:27:06 PM CST
#*************************************************************************
#!/bin/bash
today=`date +"%Y-%m-%d"`
day1=`cat fund.py | grep print | cut -d '(' -f2|cut -d ')' -f1 | sed "s|'||g" | sed 's/ //g' | awk -F ',' '{print$2}'`
day2=`cat fund.py | grep print | cut -d '(' -f2|cut -d ')' -f1 | sed "s|'||g" | sed 's/ //g' | awk -F ',' '{print$3}'`

function running(){
    exec 2<"fund.code"
    while read line2<&2
    do
        fund_code=`cat fund.py | grep print | cut -d '(' -f2|cut -d ')' -f1 | sed "s|'||g" | sed 's/ //g' | awk -F ',' '{print$1}'`
        sed -i "s|${fund_code}|${line2}|g" fund.py
        python fund.py > fund_log/fund_${line2}.log
    done
}
function main(){
    if [ $day2 != $today ];then
        sed -i "s|${day2}|${today}|g" fund.py
    fi
    if [ ! -d "fund_log" ];then
        mkdir fund_log
    fi
    running
}
function sleeping(){
    cd /zabbix/zabbix-agent/script
    main
}
sleeping

最随便的操作

1. 授权给zabbix

注: 因为到时候要扔进zabbix去进行自动化操作, 你不给它工钱, 又想让它干活, 它会跟你大吼一个 "Permission denied" 然后罢工你信不信。

chmod -R zabbix:zabbix /zabbix/zabbix-agent/script/
chmod +x /zabbix/zabbix-agent/script/*.sh
chmod +x /zabbix/zabbix-agent/script/*.py

2. zabbix-agentd要配置好

注: 这些值是要推送给监控上面的, 后面加的是你要监控的基金代码, so easy.

【zabbix监控+python爬虫+shell脚本】 理财对接天天基金网实现相关基金波动邮件/钉钉提醒第4张

3. 定时炸弹

注: 定时运行爬虫, 爬取最新数据下来分析, 每5分钟爬一次。

*/5 * * * * sh /zabbix/zabbix-agent/script/fund.sh

运行之后回事什么样子的呢, 就像这个样子, 会在相关日志目录下生成相关的基金数据日志

【zabbix监控+python爬虫+shell脚本】 理财对接天天基金网实现相关基金波动邮件/钉钉提醒第5张

注:上面已经说了, zabbix已经搭建好了吧, 那么现在就来配置告警吧。

zabbix大焖锅

注:这个是要在zabbix server中配置的。

告警方式双推送。

1. 钉钉

1.1钉钉告警shell

注:钉钉需要配置后台推送,扔个文件进去相关目录,记得授权和修改你的钉钉机器人地址, 有些python没有装requests模块的, pip install requests装一下就好。

[root@608135bcf753 alertscripts]# pwd
/data/zabbix-4.2.5/share/zabbix/alertscripts
[root@608135bcf753 alertscripts]# cat dingding.py 
#!/usr/bin/python
# -*- coding: utf-8 -*-
import requests
import json
import sys
import os

headers = {'Content-Type': 'application/json;charset=utf-8'}
api_url="https://oapi.dingtalk.com/robot/send?access_token=8b8c40dfe9c7e98bc575dd963aac459f880"
#需要更换你机器人的地址
def msg(text):
    json_text= {
     "msgtype": "text",
     "text": {
         "content": text
     },
     "at": {
         "atMobiles": [
             "186..." #需要@群里谁
         ],
         "isAtAll": False #是否全部@,True为是,False为否
     }
    }
    print requests.post(api_url,json.dumps(json_text),headers=headers).content

if __name__ == '__main__':
    text = sys.argv[1]
    msg(text)

1.2告警媒介类型

【zabbix监控+python爬虫+shell脚本】 理财对接天天基金网实现相关基金波动邮件/钉钉提醒第6张

【zabbix监控+python爬虫+shell脚本】 理财对接天天基金网实现相关基金波动邮件/钉钉提醒第7张

1.3动作

【zabbix监控+python爬虫+shell脚本】 理财对接天天基金网实现相关基金波动邮件/钉钉提醒第8张

 警示度【zabbix监控+python爬虫+shell脚本】 理财对接天天基金网实现相关基金波动邮件/钉钉提醒第9张

 操作【zabbix监控+python爬虫+shell脚本】 理财对接天天基金网实现相关基金波动邮件/钉钉提醒第10张

消息传送指定

 【zabbix监控+python爬虫+shell脚本】 理财对接天天基金网实现相关基金波动邮件/钉钉提醒第11张

 1.4 用户

【zabbix监控+python爬虫+shell脚本】 理财对接天天基金网实现相关基金波动邮件/钉钉提醒第12张

报警媒介

【zabbix监控+python爬虫+shell脚本】 理财对接天天基金网实现相关基金波动邮件/钉钉提醒第13张

2. 邮件

注:邮件不用配置后台哈,邮件这块我用的是zoho域名邮箱, zoho是什么?呃,水平有限不知道怎么解释。登登登....百度一下,你就知道。

基本上操作与钉钉无异。

触发器:{fund:funds_001071.diff()}=1

当发现当前值与上一个值有差异时(有差异代表已更新), 触发。

3.成果

页面动态展示

【zabbix监控+python爬虫+shell脚本】 理财对接天天基金网实现相关基金波动邮件/钉钉提醒第14张

当发现更新,钉钉提醒

【zabbix监控+python爬虫+shell脚本】 理财对接天天基金网实现相关基金波动邮件/钉钉提醒第15张

当发现更新,邮件提醒

【zabbix监控+python爬虫+shell脚本】 理财对接天天基金网实现相关基金波动邮件/钉钉提醒第16张

免责声明:文章转载自《【zabbix监控+python爬虫+shell脚本】 理财对接天天基金网实现相关基金波动邮件/钉钉提醒》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Arm设计思想与高效C语言编程联系SQL SERVER 关于多层嵌套的方法下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Ansible之路——第四章:Host Inventory

Ansible 可同时操作属于一个组的多台主机,组和主机之间的关系通过 inventory 文件配置. 默认的文件路径为 /etc/ansible/hosts。 除默认文件外,还可以同时使用多个 inventory 文件,也可以从动态源,或云上拉取 inventory 配置信息。 4.1 静态Inventory文件  静态Inventory指的是在文件/...

Python学习笔记:SQL中group_concat分组合并操作实现

一、背景 MySQL学习笔记:concat、concat_ws、group_concat —— 字符串连接 如何利用 Pandas 实现 SQL 中的 group_concat 操作? 二、实操 1.构造测试数据集 import pandas as pd import numpy as np df = pd.DataFrame({ 'nam...

python爬虫之短信报警

1 importsmtplib 2 importemail.mime.multipart 3 importemail.mime.text 4 5 def send_email(content=''): 6 """ 7 发送邮件 8 :param SMTP_host: smtp.163.com 9 :param from_addr:...

像Excel一样使用python进行数据分析(3)

像Excel一样使用python进行数据分析(1) 像Excel一样使用python进行数据分析(2) 7,数据汇总 第七部分是对数据进行分类汇总,Excel中使用分类汇总和数据透视可以按特定维度对数据进行汇总,python中使用的主要函数是groupby和pivot_table。下面分别介绍这两个函数的使用方法。 分类汇总 Excel的数据目录下提供了“...

linux springboot快捷启动脚本

yum install redhat-lsb -y   进入/usr/local/bin放入脚本springboot添加权限chmod +x springboot #################################### #!/bin/bash. /etc/profile if [ -r /lib/lsb/init-functions ];...

day15自定义模块的导入

目录 自定义模块 导入自定义模块: 导入模块的方式: 相对导入: 常用模块:random(后续更新) 自定义模块 什么是模块:本质就.py文件,封装语句的最小单位。 自定义模块: 编写自定义模块开头最好用多行注释说明模块内容。 模块中出现的变量(for循环、if结构、函数定义等)称为模块的成员。 模块的运行方式:1)脚本方式:直接用解释器执行,...