一个基于Python的自动化邮件日报模版

科技   2024-10-31 19:30   北京  

数据人学习平台上线了:www.shujurenclub.com

作者介绍

@郝笑笑 

微信号:hao-xiao-xiao,

数据分析师,

负责DAU流量增长策略与数据监控,

希望可以和各位一起交流学习。

01

工作场景

希望将效果广告业务的历史每日的曝光量、点击量、转化量、CTR、CVR等指标,以Excel附件的格式发送给业务同学


02

任务分解

1、数据获取

数据获取方式可能有:

1)连接hive或者mysql 数据库进行查询;

2)访问API接口查询


2、数据存储到csv或者xlsx文件


3、发送邮件


4、定时执行以上任务,并打印执行日志,以便后续问题追溯 (本文亮点)

03

具体代码

1、下载安装PyCharm软件,并安装相关包,将以下代码调试成功后,保存为.py文件

## 将以下脚本保存为dailyreport.py class DailyReport
import osimport sysimport pymysqlimport pandas as pdimport numpy as npfrom datetime import datetimefrom openpyxl import Workbookfrom openpyxl import load_workbook
##连接mysql 数据库进行查询def __init__(self): # 初始化 mysql 链接参数 self.ad_host = Config.ad_host # 数据库的ip地址 self.ad_user = Config.ad_user # 数据库的账号 self.ad_password = Config.ad_password # 数据库的密码 self.ad_port = Config.ad_port # mysql数据库通用端口号 self.ad_db = Config.ad_db # 数据库 self.last_day = datetime.now().date() - timedelta(days=1) #昨日日期 self.sql = """ select day,sum(pv) as pv,sum(click) as click,sum(conv) as conv from report where day >= '2024-01-01' and day < CURRENT_DATE() group by day """
def read_mysql_data(self): df_ad = pd.DataFrame() verify_flag = True while verify_flag: # 1. 建立数据库的连接信息 mysql_ad = pymysql.connect(host=self.ad_host, user=self.ad_user, password=self.ad_password, port=self.ad_port, db=self.ad_db, charset='utf8mb4') # 2. 编写sql sql = self.sql1 # 3. 通过 pd 读取 数据库数据为 df_ad df_ad = pd.read_sql(sql, mysql_ad)
# 验证是否有昨天数据 df_verify = df_ad[df_ad['day'] == self.last_day] if not df_verify.empty: print('今日已有昨天 {} 数据,继续执行'.format(self.last_day)) # 5. 使用df做进一步的数据处理 print('mysql查询数据结果:', df_ad) verify_flag = False else: print('今日还没有昨天 {} 数据,程序会等一段时间再试'.format(self.last_day)) time.sleep(1200)
# 4. 关闭数据库连接 mysql_ad.close()
# 5. 使用df_ad 做进一步的数据处理,增加ctr、cvr列 df_ad['ctr'] = round(df_ad['click'] / df['pv'],2) df_ad['ctr'] = round(df_ad['click'] / df['pv'],2) print('处理后的数据:',df_ad) return df_ad
def write_ws(self):    # 创建一个新的Excel工作簿和工作表,从单元格B3开始写入    wb = Workbook()    ws = wb.active start_col = 2 start_row = 3 for col_idx, (index, row) in enumerate(df_ad.iterrows(), start=start_col): for row_idx, value in enumerate(row, start=start_row): ws.cell(row=row_idx, column=col_idx, value=value) wb.save('ad_daily_report{}.xlsx'.format(datetime.now().date()))

def send_email(self):    from email import encoders    from email.header import Header    from email.mime.text import MIMEText    from email.utils import parseaddr, formataddr from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText from email.mime.application import MIMEApplication
from_addr = 'user@**.com' #发件人邮箱地址 to_addr = '''zhangsan@qq.com,lisi@qq.com''' #发件人地址 subject = '广告数据日报_{}'.format(datetime.now().date()) password = 'password' #发件人邮箱密码 smtp_server = 'mail.**.com' #发件人邮箱smtp # 创建邮件对象 msg = MIMEMultipart() msg['From'] = _format_addr(from_name, from_addr) msg['To'] = _format_addr('To', to_addr) msg['Subject'] = Header(subject, 'utf-8').encode() xlsxpart = MIMEApplication(open(r'ad_daily_report{}.xlsx'.format(datetime.now().date()), 'rb').read()) xlsxpart.add_header('Content-Disposition', 'attachment', filename='ad_daily_report{}.xlsx'.format(datetime.now().date()))msg.attach(xlsxpart) msg.attach(xlsxpart)
server = smtplib.SMTP(smtp_server, 25) server.login(from_addr, password) server.sendmail(from_addr, to_addr.split(','), msg.as_string()) server.quit() print('发送成功!')
if __name__ == '__main__': DailyReport

2、新建shell脚本,以将python脚本的执行日志保存

将以下脚本保存为 daily_report.sh 文件,将其保存在与daily_report.py 文件同一目录下,比如/users/data目录下
#!/bin/sh
## 获取当前sh文件的绝对目录位置的上级目录,并创建log文件WK_DIR=$(realpath "$(cd "$(dirname "$0")" || return ; pwd)/..")SCRIPT_DIR=$WK_DIR/script #该目录下放置了该sh文件SRC_DIR=$WK_DIR/src #该目录下应放置py文件LOG_DIR=$WK_DIR/log #该目录下应放置log日志
echo $LOG_DIR
today=$(date +"%Y-%m-%d") now_time=$(date +"%Y-%m-%d %H:%M:%S")
## 检查日志目录是否存在,如果不存在则新建文件夹
if [ ! -d "$LOG_DIR/" ];then mkdir $LOG_DIRelse echo ">>> $now_time $LOG_DIR 已经存在!"fi
## 设置正常和错误日志文件目录,并将名称加上天后缀
log1=$LOG_DIR/log_$todaylog2=$LOG_DIR/log_$today
echo ">>> $now_time :开始执行python脚本!" >>$log1
## 设置python解释器 python_url="/data/common/anaconda3/bin/python3"

# 运行程序$python_url $SRC_DIR/daily.py >>$log1echo ">>> $now_time :执行结束!" >>$log1

3、使用crontab定时执行


crontab -e #进入终端进入crontab编辑界面* 9 * * * sh /data/script/daily_report.sh 1>/users/data/log1.log 2>/users/data/log2.log按下esc,输入qw! 退出编辑页面crontab -l #进入终端查看crontab命令是否保存成功


想了解更多数据知识,也欢迎阅读畅销书:《数据产品经理修炼手册:从零基础到大数据产品实践》这本书。


一个数据人的自留地
数据人交流和学习的社区,关注我们,掌握专业数据知识、结识更多的数据小伙伴。
 最新文章