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

1、需求

有時候咱們寫了不少爬蟲在運行,可是咱們可能不會一直有時間來監控它的變化,好比報錯了,或者爬完了,若是咱們能有個通知來通知咱們,那該是多好啊!好比發個郵件,發個短信那是再好不過了,那麼本篇文章就介紹一下使用 Scrapy 怎樣來發送一封通知郵件。api

咱們的目的是能夠根據實際需求,在不一樣的時機發送不一樣的提醒郵件,以對爬蟲狀態進行監控。服務器

這裏我以監控爬蟲的中止信息來做爲示例。框架

2、Scrapy文檔

Scrapy 官網文檔 有提供郵件發送的資料:scrapy

發送 Email

雖然 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"])

MailSender 類參考手冊

在 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類型

3、實際寫法

根據上面官網文檔的一些介紹和語法(更多語法請上官網翻閱)

這裏編寫一段示例代碼(結合爬蟲關閉信號)

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="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。

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={"admin@qq.com""quinns@aliyun.com"}, subject=subject,
                    body=body)

只要知足觸發條件,就能夠發送指定內容的郵件。

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

相關文章
相關標籤/搜索