美文网首页Python3自学 爬虫实战scrapy爬虫框架爬不动的毛毛虫
我想监控爬虫状况怎么办?Scrapy邮件发送功能及爬虫停止信息

我想监控爬虫状况怎么办?Scrapy邮件发送功能及爬虫停止信息

作者: 中乘风 | 来源:发表于2018-07-12 22:38 被阅读32次

    一、需求

    邮件发送功能,作为一个【通知】或者说【知晓】的方式,在实际应用中会经常使用的,试想一个场景:

    你掌握着公司半数以上的爬虫,并且你每天都要监控它们(他们在服务器上),你作为一个爬虫技术从业者,你肯定会想(偷懒),因为不偷懒的工程师不会进步。你希望当它们触发某个状况的时候,你的邮箱会收到对应的提醒,这样你可以及时的处理这些状况,当然你也可以集成微信来开发,让通知发送到你的微信,但是互联网行业,邮箱还是经常用的。

    可以根据实际需求,在不同的时机发送不同的提醒邮件,以对爬虫状态进行监控。

    这里我以监控爬虫的停止信息来作为示例。

    timg (1).jpg

    二、scrapy文档

    scrapy官网文档有提供邮件发送的资料:

    发送email

    虽然Python通过 smtplib 库使得发送email变得很简单,Scrapy仍然提供了自己的实现。 该功能十分易用,同时由于采用了 Twisted非阻塞式(non-blocking)IO ,其避免了对爬虫的非阻塞式IO的影响。 另外,其也提供了简单的API来发送附件。 通过一些 settings 设置,您可以很简单的进行配置。

    简单例子

    有两种方法可以创建邮件发送器(mail sender)。 您可以通过标准构造器(constructor)创建:

    fromscrapy.mailimportMailSendermailer = 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 。

    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')
    

    发送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="abcdefg@qq.com",  # 邮件发送者
    smtpuser="abcdefg@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)
    

    这样就会在收到爬虫关闭信号的时候,通过abgdefg@qq.com给指定的admin@qq.comquinns@aliyun.com发送邮件(实际应用的时候可以考虑给1个或多个邮箱发送),邮件内容是body,邮件标题是subject。

    3.3 在邮件里添加爬虫停止信息

    毕竟停止信息里面对爬虫状态和记录比较详细,所以邮件中应当发送停止信息。

    当然了,写法很多,除了def close 还可以:

    def __init__(self):
      """ 监听信号量 """
      super(YoutubeapiSpider, self).__init__()# 当收到spider_closed信号的时候,调用下面的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={"513720453@qq.com"},
                       subject=subject,
                       body=body)
    

    只要满足触发条件,就可以发送指定内容的邮件。
    然后收到的邮件是这样的:


    收到的邮件

    3.4 邮件配置的坑

    在使用过程中,如果发送邮件后,scrapy报出如下错误信息:


    报错

    通过多方排查,依旧没有资料信息。

    后来无意中改动了邮件发送配置中的端口,就解决了这个问题


    25-465.png

    只要将原来的25端口改成465即可。(猜测跟邮件服务器pop3的ssl有关,未亲自确认)
    这里虽然只是以爬虫关闭来举例,实际上可以监控更多的行为操作,比如百度翻译的接口超量、捕获一些特殊的异常等。

    相关文章

      网友评论

        本文标题:我想监控爬虫状况怎么办?Scrapy邮件发送功能及爬虫停止信息

        本文链接:https://www.haomeiwen.com/subject/sykdpftx.html