一、需求
邮件发送功能,作为一个【通知】或者说【知晓】的方式,在实际应用中会经常使用的。你希望当它们触发某个状况的时候,你的邮箱会收到对应的提醒,这样你可以及时的处理这些状况,当然你也可以集成微信来开发,让通知发送到你的微信。可以根据实际需求,在不同的时机发送不同的提醒邮件,以对爬虫状态进行监控。
二、scrapy文档
发送email
虽然Python通过 smtplib 库使得发送 email 变得很简单,Scrapy仍然提供了自己的实现。 该功能十分易用,同时由于采用了 Twisted非阻塞式(non-blocking)IO ,其避免了对爬虫的非阻塞式IO的影响。 另外,其也提供了简单的API来发送附件。 通过一些 settings 设置,您可以很简单的进行配置。
有两种方法可以创建邮件发送器(mail sender)
1 通过标准构造器(constructor)创建:
fromscrapy.mailimportMailSendermailer = MailSender()
2 传递一个Scrapy设置对象,其会参考 settings:
mailer= MailSender.from_settings(settings)
这是如何来发送邮件(不包括附件):
mailer.send(to=["[email protected]"], subject="Some subject", body="Some body", cc=["[email protected]"])
在Scrapy中发送email推荐使用MailSender。其同框架中其他的部分一样,使用了 Twisted非阻塞式(non-blocking)IO 。
classscrapy.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连接
classmethodfrom_settings(settings)
使用Scrapy设置对象来初始化对象。其会参考 这些Scrapy设置:
参数: settings (scrapy.settings.Settings object) – the e-mail recipients
send(to, subject, body, cc=None, attachs=(), mimetype='text/plain')
三、实际写法
1 设置邮箱pop
登录QQ邮箱 找到 1 设置 2 账户
然后生成授权码(以前是生成密码,现在用授权码)
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]发送邮件(实际应用的时候可以考虑给1个或多个邮箱发送),邮件内容是body,邮件标题是subject。
3 在邮件里添加爬虫停止信息, 写法很多,除了def close 还可以:
def__init__(self): ### 监听信号量
super(YoutubeapiSpider, self).__init__()
#收到spider_closed信号时,调用下面的close方法发送调用下面的close方法来发送通知邮件通
dispatcher.connect(self.spider_closed, signals.spider_closed)
def spider_closed(self, spider, reason):# 上方的信号量触发这个方法
stats_info = self.crawler.stats._stats# 爬虫结束时控制台信息
body ="爬虫[%s]已经关闭,原因是: %s.\n以下为运行信息:\n %s"% (spider.name, reason, stats_info)
subject ="[%s]爬虫关闭提醒"% spider.name
mailers.send(to={"[email protected]"}, subject=subject, body=body)
只要满足触发条件,就可以发送指定内容的邮件。
4 邮件配置的坑,在使用过程中,如果发送邮件后,scrapy报出如下错误信息:
通过多方排查,依旧没有资料信息。后来无意中改动了邮件发送配置中的端口,就解决了这个问题
只要将原来的25端口改成465即可。(猜测跟邮件服务器pop3的ssl有关,未亲自确认)
这里虽然只是以爬虫关闭来举例,实际上可以监控更多的行为操作,比如百度翻译的接口超量、捕获一些特殊的异常等。