我想監(jiān)控爬蟲狀況怎么辦?Scrapy郵件發(fā)送功能及爬蟲停止信息 。

一、需求

郵件發(fā)送功能,作為一個【通知】或者說【知曉】的方式,在實際應(yīng)用中會經(jīng)常使用的,試想一個場景:

你掌握著公司半數(shù)以上的爬蟲,并且你每天都要監(jiān)控它們(他們在服務(wù)器上),你作為一個爬蟲技術(shù)從業(yè)者,你肯定會想(偷懶),因為不偷懶的工程師不會進步。你希望當(dāng)它們觸發(fā)某個狀況的時候,你的郵箱會收到對應(yīng)的提醒,這樣你可以及時的處理這些狀況,當(dāng)然你也可以集成微信來開發(fā),讓通知發(fā)送到你的微信,但是互聯(lián)網(wǎng)行業(yè),郵箱還是經(jīng)常用的。

可以根據(jù)實際需求,在不同的時機發(fā)送不同的提醒郵件,以對爬蟲狀態(tài)進行監(jiān)控。

這里我以監(jiān)控爬蟲的停止信息來作為示例。

timg (1).jpg

二、scrapy文檔

scrapy官網(wǎng)文檔有提供郵件發(fā)送的資料:

發(fā)送email

雖然Python通過 smtplib 庫使得發(fā)送email變得很簡單,Scrapy仍然提供了自己的實現(xiàn)。 該功能十分易用,同時由于采用了 Twisted非阻塞式(non-blocking)IO ,其避免了對爬蟲的非阻塞式IO的影響。 另外,其也提供了簡單的API來發(fā)送附件。 通過一些 settings 設(shè)置,您可以很簡單的進行配置。

簡單例子

有兩種方法可以創(chuàng)建郵件發(fā)送器(mail sender)。 您可以通過標準構(gòu)造器(constructor)創(chuàng)建:

fromscrapy.mailimportMailSendermailer = MailSender()

或者您可以傳遞一個Scrapy設(shè)置對象,其會參考 settings:

mailer= MailSender.from_settings(settings)

這是如何來發(fā)送郵件(不包括附件):

mailer.send(to=["someone@example.com"], subject="Some subject", body="Some body", cc=["another@example.com"])

MailSender類參考手冊

在Scrapy中發(fā)送email推薦使用MailSender。其同框架中其他的部分一樣,使用了 Twisted非阻塞式(non-blocking)IO 。

classscrapy.mail.MailSender(smtphost=None, mailfrom=None, smtpuser=None, smtppass=None, smtpport=None)

參數(shù)由以下組成:

smtphost (str) – 發(fā)送email的SMTP主機(host)。如果忽略,則使用 MAIL_HOST 。
  mailfrom (str) – 用于發(fā)送email的地址(address)(填入 From:) 。 如果忽略,則使用 MAIL_FROM 。
  smtpuser – SMTP用戶。如果忽略,則使用 MAIL_USER 。 如果未給定,則將不會進行SMTP認證(authentication)。
  smtppass (str) – SMTP認證的密碼      
  smtpport (int) – SMTP連接的端口     
  smtptls – 強制使用STARTTLS
  smtpssl(boolean)– 強制使用SSL連接

classmethodfrom_settings(settings)

使用Scrapy設(shè)置對象來初始化對象。其會參考 這些Scrapy設(shè)置.

參數(shù): settings (scrapy.settings.Settings object) – the e-mail recipients

send(to, subject, body, cc=None, attachs=(), mimetype='text/plain')

發(fā)送email到給定的接收者。 參數(shù):

to (list) – email接收者
subject (str) – email內(nèi)容
cc (list) – 抄送的人
body (str) – email的內(nèi)容
attachs (iterable) – 可迭代的元組 (attach_name, mimetype, file_object)。 attach_name 是一個在email
  的附件中顯示的名字的字符串, mimetype 是附件的mime類型, file_object 是包含附件內(nèi)容的可讀的文件對象。
