资讯专栏INFORMATION COLUMN

python实现网页截屏、查库、发邮件(selenium、phantomjs、mailer、jinj

李文鹏 / 1224人阅读

摘要:使用实现网页截屏查库发邮件的。本是用于发周报邮件的,周报内容包括数据库中的记录以及网页指定元素的截屏。用于网页截屏,用于传递参数。注意其中使用截取中为的元素的操作。

使用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="test@123.com", To="test@123.com", 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内容如下:




    
    
    



最近一周事件记录:

{% for row in results %} {% endfor %}
事件名称 事件类型 开始时间 结束时间 事件地点 事件描述 事件详情
{{row["name"]}} {{row["type"]}} {{row["start_time"]}} {{row["end_time"]}} {{row["place"]}} {{row["description"]}}

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

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

个人博客:www.hellolvs.com

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/41125.html

相关文章

  • Python3 实现淘女郎照片爬虫

    摘要:项目简介本实验通过使用实现一个淘宝女郎图片收集爬虫,学习并实践及正则表达式等知识。本教程由阿发布在实验楼,完整教程及在线练习地址实现淘女郎照片爬虫,可以直接在教程中下载代码使用。 showImg(https://segmentfault.com/img/bVBgrF); 项目简介:本实验通过使用 Python 实现一个淘宝女郎图片收集爬虫,学习并实践 BeautifulSoup、Sel...

    jindong 评论0 收藏0
  • 动态HTML介绍 & Selenium PhantomJS

    摘要:一个网站使用的特征就是源代码里包含了入口比如如果你在一个网站上看到了,那么采集这个网站数据的时候要格外小心。直接点击下拉框中的选项不一定可行。未审核初审通过复审通过审核不通过专门提供了类来处理下拉框。 JavaScript JavaScript 是网络上最常用也是支持者最多的客户端脚本语言。它可以收集 用户的跟踪数据,不需要重载页面直接提交表单,在页面嵌入多媒体文件,甚至运行网页游戏。...

    Lsnsh 评论0 收藏0
  • Python_selenium_phantomjs动态抓取

    摘要:当前版本是一个服务器端的的。也可以说是无界面浏览器。安装不是程序,去官网下载对应系统版本的安装即可。方法会一直等到页面被完全加载,然后才会继续程序,但是对于是无可奈何的。安装设置的查看所有可用的属性。 selenium:https://github.com/SeleniumHQ...当前版本3.0.1A browser automation framework and ecosyste...

    zacklee 评论0 收藏0
  • 爬虫问题总结

    摘要:编码我们发现,中有时候存在中文,这是就需要对进行编码。可以先将中文转换成编码,然后使用方法对参数进行编码后传递。 本文档对日常学习中用 python 做数据爬取时所遇到的一些问题做简要记录,以便日后查阅,部分问题可能因为认识不到位会存在一些误解,敬请告知,万分感谢,共同进步。 估算网站规模 该小节主要针对于整站爬取的情况。爬取整站之前,肯定是要先对一个网站的规模进行估计。这是可以使用g...

    nanfeiyan 评论0 收藏0
  • 16、web爬虫讲解2—PhantomJS虚拟浏览器+selenium模块操作PhantomJS

    摘要:百度云搜索,搜各种资料搜网盘,搜各种资料虚拟浏览器是一个基于的内核无头浏览器也就是没有显示界面的浏览器,利用这个软件,可以获取到网址加载的任何信息,也就是可以获取浏览器异步加载的信息下载网址下载对应系统版本下载后解压文件,将解压文件夹,剪切 【百度云搜索,搜各种资料:http://www.bdyss.cn】 【搜网盘,搜各种资料:http://www.swpan.cn】 Phantom...

    xietao3 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<