Loading

scrapy扩展-爬取状态钉钉消息通知

背景


使用过scrapy的开发者都知道,scrapy在爬取结束后是允许发送邮件通知的
它内部是通过外部扩展extension的方式集成于scrapy。


想要一探究竟可以查看scrapy源码或翻阅官方文档
邮件实现功能类
https://docs.scrapy.org/en/latest/topics/email.html
邮件异步通知扩展类
https://docs.scrapy.org/en/latest/topics/extensions.html#module-scrapy.extensions.statsmailer
在使用过程中需要配置邮箱的信息及收件人list,那有没有更简单明了的方案呢?
我想到的答案是:钉钉通知

钉钉自定义机器人介绍

钉钉机器人是钉钉群的一个高级扩展功能,但使用起来却非常简单,只需要注册一个钉钉账号,就可以将第三方服务信息聚合到钉钉群中,实现信息的自动同步。
常见的使用场景:
1、聚合Github、Gitlab等源码管理服务,实现源码更新同步;
2、聚合Trello、JIRA等项目协调服务,实现项目信息同步;
3、机器人支持Webhook自定义接入,就可以实现更多可能性,例如:将运维报警、自动化测试结果报告、工作&生活日程安排(上班打卡、下班吃饭、健身、读书、生日、纪念日...)的提醒;
目前自定义机器人支持文本(text)、链接(link)、markdown三种消息格式,五种消息类型,详细信息请参考自定义机器人官方文档

集成到Scrapy

通过阅读scrapy源码,可以很轻松的学习到其email扩展类的写法,模仿其写法,即可很简单快捷的(笔者仅用5分钟)将钉钉通知集成到项目中去。

邮件功能入口:scrapy/mail.py
扩展入口:scrapy/extensions/statsmailer.py

为了项目的整洁一致(洁癖),在项目目录下新建extensions扩展包,然后编写statsding.py代码

# -*- coding:utf-8 -*-
# @Time : 2021/4/1 9:57
# @Author : MicLon

import requests
import json
from scrapy import signals


class Ding:

    def __init__(self, key):
        self.key = key

    @classmethod
    def from_settings(cls, settings):
        return cls(
            key=settings['DD_KEY']
        )

    def send(self, title, text, at_all=False):
        """
        API 文档: https://developers.dingtalk.com/document/app/custom-robot-access?spm=ding_open_doc.document.0.0.6d9d28e1QcCPII#topic-2026027
        :param title: 首屏会话透出的展示内容。
        :param text: markdown格式的消息。
        :param at_all: 是否@所有人。
        :return:
        """
        api_url = f'https://oapi.dingtalk.com/robot/send?access_token={self.key}'
        api_body = {"msgtype": "markdown", "markdown": json.dumps({"title": title, "text": text, "isAtAll": at_all})}
        headers = {'Content-Type': 'application/json'}
        resp = requests.post(url=api_url, json=api_body, headers=headers)
        if resp.status_code == 200:
            return True
        return False


class StatsDing:

    def __init__(self, stats, dd):
        self.stats = stats
        self.dd = dd

    @classmethod
    def from_crawler(cls, crawler):
        dd = Ding.from_settings(crawler.settings)
        o = cls(crawler.stats, dd)
        crawler.signals.connect(o.spider_closed, signal=signals.spider_closed)
        return o

    def spider_closed(self, spider):
        spider_stats = self.stats.get_stats(spider)
        body = "Global stats\n\n"
        body += "\n".join("%-50s : %s" % i for i in self.stats.get_stats().items())
        body += "\n\n%s stats\n\n" % spider.name
        body += "\n".join("%-50s : %s" % i for i in spider_stats.items())
        return self.dd.send(spider.name, body)

别忘了需要在设置中配置钉钉机器人提供的access_token并且开启扩展

DD_KEY = '6d37b5526f5**********************178cfba0'
EXTENSIONS = {
   '项目名.extensions.statsding.StatsDing': 500
}

测试


项目结束后,钉钉收到消息:

image

posted @ 2021-04-01 11:46  代码领悟  阅读(403)  评论(0编辑  收藏  举报