【Python自动化】定时自动采集,并发送微信告警通知,全流程案例讲解!

文章目录

  • 一、概要
  • 二、效果演示
  • 三、代码讲解
    • 3.1 爬虫采集行政处罚数据
    • 3.2 存MySQL数据库
    • 3.3 发送告警邮件&微信通知
    • 3.4 定时机制
  • 四、总结

一、概要

您好!我是@马哥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干货中!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/162348.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

十一、统一网关GateWay(搭建网关、过滤器、跨越解决)

目录 一、网关技术的实现 在SpringCloud中网关的实现包括两种: 作用: 二、搭建网关服务 1、新建模块,并添加依赖 2、新建Gateway包,并编写启动类 3、编写yml文件 4、启动服务,并在网页内测试 5、步骤 三、路由断言工厂 …

Python与ArcGIS系列(九)自定义python地理处理工具

目录 0 简述1 创建自定义地理处理工具2 创建python工具箱0 简述 在arcgis中可以进行自定义工具箱,将脚本嵌入到自定义的可交互窗口工具中。本篇将介绍如何利用arcpy实现创建自定义地理处理工具以及创建python工具箱。 1 创建自定义地理处理工具 在arctoolbox中的自定义工具箱…

C++初阶 日期类的实现(下)

目录 一、输入输出(>>,<<)重载的实现 1.1初始版 1.2友元并修改 1.2.1简单介绍下友元 1.2.2修改 1.3>>重载 二、条件判断操作符的实现 2.1操作符的实现 2.2!操作符的实现 2.3>操作符的实现 2.4>,<,<操作符的实现 三、日期-日期的实现 …

Flutter笔记:Matrix4矩阵变换与案例

Flutter笔记 Matrix4矩阵变换及其案例 作者&#xff1a;李俊才 &#xff08;jcLee95&#xff09;&#xff1a;https://blog.csdn.net/qq_28550263 邮箱 &#xff1a;291148484163.com 本文地址&#xff1a;https://blog.csdn.net/qq_28550263/article/details/134474764 【简介…

java回调函数

在java中是存在回调函数的&#xff0c;我们可以把回调函数理解为一个被作为参数传递的函数。 类似于&#xff0c;我可以设置一个功能给系统&#xff0c;但是只有特定时候才会触发&#xff0c;触发的时候就会把函数作为参数的形式传递到另外的函数中。一般都是使用系统中写好的…

Vue3+Vite实现工程化,插值表达式和v-text以及v-html

1、插值表达式 插值表达式最基本的数据绑定形式是文本插值&#xff0c;它使用的是"Mustache"语法&#xff0c;即 双大括号{{}} 插值表达式是将数据 渲染 到元素的指定位置的手段之一插值表达式 不绝对依赖标签&#xff0c;其位置相对自由插值表达式中支持javascript的…

NSSCTF第13页(1)

[NCTF 2018]Easy_Audit 小小代码审计 $_REQUEST:PHP的内置变量&#xff0c;是一个数组&#xff0c;保存传递的参数&#xff0c;它的特性是如果get,post一起传参&#xff0c;则会优先post传参&#xff0c;可以由此进行变量覆盖。 $_SERVER:PHP的内置变量&#xff0c;是一个数组…

unity教程

前言 伴随游戏行业的兴起&#xff0c;unity引擎的使用越来越普遍&#xff0c;本文章主要记录博主本人入门unity的相关记录大部分依赖siki学院进行整理。12 一、认识unity引擎&#xff1f; 1、Unity相关信息&#xff1a; Unity的诞生&#xff1a;https://www.jianshu.com/p/550…

如何解决swagger-editor在线接口调试时的跨域问题

文章目录 一&#xff0c;序言二&#xff0c;问题重现1. 运行swagger-editor2. 运行接口服务3. 问题重现步骤 三&#xff0c;解决问题思路1. 去除浏览器安全限制2. 服务器接口统一处理3. 委托nginx转发 四&#xff0c;完整接口代码传送 一&#xff0c;序言 在 Docker 运行swagg…

提升 Python 执行速度:Codon、C/C++、Rust、Numba(JIT)、Taichi、Nuitka、MatxScript