mimetype (str) – email的mime類型

三、實際寫法

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

這里編寫一段示例代碼(結(jié)合信號量)

3.1 設(shè)置郵箱pop

登錄QQ郵箱 找到設(shè)置-賬戶

然后生成授權(quán)碼(以前是生成密碼,現(xiàn)在用授權(quán)碼)

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",  # 發(fā)送郵件的服務(wù)器    
mailfrom="abcdefg@qq.com",  # 郵件發(fā)送者
smtpuser="abcdefg@qq.com",  # 用戶名
smtppass="qtpzvxxyyxxyyxxyyxde",  # 發(fā)送郵箱的密碼不是你注冊時的密碼,而是授權(quán)碼?。?!切記!
smtpport=25 # 端口號
)  #初始化郵件模塊

然后再到class類中編寫信號量監(jiān)聽和具體的郵件發(fā)送代碼:

 def  __init__(self):
    """ 監(jiān)聽信號量 """
    super(YoutubeapiSpider, self).__init__()
    # 當(dāng)收到spider_closed信號的時候,調(diào)用下面的close方法來發(fā)送通知郵件    
    dispatcher.connect(self.close, signals.spider_closed)

 def  close(spider, reason):
   """ 執(zhí)行郵件發(fā)送操作 """
  body ="爬蟲[%s]已經(jīng)關(guān)閉,原因是: %s"% (spider.name, reason)        
  subject ="[%s]爬蟲關(guān)閉提醒"% spider.name        
  mailers.send(to={"admin@qq.com","quinns@aliyun.com"}, 
  subject=subject,                   
  body=body)

這樣就會在收到爬蟲關(guān)閉信號的時候,通過abgdefg@qq.com給指定的admin@qq.comquinns@aliyun.com發(fā)送郵件(實際應(yīng)用的時候可以考慮給1個或多個郵箱發(fā)送),郵件內(nèi)容是body,郵件標題是subject。

3.3 在郵件里添加爬蟲停止信息

畢竟停止信息里面對爬蟲狀態(tài)和記錄比較詳細,所以郵件中應(yīng)當(dāng)發(fā)送停止信息。

當(dāng)然了,寫法很多,除了def close 還可以:

def __init__(self):
  """ 監(jiān)聽信號量 """
  super(YoutubeapiSpider, self).__init__()# 當(dāng)收到spider_closed信號的時候,調(diào)用下面的close方法來發(fā)送通知郵件
  dispatcher.connect(self.spider_closed, signals.spider_closed)
def spider_closed(self, spider, reason):
      # 上方的信號量觸發(fā)這個方法
      stats_info = self.crawler.stats._stats  # 爬蟲結(jié)束時控制臺信息
      body = "爬蟲[%s]已經(jīng)關(guān)閉,原因是: %s.\n以下為運行信息:\n %s" % (spider.name, reason, stats_info)
      subject = "[%s]爬蟲關(guān)閉提醒" % spider.name
      mailers.send(to={"513720453@qq.com"},
                   subject=subject,
                   body=body)

只要滿足觸發(fā)條件,就可以發(fā)送指定內(nèi)容的郵件。
然后收到的郵件是這樣的:


收到的郵件

3.4 郵件配置的坑

在使用過程中,如果發(fā)送郵件后,scrapy報出如下錯誤信息:


報錯

通過多方排查,依舊沒有資料信息。

后來無意中改動了郵件發(fā)送配置中的端口,就解決了這個問題


25-465.png

只要將原來的25端口改成465即可。(猜測跟郵件服務(wù)器pop3的ssl有關(guān),未親自確認)
這里雖然只是以爬蟲關(guān)閉來舉例,實際上可以監(jiān)控更多的行為操作,比如百度翻譯的接口超量、捕獲一些特殊的異常等。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容