> 文档中心 > Scrapy通过扩展启用爬虫完成后消息通知,支持钉钉/微信/飞书等

Scrapy通过扩展启用爬虫完成后消息通知,支持钉钉/微信/飞书等


背景

使用过scrapy的开发者都知道,scrapy在爬取结束后是允许发送邮件通知的

它内部是通过外部扩展extension的方式集成于scrapy的。

邮件实现功能类
https://docs.scrapy.org/en/latest/topics/email.html

邮件异步通知扩展类
https://docs.scrapy.org/en/latest/topics/extensions.html#module-scrapy.extensions.statsmailer

在使用过程中需要配置邮箱的信息及收件人list,那有没有更简单明了的方案呢?

我想到的答案是:钉钉通知

Server酱

得益于【Server酱】提供的API,通过简单的配置即可实现微信消息通知。

Server酱是什么 (来源官网)
在这里插入图片描述

通过微信授权登录,即可拥有SendKey,利用这个SendKey及提供的api,可以快速的把文本消息转发到指定的通道。

官网测试发送:
在这里插入图片描述

微信收到消息:

](https://img-blog.csdnimg.cn/img_convert/39961dac8d5f5f1b86cf9c3a0dc39c33.png)

消息转发渠道:

Scrapy通过扩展启用爬虫完成后消息通知,支持钉钉/微信/飞书等

集成到scrapy

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

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

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

# -*- coding:utf-8 -*-# @Time : 2021/3/1 13:43# @Author : MicLon"""Statsvx extension sends an msg when a spider finishes scraping.Use VX_KEY setting to enable, if you have no this key, pls visit https://sct.ftqq.com/"""import requestsfrom scrapy import signalsclass Ding:    def __init__(self, key): self.key = key    @classmethod    def from_settings(cls, settings): return cls(     key=settings['MSG_KEY'] )    def send(self, msg, desp=None): api_url = f'https://sctapi.ftqq.com/{self.key}.send?title={msg}&desp={desp}' resp = requests.get(url=api_url) if resp.status_code == 200:     return True return Falseclass StatsDing(object):    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)

别忘了需要在设置中配置Sever酱提供的SendKey开启扩展

MSG_KEY = 'SCT5416TBBEDqB******q16ernFmAcQ'EXTENSIONS = {   '项目名.extensions.statsding.StatsDing': 500}

测试

项目结束后(快速结束项目),钉钉收到消息:

在这里插入图片描述