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,可以快速的把文本消息转发到指定的通道。
官网测试发送:
微信收到消息:
消息转发渠道:
集成到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 = 'SCT5416TBBEDqBq16ernFmAcQ'EXTENSIONS = { '项目名.extensions.statsding.StatsDing': 500}
测试
项目结束后(快速结束项目),钉钉收到消息: