爬蟲又報錯了?用 Scrapy 來一發郵件不就好了!

閱讀本文大概需要 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)

只要滿足觸發條件,就可以發送指定內容的郵件。

這裏雖然只是以爬蟲關閉來舉例,實際上可以監控更多的行爲操作,比如百度翻譯的接口超量、捕獲一些特殊的異常等。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章