有时候咱们写了不少爬虫在运行,可是咱们可能不会一直有时间来监控它的变化,好比报错了,或者爬完了,若是咱们能有个通知来通知咱们,那该是多好啊!好比发个邮件,发个短信那是再好不过了,那么本篇文章就介绍一下使用 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)
只要知足触发条件,就能够发送指定内容的邮件。
这里虽然只是以爬虫关闭来举例,实际上能够监控更多的行为操做,好比百度翻译的接口超量、捕获一些特殊的异常等。