一、需求

有时候我们写了很多爬虫在运行,但是我们可能不会一直有时间来监控它的变化,比如报错了,或者爬完了,如果我们能有个通知来通知我们,那该是多好啊!比如发个邮件,发个短信那是再好不过了,那么本篇文章就介绍一下使用 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=["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)

参数由以下组成:

使用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="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)

只要满足触发条件,就可以发送指定内容的邮件。

这里虽然只是以爬虫关闭来举例,实际上可以监控更多的行为操作,比如百度翻译的接口超量、捕获一些特殊的异常等。


©著作权归作者所有:来自51CTO博客作者mb5fe159f193922的原创作品,如需转载,请注明出处,否则将追究法律责任

更多相关文章

  1. 只会爬虫不会反爬虫?动图详解利用 User-Agent 进行反爬虫的原理和
  2. 这可能是你见过的最全的网络爬虫干货总结!
  3. 爬虫速度太慢?来试试用异步协程提速吧!
  4. 分布式爬虫原理之Scrapy分布式实现
  5. 分布式爬虫原理之分布式爬虫原理
  6. 分布式爬虫的部署之Gerapy分布式管理
  7. 分布式爬虫的部署之Scrapyd批量部署
  8. 分布式爬虫的部署之Scrapyd对接Docker
  9. Scrapy框架的使用之Scrapy通用爬虫

随机推荐

  1. android使用adb命令安装软件
  2. Android(安卓)游戏引擎libgdx 如何添加万
  3. android文件读取
  4. Android EditText保留小数点后两位
  5. Android(安卓)Studio 配置使用GreenDao3.
  6. Android Q 下拉状态栏快捷开关解析
  7. 传智播客Android核心基础课程视频教程(收
  8. android studio编译错误 之 Cause: com/a
  9. Android 创建菜单栏
  10. relative相关属性