python自动截图发送邮件_python实现网页截屏、查库、发邮件(selenium、phantomjs、mailer、jinja2、mysqldb)...-程序员宅基地

技术标签: python自动截图发送邮件  

使用python(2.7)实现网页截屏、查库、发邮件的demo。用到了selenium、phantomjs、mailer、jinja2、mysqldb还有image,都是比较典型的用法,可复用性比较强,记录分享一下。

本demo是用于发周报邮件的,周报内容包括数据库中的记录以及网页指定元素的截屏。linux中可以用crontab每周定时发送。需要发类似周报的同学这下轻松了!

代码

直接看代码吧,用的python2.7,关于第三方模块的安装,都很简单,这里就不赘述了。

其中相关数据库参数、邮件参数、网址等真实数据都处理掉了,自己注意替换补全。

#!/usr/bin/python

# -*-coding:utf-8 -*-

# Author: lvs

import MySQLdb.cursors

import datetime

from mailer import Mailer

from mailer import Message

from jinja2 import Environment, PackageLoader

from selenium import webdriver

from PIL import Image

from time import sleep

def fetch_results():

today = datetime.datetime.today()

seven_day_ago = today - datetime.timedelta(days=7)

today_str = today.strftime('%Y-%m-%d')

seven_day_ago_str = seven_day_ago.strftime('%Y-%m-%d')

db = MySQLdb.connect(host='127.0.0.1', port=3306, user='test', passwd='test', db='test',

charset='utf8', cursorclass=MySQLdb.cursors.DictCursor)

cursor = db.cursor()

sql = "SELECT * FROM test.test WHERE start_time < '{today}' and start_time >= '{seven_day_ago}'".format(

today=today_str, seven_day_ago=seven_day_ago_str)

cursor.execute(sql)

results = cursor.fetchall()

db.close()

return results

def screen_shot(event_id):

driver = webdriver.PhantomJS(executable_path='/usr/local/phantomjs-2.1.1-linux-x86_64/bin/phantomjs')

driver.set_page_load_timeout(5)

driver.set_window_size('1920', '1080')

url = 'http://test.com/detail?id={}'.format(event_id)

driver.get(url)

sleep(3)

img_path = '/home/lvs/image/event_{}.png'.format(event_id)

driver.save_screenshot(img_path)

element = driver.find_element_by_id('main')

left = int(element.location['x'])

top = int(element.location['y'])

right = int(element.location['x'] + element.size['width'])

bottom = int(element.location['y'] + element.size['height'])

driver.quit()

im = Image.open(img_path)

im = im.crop((left, top, right, bottom))

im.save(img_path)

def send_mail(results):

env = Environment(loader=PackageLoader('jinja', 'templates'))

template = env.get_template('mail.html')

message = Message(From='[email protected]', To='[email protected]', charset='utf-8')

message.Subject = '这是邮件主题'

message.Html = template.render(results=results)

for r in results:

#指定cid参数将嵌入邮件html内容发送,不指定将作为附件发送

message.attach('/home/lvs/image/event_{}.png'.format(r['id']), cid=r['id'])

message.attach('/home/lvs/image/event_{}.png'.format(r['id']))

sender = Mailer('test.smtp.com')

sender.send(message)

if __name__ == '__main__':

data = fetch_results()

for row in data:

screen_shot(row['id'])

send_mail(data)

fetch_results()读库,返回结果,没啥好说的。

screen_shot(event_id)用于网页截屏,event_id用于传递url参数。使用selenium+phantomjs实现,都是python爬虫很典型的工具。注意其中使用Image截取DOM中id为main的元素的操作。截取后保存到本地。

send_mail(results)自然是发邮件,利用了mailer和jinja2模板,其中env = Environment(loader=PackageLoader('jinja', 'templates'))这一句是jinja2加载模板的代码,模板位于与此py脚本文件同目录的jinja包下templates目录下的mail.html中。可以看下在mail中嵌入图片和作为附件发送的操作。

mail.html内容如下:

.myimg img {

max-width: 400px;

max-height: 200px;

}

最近一周事件记录:

事件名称 事件类型 开始时间 结束时间 事件地点 事件描述 事件详情

{% for row in results %}

{ {row["name"]}}{ {row["type"]}}{ {row["start_time"]}}{ {row["end_time"]}}{ {row["place"]}}{ {row["description"]}}

{% endfor %}

jinja变量row为字典类型,对应数据库一条记录,索引都是表字段名,注意替换。

每行最后一列是来自网页截屏的图片,一定要注意此处在img标签的src属性中用cid引入,否则原始img标签的引入方式是不生效的!

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_39863631/article/details/111018023

智能推荐

Labview队列使用方法----一文读懂队列底层原理及用法-程序员宅基地

文章浏览阅读2.3k次,点赞35次,收藏41次。题主非常详细的介绍了队列的原理及使用方法,帮助读者在原理上深刻理解队列的底层逻辑,并介绍了队列使用时的注意事项。后续将更新更多相关文章记得点赞加关注,谢谢~_labview队列

