背景介绍:之前写过通过通过scrapy的扩展发送邮件,在爬虫关闭的时候发送邮件。那个时候有个问题就是MailSender对象需要return出去。这次需要在中间件中发送邮件,但是中间件中不能随便使用return了。

import json
import random
import scrapy
from scrapy.http import Response
from scrapy.mail import MailSender
from scrapy.exceptions import IgnoreRequest from order_spider.databases.connections import redis_db class LoginTokenMiddleware(object): def __init__(self,mailer):
self.mailer = mailer @classmethod
def from_crawler(cls, crawler):
smtphost = crawler.settings.get('MAIL_HOST') # 发送邮件的服务器
mail_port = crawler.settings.get('MAIL_PORT') # 邮件发送者
mailfrom = crawler.settings.get('MAIL_USER') # 邮件发送者
smtppass = crawler.settings.get('MAIL_PASS') # 发送邮箱的密码不是你注册时的密码,而是授权码!!!切记!
mailer = MailSender(smtphost, mailfrom, mailfrom, smtppass, smtpport=mail_port)
return cls(mailer) def _send_mail(self,subject,body):
return self.mailer.send(to={'feijun.zheng@huijie-inc.com'}, subject=subject, body=body) def process_request(self, request:scrapy.Request, spider):
#从数据库获取所有的用户session
tokens = redis_db.hgetall("order:xxx")
users = []
for k,v in tokens.items():
#如果用户value有0,代表过期
if "0" not in v:
users.append(k)
if not users:
try:
#通过end_signal判断爬虫是否继续执行
if spider.end_signal:
raise IgnoreRequest
# 设置为True,避免重复发送邮件
spider.end_signal = True
spider.logger.warning("session全部过期请重新添加")
body = 'xxxxx全部过期'
subject = '没有可用的账号,请重新添加'
#mail添加回调,避免出现`exceptions.AttributeError: 'NoneType' object has no attribute 'bio_read'`
self._send_mail(body,subject).addCallback(lambda x: x)
except Exception as e:
spider.logger.exception(e)
finally:
# 没有可用账号,关闭爬虫
spider.crawler.engine.close_spider(spider, "爬虫关闭")
# 忽略后续的请求
raise IgnoreRequest session_id = random.choice(users)
request.cookies = {"JSESSIONID":session_id}
return None def process_response(self, request, response:Response, spider):
res = json.loads(response.text) if res['code'] != 1:
session_id = request.cookies['JSESSIONID']
user = redis_db.hmget("order:xxxx",session_id)[0]
redis_db.hset("order:xxxx",session_id,user+'_0') spider.logger.info("登录失败,失败原因:%s" %(res['msg']))
body = 'session[%s] 可能已过期\n 失败原因%s'%(session_id,res['msg'])
subject = '账号登录失败提醒'
self._send_mail(body,subject).addCallback(lambda x: x)
return response

推荐还是在扩展中使用发送邮件的功能,可以参考:

scrapy通过扩展发送邮件

还有一个小问题就是:阿里云上默认不能使用25端口,所以你需要使用456端口进行发送,456端口需要使用SSL,需要在原来的基础上做个小修改:

mailer = MailSender(mail_host, mail_user, mail_user, mail_pass, mail_port, smtptls=True, smtpssl=True)

具体参数参考官方文档:

scrapy文档

