標籤:

Python 實現網頁截屏、查庫、發郵件

本文介紹了使用 Python(2.7版本)實現網頁截屏、查庫、發郵件的 demo。用到了 selenium、phantomjs、mailer、jinja2、mysqldb 還有 image,都是比較典型的用法,可復用性比較強,記錄一下。

代碼

本 demo 是用於發周報郵件的,周報內容包括資料庫中的記錄以及網頁指定元素的截屏。linux 中可以用 crontab 每周定時發送。需要發類似周報的同學這下輕鬆了!

直接上代碼,使用 Python2.7 版本,關於第三方模塊的安裝,都很簡單,這裡就不贅述了。

其中相關資料庫參數、郵件參數、網址等真實數據都已做處理掉,提醒加大學習的時候注意替換補全。

#!/usr/bin/pythonn# -*-coding:utf-8 -*-n# Author: lvsnnimport MySQLdb.cursorsnimport datetimenfrom mailer import Mailernfrom mailer import Messagenfrom jinja2 import Environment, PackageLoadernfrom selenium import webdrivernfrom PIL import Imagenfrom time import sleepnndef fetch_results():n today = datetime.datetime.today()n seven_day_ago = today - datetime.timedelta(days=7)nn today_str = today.strftime(%Y-%m-%d)n seven_day_ago_str = seven_day_ago.strftime(%Y-%m-%d)nn db = MySQLdb.connect(host=127.0.0.1, port=3306, user=test, passwd=test, db=test,n charset=utf8, cursorclass=MySQLdb.cursors.DictCursor)n cursor = db.cursor()n sql = "SELECT * FROM test.test WHERE start_time < {today} and start_time >= {seven_day_ago}".format(n today=today_str, seven_day_ago=seven_day_ago_str)n cursor.execute(sql)n results = cursor.fetchall()n db.close()n return resultsnndef screen_shot(event_id):n driver = webdriver.PhantomJS(executable_path=/usr/local/phantomjs-2.1.1-linux-x86_64/bin/phantomjs)n driver.set_page_load_timeout(5)n driver.set_window_size(1920, 1080)nn url = http://test.com/detail?id={}.format(event_id)n driver.get(url)n sleep(3)nn img_path = /home/lvs/image/event_{}.png.format(event_id)n driver.save_screenshot(img_path)nn element = driver.find_element_by_id(main)n left = int(element.location[x])n top = int(element.location[y])n right = int(element.location[x] + element.size[width])n bottom = int(element.location[y] + element.size[height])n driver.quit()nn im = Image.open(img_path)n im = im.crop((left, top, right, bottom))n im.save(img_path)nndef send_mail(results):n env = Environment(loader=PackageLoader(jinja, templates))n template = env.get_template(mail.html)nn message = Message(From=test@123.com, To=test@123.com, charset=utf-8)n message.Subject = 這是郵件主題n message.Html = template.render(results=results)n for r in results:n #指定cid參數將嵌入郵件html內容發送,不指定將作為附件發送n message.attach(/home/lvs/image/event_{}.png.format(r[id]), cid=r[id])n message.attach(/home/lvs/image/event_{}.png.format(r[id]))nn sender = Mailer(test.smtp.com)n sender.send(message)nnif __name__ == __main__:n data = fetch_results()n for row in data:n screen_shot(row[id])n send_mail(data)n

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 內容如下:

<!DOCTYPE html>n<html>n<head>n <meta charset="utf-8">n <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">n <style>n .myimg img {n max-width: 400px;n max-height: 200px;n }n </style>n</head>n<body>n<div>n <div>n <div>n <p>最近一周事件記錄:</p>n </div>n <div>n <table stylex="margin: 10px auto; border-collapse:collapse;" border="1" bordercolor="#a0c6e5">n <tr>n <th>事件名稱</th>n <th>事件類型</th>n <th>開始時間</th>n <th>結束時間</th>n <th>事件地點</th>n <th>事件描述</th>n <th>事件詳情</th>n </tr>n {% for row in results %}n <tr>n <td>{{row["name"]}}</td>n <td>{{row["type"]}}</td>n <td>{{row["start_time"]}}</td>n <td>{{row["end_time"]}}</td>n <td>{{row["place"]}}</td>n <td>{{row["description"]}}</td>n <td class="myimg"><img src="cid:{{row[id]}}"></td>n </tr>n {% endfor %}n </table>n </div>n </div>n</div>n</body>n</html>n

jinja 變數 row 為字典類型,對應資料庫一條記錄,索引都是表欄位名,注意替換。

每行最後一列都是來自網頁截屏的圖片,一定要注意此處在 img 標籤的 src 屬性中用 cid 引入,否則原始 img 標籤的引入方式是不生效的!

作者: Lvs

原文鏈接: hellolvs.com/selenium/

推薦閱讀:

Python 編碼習慣(Coding Conventions)
Python從零開始系列連載(1)——安裝環境
什麼是Python Descriptors
python3.6.0安裝pysider報錯

TAG:Python |