几种流行的 Python 性能加速方案对比&#xff1a;https://zhuanlan.zhihu.com/p/604519817 对于一般通用场景用户&#xff0c;对性能没有那么强烈的诉求&#xff0c;紧跟官方步伐&#xff0c;升级到最新版本的 Python 既可&#xff0c;或者使用 PyPy。Numba、Codon、Taichi 等这…

电子画册真的好好用,制作也简单,都快来学学!

同纸质画册相比&#xff0c;电子画册无需受时间、空间、地域等限制&#xff0c;它通过手机、电脑即可发送文件&#xff0c;轻松实现在线浏览&#xff0c;使用起来更方便。 如何制作电子画册&#xff1f;这里同大家分享一下超简单的电子画册制作教程&#xff0c;0基础也能轻松上…

机器学习的医疗乳腺癌数据的乳腺癌疾病预测

项目视频讲解:基于机器学习的医疗乳腺癌数据的乳腺癌疾病预测 完整代码数据分享_哔哩哔哩_bilibili 效果演示: 代码: #第一步!导入我们需要的工具 import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns %matplotlib inlin…

kubenetes-容器网络接口CNI

一、CNI Kubernetes 网络模型设计的基础原则是&#xff1a; 所有的Pod能够不通过NAT(网络地址转换)就能相互访问。所有的节点能够不通过NAT就能相互访问。容器内看见的IP地址和外部组件看到的容器IP是一样的。 Kubernetes的集群里&#xff0c;IP地址是以Pod为单位进行分配的…

IoC DI

Spring 的两大核心思想 : IoC 和 AOP 我们要将对象的控制权交给Spring ,我们就需要告诉 Spring 哪些对象是需要帮我们进行创建的,这里有两类注解可以实现 : 类注解(Controller Service Repository Component Configuration)和方法注解(Bean) 这五大注解都表示把这个对象交给…

2023-11-18 LeetCode每日一题(数位和相等数对的最大和)

2023-11-18每日一题 一、题目编号 2342. 数位和相等数对的最大和二、题目链接 点击跳转到题目位置 三、题目描述 给你一个下标从 0 开始的数组 nums &#xff0c;数组中的元素都是 正 整数。请你选出两个下标 i 和 j&#xff08;i ! j&#xff09;&#xff0c;且 nums[i] …

深入理解网络协议:通信世界的基石

&#x1f482; 个人网站:【 海拥】【神级代码资源网站】【办公神器】&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交流的小伙伴&#xff0c;请点击【全栈技术交流群】 在当今数字化时代&#xff0c;网络协议是连接世…

Windows下安装RabbitMQ

1.安装Erlang 因为RabbitMQ是用Erlang语言编写的&#xff0c;所以在安装RabbitMQ之前需要先安装Erlang。 如果还未安装Erlang&#xff0c;官方下载安装包&#xff0c;点击Download Windows installer下载Erlang Downloads - Erlang/OTP 下载Erlang/OTP后&#xff0c;双击otp的…

JavaScript管理HTMLDOM元素(增删改查)

本文主要讲解JavaScript如何通过管理HTML上的DOM元素&#xff0c;其中包括如何查询、创建、修改以及删除具体功能和源码讲解。 增加 首先我们准备一个HTML框架和简单CSS样式&#xff0c;我对其中元素作用和关系进行一个简单说明。 <!DOCTYPE html> <html><he…

2023年道路运输企业主要负责人证考试题库及道路运输企业主要负责人试题解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2023年道路运输企业主要负责人证考试题库及道路运输企业主要负责人试题解析是安全生产模拟考试一点通结合&#xff08;安监局&#xff09;特种作业人员操作证考试大纲和&#xff08;质检局&#xff09;特种设备作业人…

C#特性(Attribute)

C#特性&#xff08;Attribute&#xff09;是一种在程序中添加元数据的机制&#xff0c;它可以为代码提供额外的信息和指示。通过使用特性&#xff0c;我们可以为类、方法、属性等元素添加标记&#xff0c;以便在运行时进行更多的操作和决策。 C#特性是一种声明式编程的工具&…