scrapy中间件中发送邮件的更多相关文章

  1. scrapy中间件中使用selenium切换ip

    scrapy抓取一些需要js加载页面时一般要么是通过接口直接获取数据,要么是js加载,但是我通过selenium也可以获取动态页面 但是有个问题,容易给反爬,因为在scrapy中间件mid中使用sel ...

  2. Python爬虫从入门到放弃(十七)之 Scrapy框架中Download Middleware用法

    这篇文章中写了常用的下载中间件的用法和例子.Downloader Middleware处理的过程主要在调度器发送requests请求的时候以及网页将response结果返回给spiders的时候,所以 ...

  3. Scrapy中间件user-agent和ip代理使用

    一.定义实现随机User-Agent的下载中间件 1.在middlewares.py中完善代码 import random from Tencent.settings import USER_AGEN ...

  4. Python爬虫从入门到放弃 之 Scrapy框架中Download Middleware用法

    这篇文章中写了常用的下载中间件的用法和例子.Downloader Middleware处理的过程主要在调度器发送requests请求的时候以及网页将response结果返回给spiders的时候,所以 ...

  5. scrapy框架中Download Middleware用法

    scrapy框架中Download Middleware用法   Downloader Middleware处理的过程主要在调度器发送requests请求的时候以及网页将response结果返回给sp ...

  6. scrapy——中间件UserAgent代理

    pip install fake-useragent 使用说明:from fake_useragent import UserAgent# 实例化一个UserAgent对象ua = UserAgent ...

  7. scrapy中间件之下载中间件使用(网易新闻爬取)

    scrapy项目中的middlewarse.py中间件 爬虫中间件:目前先不介绍 下载中间件(需要在settings.py中开启) (1)请求处理函数:process_request(self, re ...

  8. Python之爬虫(十九) Scrapy框架中Download Middleware用法

    这篇文章中写了常用的下载中间件的用法和例子.Downloader Middleware处理的过程主要在调度器发送requests请求的时候以及网页将response结果返回给spiders的时候,所以 ...

  9. Node.js连接Mysql,并把连接集成进Express中间件中

    引言 在node.js连接mysql的过程,我们通常有两种连接方法,普通连接和连接池. 这两种方法较为常见,当我们使用express框架时还会选择使用中间express-myconnection,可以 ...

随机推荐

  1. moodle3.7中文语言包

    Moodle官方有中文语言包,但是还有没有翻译的,为了提高用户体验,可以将部分未翻译的应用在Moodle网站管理中自己修改. 具体步骤: 先确定需要修改的关键字,也就是网站中没有翻译成中文的文字 在c ...

  2. 下载及安装Python详细步骤

    安装python分三个步骤: *下载python *安装python *检查是否安装成功 1.下载Python (1)python下载地址https://www.python.org/download ...

  3. 微服务架构 ------ 插曲 linux LVM磁盘扩容

    1.LVM的基本概念 物理卷(PV):可以在上面建立卷组的媒介,可以是硬盘分区,也可以是硬盘本身或者回环文件,物理卷包括一个特殊的header,其余部分被切割成一块块物理区域. 卷组(VG):将一组物 ...

  4. OpenInstall实现APP无邀请码推广

    1.登录OpenInstall网站,这里会为你创建一个AppKey,而这个东西在web页面会用到. 2.在推广页面中加入推广下载. <script type="text/javascr ...

  5. 阿里云 OSS文件存储挂到云服务器ESC文件系统中

    ossfs能让您在Linux系统中,将对象存储OSS的存储空间(Bucket)挂载到本地文件系统中,您能够像操作本地文件一样操作OSS的对象(Object),实现数据的共享. 使用限制 ossfs使用 ...

  6. xadmin引入django-rest-framework

    一.安装: pip install djangorestframework 安装djangorestframework库 https://github.com/encode/django-rest-f ...

  7. Fiddler抓包设置

    介绍 Fiddler 在 PC 端和移动端,模拟器抓取数据包 Fiddler抓取PC端数据包: 这里 Fiddler 抓取网页客户端的数据包时,其原理就是在 客户端/浏览器 和 服务器端 之间,加上了 ...

  8. UDP基础

    UDP主要特点: (1)UDP是无连接的,发送数据不需要建立连接,减少了开销和发送数据之前的时延. (2)UDP使用尽最大努力交付,即不保证可靠交付,因此主机不需要维持连接状态表. (3)UDP面向报 ...

  9. 1. 观察者模式总结(C++)

    1. 介绍 观察者模式:定义了一种"一对多"的依赖关系,让多个观察者对象同时监听一个对象的改变,即当该对象的状态发现改变时,会通知所有它依赖的观察者对象.观察者模式属于行为模式. ...

  10. vs2017无法查看类图

    问题描述: 在解决方案右键项目,没有查看->查看类图选项 问题根据: VS安装时没有安装VS扩展中的类设计器 解决方案: 运行安装包,找到Other Tols勾选Visual Studio ex ...