摘要:使用實(shí)現(xiàn)網(wǎng)頁截屏查庫發(fā)郵件的。本是用于發(fā)周報(bào)郵件的,周報(bào)內(nèi)容包括數(shù)據(jù)庫中的記錄以及網(wǎng)頁指定元素的截屏。用于網(wǎng)頁截屏,用于傳遞參數(shù)。注意其中使用截取中為的元素的操作。
使用python(2.7)實(shí)現(xiàn)網(wǎng)頁截屏、查庫、發(fā)郵件的demo。用到了selenium、phantomjs、mailer、jinja2、mysqldb還有image,都是比較典型的用法,可復(fù)用性比較強(qiáng),記錄分享一下。
本demo是用于發(fā)周報(bào)郵件的,周報(bào)內(nèi)容包括數(shù)據(jù)庫中的記錄以及網(wǎng)頁指定元素的截屏。linux中可以用crontab每周定時(shí)發(fā)送。需要發(fā)類似周報(bào)的同學(xué)這下輕松了!
代碼直接看代碼吧,用的python2.7,關(guān)于第三方模塊的安裝,都很簡單,這里就不贅述了。
其中相關(guān)數(shù)據(jù)庫參數(shù)、郵件參數(shù)、網(wǎng)址等真實(shí)數(shù)據(jù)都處理掉了,自己注意替換補(bǔ)全。
#!/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參數(shù)將嵌入郵件html內(nèi)容發(fā)送,不指定將作為附件發(fā)送 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()讀庫,返回結(jié)果,沒啥好說的。
screen_shot(event_id)用于網(wǎng)頁截屏,event_id用于傳遞url參數(shù)。使用selenium+phantomjs實(shí)現(xiàn),都是python爬蟲很典型的工具。注意其中使用Image截取DOM中id為main的元素的操作。截取后保存到本地。
send_mail(results)自然是發(fā)郵件,利用了mailer和jinja2模板,其中env = Environment(loader=PackageLoader("jinja", "templates"))這一句是jinja2加載模板的代碼,模板位于與此py腳本文件同目錄的jinja包下templates目錄下的mail.html中。可以看下在mail中嵌入圖片和作為附件發(fā)送的操作。
mail.html內(nèi)容如下:
最近一周事件記錄:
{% for row in results %} 事件名稱 事件類型 開始時(shí)間 結(jié)束時(shí)間 事件地點(diǎn) 事件描述 事件詳情 {% endfor %} {{row["name"]}} {{row["type"]}} {{row["start_time"]}} {{row["end_time"]}} {{row["place"]}} {{row["description"]}}
jinja變量row為字典類型,對應(yīng)數(shù)據(jù)庫一條記錄,索引都是表字段名,注意替換。
每行最后一列是來自網(wǎng)頁截屏的圖片,一定要注意此處在img標(biāo)簽的src屬性中用cid引入,否則原始img標(biāo)簽的引入方式是不生效的!
個(gè)人博客:www.hellolvs.com
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/41125.html
摘要:項(xiàng)目簡介本實(shí)驗(yàn)通過使用實(shí)現(xiàn)一個(gè)淘寶女郎圖片收集爬蟲,學(xué)習(xí)并實(shí)踐及正則表達(dá)式等知識。本教程由阿發(fā)布在實(shí)驗(yàn)樓,完整教程及在線練習(xí)地址實(shí)現(xiàn)淘女郎照片爬蟲,可以直接在教程中下載代碼使用。 showImg(https://segmentfault.com/img/bVBgrF); 項(xiàng)目簡介:本實(shí)驗(yàn)通過使用 Python 實(shí)現(xiàn)一個(gè)淘寶女郎圖片收集爬蟲,學(xué)習(xí)并實(shí)踐 BeautifulSoup、Sel...
摘要:一個(gè)網(wǎng)站使用的特征就是源代碼里包含了入口比如如果你在一個(gè)網(wǎng)站上看到了,那么采集這個(gè)網(wǎng)站數(shù)據(jù)的時(shí)候要格外小心。直接點(diǎn)擊下拉框中的選項(xiàng)不一定可行。未審核初審?fù)ㄟ^復(fù)審?fù)ㄟ^審核不通過專門提供了類來處理下拉框。 JavaScript JavaScript 是網(wǎng)絡(luò)上最常用也是支持者最多的客戶端腳本語言。它可以收集 用戶的跟蹤數(shù)據(jù),不需要重載頁面直接提交表單,在頁面嵌入多媒體文件,甚至運(yùn)行網(wǎng)頁游戲。...
摘要:當(dāng)前版本是一個(gè)服務(wù)器端的的。也可以說是無界面瀏覽器。安裝不是程序,去官網(wǎng)下載對應(yīng)系統(tǒng)版本的安裝即可。方法會(huì)一直等到頁面被完全加載,然后才會(huì)繼續(xù)程序,但是對于是無可奈何的。安裝設(shè)置的查看所有可用的屬性。 selenium:https://github.com/SeleniumHQ...當(dāng)前版本3.0.1A browser automation framework and ecosyste...
摘要:編碼我們發(fā)現(xiàn),中有時(shí)候存在中文,這是就需要對進(jìn)行編碼。可以先將中文轉(zhuǎn)換成編碼,然后使用方法對參數(shù)進(jìn)行編碼后傳遞。 本文檔對日常學(xué)習(xí)中用 python 做數(shù)據(jù)爬取時(shí)所遇到的一些問題做簡要記錄,以便日后查閱,部分問題可能因?yàn)檎J(rèn)識不到位會(huì)存在一些誤解,敬請告知,萬分感謝,共同進(jìn)步。 估算網(wǎng)站規(guī)模 該小節(jié)主要針對于整站爬取的情況。爬取整站之前,肯定是要先對一個(gè)網(wǎng)站的規(guī)模進(jìn)行估計(jì)。這是可以使用g...
摘要:百度云搜索,搜各種資料搜網(wǎng)盤,搜各種資料虛擬瀏覽器是一個(gè)基于的內(nèi)核無頭瀏覽器也就是沒有顯示界面的瀏覽器,利用這個(gè)軟件,可以獲取到網(wǎng)址加載的任何信息,也就是可以獲取瀏覽器異步加載的信息下載網(wǎng)址下載對應(yīng)系統(tǒng)版本下載后解壓文件,將解壓文件夾,剪切 【百度云搜索,搜各種資料:http://www.bdyss.cn】 【搜網(wǎng)盤,搜各種資料:http://www.swpan.cn】 Phantom...
閱讀 472·2021-11-22 12:05
閱讀 1533·2021-11-17 09:33
閱讀 3579·2021-11-11 16:54
閱讀 2659·2021-10-14 09:49
閱讀 4024·2021-09-06 15:01
閱讀 1821·2019-08-29 17:23
閱讀 693·2019-08-29 14:09
閱讀 712·2019-08-29 12:28