教你用Python爬取哔哩哔哩全站视频信息_b站访问权限不足爬虫-程序员宅基地

文章浏览阅读1.8k次。哔哩哔哩全站视频信息爬虫(可能会漏爬)B 站感觉最近几年发展得太快了,不由得想知道有多少视频,翻阅了一大半网络找了很多爬虫感觉都不是特别的复合自己的胃口(挑食~),于是自己写一个(才学习爬虫没多久写得垃圾代码大佬别喷我啊….)很多人学习python,不知道从何学起。很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手。很多已经做案例的人,却不知道如何去学习更加高深的知识。那么针对这三类人,我给大家提供一个好的学习平台,免费领取视频教程,电子书籍,以及课程的源代码!??¤QQ群_b站访问权限不足爬虫

(新版)SJTU-OJ-1003. 在麦当劳配数据-程序员宅基地

文章浏览阅读431次,点赞4次,收藏2次。题目描述注意:本题可以使用的头文件仅限于cstdioiostreamcstring梦回高三,小艾想起了几个月前背诵高考古诗文篇目的时光……已经是晚上了。第二天有小测,可是小艾还有篇古诗文没有背。这篇古诗文都有一个对应的瞌睡值,也就是说,选择背诵篇目会让小艾的瞌睡程度增加​。小艾目前的瞌睡程度已经是,而当小艾的瞌睡程度时,小艾会直接睡到明早,那可就没有更多的时间背了!注意,因为背了一半的文章也是没背出来的文章,所以恰好让小艾瞌睡程度的那篇也视作没背的。好在小测考到每个篇目的概率是一..._在麦当劳配数据

ubuntu16安装colmap的问题及解决方案_cudasetupargument 未定义的引用-程序员宅基地

文章浏览阅读2.3k次,点赞14次,收藏28次。最近想入门一下三维重建,看了一些三维重建的论文,还是想从SFM入手。先了解一下SFM里面经典的colmap(论文:[Structure-from-Motion Revisited](https://demuc.de/papers/schoenberger2016sfm.pdf)),看论文难以深入理解,所以打算看看源码,也是为了完成一个小小礼物。_cudasetupargument 未定义的引用

windows使用libvlc进行网络串流遇到的一些问题及解决方法_libvlc网络-程序员宅基地

文章浏览阅读857次。windows使用libvlc进行网络串流遇到的一些问题及解决方法_libvlc网络

ffmpeg--libswscale(图像缩放、颜色空间和像素格式转换操作)-程序员宅基地

文章浏览阅读1k次。主要函数:(1) sws_getContext():使用参数初始化SwsContext结构体。 可以用另一个接口函数sws_getCachedContext()取代。(2) sws_scale():转换一帧图像。(3) sws_freeContext():释放SwsContext结构体。初始化方式2种:①sws_getContext②sws_al..._libswscale

随便推点

CyclicBarrier和CountDownLatch的区别_countdownlatch是一次性的,cyclicbarrier可以重用。-程序员宅基地

文章浏览阅读90次。CountDownLatch减计数,CyclicBarrier加计数。 CountDownLatch是一次性的,CyclicBarrier可以重用。 CountDownLatch强调一个线程或者多个线程等待其他线程执行完毕后执行、CyclicBarrier强调的是多个线程相互等待执行完毕..._countdownlatch是一次性的,cyclicbarrier可以重用。

coco2017数据集百度网盘链接_coco百度网盘-程序员宅基地

文章浏览阅读8.1k次,点赞28次,收藏22次。coco2017数据集百度网盘链接链接:https://pan.baidu.com/s/1NTdU1-h2b5r2Hwc9DiwPig提取码:fwou_coco百度网盘

IDEA配置tomcat时出现的问题及解决(HTTP状态404-未找到)_运行ideahttp状态 404 - 未找到-程序员宅基地

文章浏览阅读2.1w次,点赞8次,收藏75次。IDEA配置tomcat出现的问题及解决问题1:没有新建环境变量解决:在系统环境变量中添加变量CATALINA_BASE和CATALINA_BASE,两个变量的值都是tomcat的安装路径(如下图所示)问题2:tomcat设置depolyment有误解决:添加的Artifact是“项目名:war_exploded”而不是“项目名:war”。特别注意的是:Application context中要改成“/”(如下图所示)一开始的样子:成功后:..._运行ideahttp状态 404 - 未找到

J2EE快速开发平台-程序员宅基地

文章浏览阅读48次。2019独角兽企业重金招聘Python工程师标准>>> ..._j2ee开放平台

Docker快速搭建Jaeger开发环境(Docker 部署Jaeger all-in-one)_docker 部署jaeger 部署-程序员宅基地

文章浏览阅读6.4k次。通过Docker 快速搭建Jaeger 本地测试、开发联调环境。_docker 部署jaeger 部署

推荐文章

热门文章

相关标签