有時候咱們寫了不少爬蟲在運行,可是咱們可能不會一直有時間來監控它的變化,好比報錯了,或者爬完了,若是咱們能有個通知來通知咱們,那該是多好啊!好比發個郵件,發個短信那是再好不過了,那麼本篇文章就介紹一下使用 Scrapy 怎樣來發送一封通知郵件。api
咱們的目的是能夠根據實際需求,在不一樣的時機發送不一樣的提醒郵件,以對爬蟲狀態進行監控。服務器
這裏我以監控爬蟲的中止信息來做爲示例。框架
Scrapy 官網文檔 有提供郵件發送的資料:scrapy
雖然 Python 經過 Smtplib 庫使得發送 Email 變得很簡單,Scrapy 仍然提供了本身的實現。 該功能十分易用,同時因爲採用了 Twisted 非阻塞式(non-blocking) IO ,其避免了對爬蟲的非阻塞式 IO 的影響。 另外,其也提供了簡單的 API 來發送附件。 經過一些 Settings 設置,您能夠很簡單的進行配置。ide
有兩種方法能夠建立郵件發送器(mail sender)。 您能夠經過標準構造器(constructor)建立:ui
from scrapy.mail import MailSender
mailer = MailSender()
或者您能夠傳遞一個 Scrapy 設置對象,其會參考 Settings:編碼
mailer = MailSender.from_settings(settings)
這是如何來發送郵件了(不包括附件):spa
mailer.send(to=["someone@example.com"], subject="Some subject", body="Some body", cc=["another@example.com"])
在 Scrapy 中發送 Email 推薦使用 MailSender。其同框架中其餘的部分同樣,使用了 Twisted 非阻塞式(non-blocking)IO 。翻譯
class scrapy.mail.MailSender(smtphost=None, mailfrom=None, smtpuser=None, smtppass=None, smtpport=None)
參數由如下組成:code
使用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類型
根據上面官網文檔的一些介紹和語法(更多語法請上官網翻閱)
這裏編寫一段示例代碼(結合爬蟲關閉信號)
登陸 QQ 郵箱 找到設置-帳戶
而後生成受權碼(之前是生成密碼,如今用受權碼)
在具體的爬蟲文件中編寫:
from scrapy.mail import MailSender
from scrapy.xlib.pydispatch import dispatcher
from scrapy import signals
接着在 Class 的上方編寫 Emial 的連接配置信息:
mailers = MailSender(
smtphost="smtp.qq.com", # 發送郵件的服務器
mailfrom="1499450062@qq.com", # 郵件發送者
smtpuser="1499450062@qq.com", # 用戶名
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={"admin@qq.com", "quinns@aliyun.com"}, subject=subject,
body=body)
這樣就會在收到爬蟲關閉信號的時候,經過 1499450062@qq.com 給指定的 admin@qq.com 和 quinns@aliyun.com 發送郵件,郵件內容是 body,郵件標題是 subject。
固然了,寫法不少,除了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={"admin@qq.com", "quinns@aliyun.com"}, subject=subject,
body=body)
只要知足觸發條件,就能夠發送指定內容的郵件。
這裏雖然只是以爬蟲關閉來舉例,實際上能夠監控更多的行爲操做,好比百度翻譯的接口超量、捕獲一些特殊的異常等。