“
閱讀本文大概需要 4 分鐘。
”
一、需求
有時候我們寫了很多爬蟲在運行,但是我們可能不會一直有時間來監控它的變化,比如報錯了,或者爬完了,如果我們能有個通知來通知我們,那該是多好啊!比如發個郵件,發個短信那是再好不過了,那麼本篇文章就介紹一下使用 Scrapy 怎樣來發送一封通知郵件。
我們的目的是可以根據實際需求,在不同的時機發送不同的提醒郵件,以對爬蟲狀態進行監控。
這裏我以監控爬蟲的停止信息來作爲示例。
二、Scrapy文檔
Scrapy 官網文檔 有提供郵件發送的資料:
發送 Email
雖然 Python 通過 Smtplib 庫使得發送 Email 變得很簡單,Scrapy 仍然提供了自己的實現。 該功能十分易用,同時由於採用了 Twisted 非阻塞式(non-blocking) IO ,其避免了對爬蟲的非阻塞式 IO 的影響。 另外,其也提供了簡單的 API 來發送附件。 通過一些 Settings 設置,您可以很簡單的進行配置。
簡單例子
有兩種方法可以創建郵件發送器(mail sender)。 您可以通過標準構造器(constructor)創建:
from scrapy.mail import MailSender mailer = MailSender()
或者您可以傳遞一個 Scrapy 設置對象,其會參考 Settings:
mailer = MailSender.from_settings(settings)
這是如何來發送郵件了(不包括附件):
mailer.send(to=["[email protected]"], subject="Some subject", body="Some body", cc=["[email protected]"])
MailSender 類參考手冊
在 Scrapy 中發送 Email 推薦使用 MailSender。其同框架中其他的部分一樣,使用了 Twisted 非阻塞式(non-blocking)IO 。
class scrapy.mail.MailSender(smtphost=None, mailfrom=None, smtpuser=None, smtppass=None, smtpport=None)
參數由以下組成:
smtphost (str) – 發送email的SMTP主機(host)。如果忽略,則使用 MAIL_HOST 。 mailfrom (str) – 用於發送email的地址(address)(填入 From:) 。 如果忽略,則使用 MAIL_FROM 。 smtpuser – SMTP用戶。如果忽略,則使用 MAIL_USER 。 如果未給定,則將不會進行SMTP認證(authentication)。 smtppass (str) – SMTP認證的密碼 smtpport (int) – SMTP連接的端口 smtptls – 強制使用STARTTLS smtpssl (boolean) – 強制使用SSL連接 使用Scrapy設置對象來初始化對象。其會參考 這些Scrapy設置.
參數: settings (scrapy.settings.Settings object) – the e-mail recipients
send(to, subject, body, cc=None, attachs=(), mimetype='text/plain') 發送email到給定的接收者。 參數: to (list) – email接收者 subject (str) – email內容 cc (list) – 抄送的人 body (str) – email的內容 attachs (iterable) – 可迭代的元組 (attach_name, mimetype, file_object)。 attach_name 是一個在email的附件中顯示的名字的字符串, mimetype 是附件的mime類型, file_object 是包含附件內容的可讀的文件對象。 mimetype (str) – email的mime類型
三、實際寫法
根據上面官網文檔的一些介紹和語法(更多語法請上官網翻閱)
這裏編寫一段示例代碼(結合爬蟲關閉信號)
3.1 設置郵箱pop
登錄 QQ 郵箱 找到設置-賬戶
然後生成授權碼(以前是生成密碼,現在用授權碼)
3.2 編碼
在具體的爬蟲文件中編寫:
from scrapy.mail import MailSender from scrapy.xlib.pydispatch import dispatcher from scrapy import signals
接着在 Class 的上方編寫 Emial 的鏈接配置信息:
mailers = MailSender( smtphost="smtp.qq.com", # 發送郵件的服務器 mailfrom="[email protected]", # 郵件發送者 smtpuser="[email protected]", # 用戶名 smtppass="qtpzvxxyyxxyyxxyyxde", # 發送郵箱的密碼不是你註冊時的密碼,而是授權碼!!!切記! smtpport=25 # 端口號 ) # 初始化郵件模塊
然後再到 Class 中編寫信號量監聽和具體的郵件發送代碼:
def __init__(self): """ 監聽信號量 """ super(YoutubeapiSpider, self).__init__() # 當收到spider_closed信號的時候,調用下面的close方法來發送通知郵件 dispatcher.connect(self.close, signals.spider_closed) def close(spider, reason): """ 執行郵件發送操作 """ body = "爬蟲[%s]已經關閉,原因是: %s" % (spider.name, reason) subject = "[%s]爬蟲關閉提醒" % spider.name mailers.send(to={"[email protected]", "[email protected]"}, subject=subject, body=body)
這樣就會在收到爬蟲關閉信號的時候,通過 [email protected] 給指定的 [email protected] 和 [email protected] 發送郵件,郵件內容是 body,郵件標題是 subject。
3.3 另一種寫法
當然了,寫法很多,除了def cloase 還可以:
def __init__(self): """ 監聽信號量 """ super(YoutubeapiSpider, self).__init__() # 當收到spider_closed信號的時候,調用下面的close方法來發送通知郵件 dispatcher.connect(self.spider_closed, signals.spider_closed) def spider_closed(self, spider): # 當爬蟲推出的時候發送郵件 body = "爬蟲已經關閉,原因是" subject = "爬蟲關閉提醒" mailers.send(to={"[email protected]", "[email protected]"}, subject=subject, body=body)
只要滿足觸發條件,就可以發送指定內容的郵件。
這裏雖然只是以爬蟲關閉來舉例,實際上可以監控更多的行爲操作,比如百度翻譯的接口超量、捕獲一些特殊的異常等。