【Python自动化】定时自动采集,并发送微信告警通知,全流程案例讲解!
一、概要
您好!我是@马哥python说,一名10年程序猿。
我原创开发了一套定时自动化爬取方案,完整开发流程如下:
采集数据 -> 筛选数据 -> 存MySQL数据库 -> 发送邮件 -> 微信提醒 -> 定时执行
如果您现在苦于每天繁琐、重复的数据采集工作,可尝试套用该自动化方案,节省人力,降本增效!
二、效果演示
基于数据隐私保护,部分数据已脱敏。
图2.1 MySQL数据库结果(部分数据已脱敏):

图2.2 Excel结果(部分数据已脱敏):

图2.3 微信消息提醒:

图2.4 收件箱告警邮件:

图2.5 邮件正文内容(部分数据已脱敏):

以上。
三、代码讲解
3.1 爬虫采集行政处罚数据
爬取目标是某公示平台的行政处罚数据。
通过浏览器的开发者模式分析接口,页面显示数据与接口返回数据一致,故可通过爬取接口的方式采集。

图3.1 开发者模式
首先,导入需要用到的库:
import requests # 发送请求
import pandas as pd # 存取csv
import os # 判断本地文件
import random # 随机
from time import sleep # 等待时长,防止反爬
from sqlalchemy import create_engine # 连接数据库
import json # 转换数据格式
然后,定义请求头(真实地址已脱敏):
# 请求头
headers = {
'Accept': 'application/json, text/javascript, */*; q=0.01',
'Accept-Encoding': 'gzip, deflate, br',
'Accept-Language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7',
'Connection': 'keep-alive',
'Content-Type': 'application/json;charset=UTF-8',
'Cookie': '换成自己的cookie',
'Host': 'xxx',
'Origin': 'xxx',
'Referer': 'xxx',
'sec-ch-ua': '"Chromium";v="112", "Google Chrome";v="112", "Not:A-Brand";v="99"',
'sec-ch-ua-mobile': '?0',
'sec-ch-ua-platform': '"macOS"',
'Sec-Fetch-Dest': 'empty',
'Sec-Fetch-Mode': 'cors',
'Sec-Fetch-Site': 'same-origin',
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36',
'X-Requested-With': 'XMLHttpRequest'
}
定义请求参数,即开发者中的payload参数,不再展示。
发送post请求并接收返回数据:
# 发送post请求
r = requests.post(url, headers=headers, data=json.dumps(data))
# 查看响应码
print(r.status_code)
# json解析数据
resp_json = r.json()
data_list = resp_json['data']['list']
逐个解析返回数据,以"处罚金额"为例:
for data in data_list:
# 处罚金额
punish_amount = data['f_2022118615143']
try:
if float(punish_amount) >= threshold: # 如果超过告警阈值,就存入数据
punish_amount_list.append(punish_amount)
else: # 否则进入下一轮循环
continue
except:
continue
这里解释一下:如果处罚金额超过事先设定好的阈值,则存入数据,否则不存,continue进入下一轮循环,由此达成告警的目的。
其他字段(案件名称、处罚人姓名、处罚日期、处罚机关等)同理,不再赘述代码。
最后是保存数据到csv文件:
# 保存数据到Dataframe
df = pd.DataFrame(
{
'页码': page,
'案件名称': case_name_list,
'处罚人姓名': punish_name_list,
'处罚金额': punish_amount_list,
'处罚日期': punish_time_list,
'处罚机关': punish_org_list,
}
)
# 保存到csv文件
df.to_csv(result_file, mode='a+', header=header, index=False, encoding='utf_8_sig')
数据存入csv效果,查看图2.2。
3.2 存MySQL数据库
如上所述,数据保存到csv文件作为临时存储,下面保存到MySQL数据库作为持久性存储。
我采用sqlalchemy和pandas的to_sql结合的方式,把csv数据快速导入MySQL数据库。
关键代码(真实信息已脱敏):
# 创建MySQL数据库连接
engine = create_engine('mysql+pymysql://用户名:密码@IP地址/数据库名')
# 读取csv数据
df_punish = pd.read_csv(result_file)
# 把csv数据导入MySQL数据库
df_punish.to_sql(name='table_name', con=engine, chunksize=1000, if_exists='replace', index=False)
print('导入数据库完成!')
这样的简单3行代码,即实现了csv数据导入MySQL数据库的目的。
注意,to_sql中的if_exists代表如果表中存在数据,那么replace覆盖原始数据,这样不会产生重复数据。当然,也可以加个ist_time插入时间的区分字段,这样可以把if_exists设置为append,保证每次爬取都留痕,你可以试试,我认为这样代码更完善、效果更好。
数据入库效果,查看图2.1。
3.3 发送告警邮件&微信通知
自动发送邮件,我采用zmail库实现。
关键代码(真实信息已脱敏):
def send_email(v_location, v_content):
# 当前时间戳
now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
# 设置邮件信息
mail_content = {
'subject': '税务行政处罚预警邮件 | {} | {}'.format(v_location, now), # 邮件标题
'content_text': '尊敬的管理员,您好!\n\n以下是【{}】税务行政处罚预警名单,请注意查收。\n\n'.format(
v_location) + v_content # 邮件内容
}
# 发件人的用户名和密码
server = zmail.server('xxx@qq.com', 'xxx') # 发件人
# 发送邮件
server.send_mail('xxx@qq.com', mail_content) # 收件人
print('邮件已发送完毕:', v_location)
注意,发件人的smtp服务必须开启,否则会邮件发送失败,如下:

图3.2 邮箱开启smtp服务
邮件收到了,怎么实现的微信通知呢?秘密就是把微信的邮件功能打开,如下:

图3.3 微信设置
微信:我 -> 设置 -> 通用 -> 辅助功能 -> QQ邮箱提醒 -> 开启功能
这样就能让微信收到消息提醒了,效果如图2.3所示。
多说一句,请勿尝试用itchat、wxpy等第三方库操作微信,微信官方已停用这类工具,且存在封号风险!不信你就逝世![手动狗头]
3.4 定时机制
定时执行也是采用简单粗暴的方式,直接os.system调用分别的py文件,死循环加sleep的方式:
while True:
# 执行爬虫
print(get_now(), '开始爬虫!')
os.system('python 爬虫.py')
print(get_now(), '爬取结束!')
sleep(1)
# 发邮件
print(get_now(), '开始发预警邮件!')
os.system('python 发预警邮件.py')
print(get_now(), '结束发预警邮件!')
sleep(1)
# 等待时长60分钟
print(get_now(), '开始等待60分钟..')
sleep(3600)
这样,程序只要在后台一直运行就好了,每隔3600秒(即1小时)自动执行一次,可自定义设置间隔时长。
最终得到的效果就是每隔1小时微信收到一次消息通知,效果如图2.3所示。
四、总结
这套定时采集通知方案,全流程均由本人原创开发,可套用到类似业务需求上,其中部分环节可根据需要,扩展相关功能。请小伙伴们打开脑洞,码上开发!
如文中所说,部分信息涉及隐私保护,所以不提供完整代码,有类似需求的小伙伴可私信讨论。
我是@马哥python说,一名10年程序猿,持续分享Python干货中!
【Python自动化】定时自动采集,并发送微信告警通知,全流程案例讲解!的更多相关文章
- Py福利,基于uiautomatorviewer 的Python 自动化代码自动生成工具分享(jar已发布GitHub,欢迎Star)
前言做UI自动化无论你用SDK自带的uiautomatorviewer还是Macaca还是Appium自动的inspector,代码最多的就是那些繁琐重复的找元素后点击,输入,长按.....等.现在偷 ...
- python自动化之(自动生成测试报告)
前言: 用python执行测试脚本, 测试报告是记录我们测试过程的问题, 方便我们对整个测试过程的把控. 这里引用的是别人写好的模板, 我们拿过来用就OK, 能力强者可自行编写模板 测试报告图模板: ...
- Zabbix实现微信告警
zabbix实现微信告警可以分为以下两个步骤: 在百度告警告警平台实现微信告警 将Zabbix接入百度告警平台 微信告警 实现微信告警只需要如下四步: 个人主页关注微信 升级策略配置微信告警 服务管理 ...
- zabbix 微信告警配置
作者信息 邮箱:sijiayong000@163.com Q Q:601566386 Zabbix 微信告警 摘要:Zabbix可以通过多种方式把告警信息发送到指定人,常用的有邮件,短信报警方式,但是 ...
- 微信告警如何配置?用Cloud Alert快速实现微信告警
在当下互联网蓬勃发展的时代里,微信已经成为了人们生活中不可分割的一部分.作为苦逼的运维人员,我们自然也得跟得上时代的步伐,将微信添加进告警的通知方式里.如果能够将告警消息第一时间发送到微信中,更清楚地 ...
- zabbix 告警实践分享 一键实现zabbix 电话、邮件、微信告警
众所周知Zabbix 是一款用来监控IT基础设施的监控套件,同时也具有很多方便运维人员使用的优秀功能,如:支持多条件告警,支持多种告警方式,支持多组模板.支持模板继承,因此在众多的开源运维监控软件中独 ...
- 【玩具】使用Python自动化发送微信消息进行订水
事情是这样的,我知道淘宝上有卖一种USB接口的大按钮,估计是给工厂或者医院之类的场景设计的,样子长这样: 然后我就一直挺想搞一个的,不为别的,就是玩,但是想来想去也没想到这玩意儿对我而言能有啥用途,就 ...
- 全网最全的Windows下Anaconda2 / Anaconda3里Python语言实现定时发送微信消息给好友或群里(图文详解)
不多说,直接上干货! 缘由: (1)最近看到情侣零点送祝福,感觉还是很浪漫的事情,相信有很多人熬夜为了给爱的人送上零点祝福,但是有时等着等着就睡着了或者时间并不是卡的那么准就有点强迫症了,这是也许程序 ...
- python使用itchat发送微信消息提醒
最近在学习一点python,先找了找有趣的应用,实际修改跑了一下提高兴趣程度. 找到itchat,它的简介是这样的: “itchat是一个开源的微信个人号接口,使用python调用微信从未如此简单. ...
- python发送微信及企业微信消息
1.发送微信消息 直接使用第三方库 itchat,其文档中有详细使用方式:https://itchat.readthedocs.io/zh/latest/ 如下实例为 发送群聊信息 # -*- cod ...
随机推荐
- ZYNQ7000系列学习之自定义模块构成IP
ZYNQ的自定义IP 1.实验原理 在vivado中可以将自己写的verilog模块封装成IP核,并入bd设计,有效地提高了PS到PL的设计内联能力.同时,这部分的学习可以将verilog的基础知识转 ...
- KingbaseES例程_普通表在线转分区表(基于触发器)
KingbaseES例程_普通表在线转分区表 概述 普通表转分区表,使用视图的替换式触发器,以路由方式,实现在线转移数据. 数据准备 /*普通大表*/ create table tab_single ...
- KingbaseES 等待事件之LWLock lock_manager
背景 相信我们不止一次遇到过一个等待事件:LWLock lock_manager.下面我们聊聊这个等待事件的含义,产生原因,以及解决方法. 等待事件含义 当数据库维护共享锁的内存区域以在无法实现以fa ...
- Advanced .Net Debugging 6:程序集加载器
一.简介 这是我的<Advanced .Net Debugging>这个系列的第六篇文章.这篇文章的内容是原书的第二部分的[调试实战]的第四章.这章主要讲的是程序集加载器,比如:CLR 加 ...
- 9 CSS背景属性
CSS 背景属性 1. background-color(背景颜色) 页面的背景颜色有四种属性值表示,分别是transparent(透明),RGB十进制颜色表示,十六进制颜色表示和颜色单词表示. 属性 ...
- #凸包,闵可夫斯基和#CF87E Mogohu-Rea Idol
题目 按逆时针顺序给出三个凸包点集 \(\mathbb{A,B,C}\),每次查询给出点 \(D\), 问是否存在点 \(A\in\mathbb{A},B\in\mathbb{B},C\in\math ...
- #背包#nssl 1488 上升子序列
题目 给一个长度为\(n\)的数组\(a\).试将其划分为两个严格上升子序列,并使其长度差最小. 分析 当\(max([1,i])<min([i+1,n])\)时显然两个区间互不影响,把\(i\ ...
- C++ Break、Continue 和 数组操作详解
C++ Break 和 Continue break 语句还可以用来跳出循环. 在以下示例中,当 i 等于 4 时跳出循环: for (int i = 0; i < 10; i++) { if ...
- 初学STM32 SDIO (二)
SD命令由主机发出,以广播命令和寻址命令为例,广播命令是针对与SD主机总线连接的所有从设备发送的,寻址命令是指定某个地址设备进行命令传输. 1.SD命令格式 SD命令格式固定为48bit,都是通过 ...
- 通过 API 快速创建 AlertManager silence
概述 通常我们要 silence 某个 AlertManager 的 alert 时,需要通过 UI 界面操作,如下图: 效率有点低,而且不够自动化,那么是否可以有一种办法快速创建 AlertMana ...