scrapy中间件中发送邮件
背景介绍:之前写过通过通过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中间件中发送邮件的更多相关文章
- scrapy中间件中使用selenium切换ip
scrapy抓取一些需要js加载页面时一般要么是通过接口直接获取数据,要么是js加载,但是我通过selenium也可以获取动态页面 但是有个问题,容易给反爬,因为在scrapy中间件mid中使用sel ...
- Python爬虫从入门到放弃(十七)之 Scrapy框架中Download Middleware用法
这篇文章中写了常用的下载中间件的用法和例子.Downloader Middleware处理的过程主要在调度器发送requests请求的时候以及网页将response结果返回给spiders的时候,所以 ...
- Scrapy中间件user-agent和ip代理使用
一.定义实现随机User-Agent的下载中间件 1.在middlewares.py中完善代码 import random from Tencent.settings import USER_AGEN ...
- Python爬虫从入门到放弃 之 Scrapy框架中Download Middleware用法
这篇文章中写了常用的下载中间件的用法和例子.Downloader Middleware处理的过程主要在调度器发送requests请求的时候以及网页将response结果返回给spiders的时候,所以 ...
- scrapy框架中Download Middleware用法
scrapy框架中Download Middleware用法 Downloader Middleware处理的过程主要在调度器发送requests请求的时候以及网页将response结果返回给sp ...
- scrapy——中间件UserAgent代理
pip install fake-useragent 使用说明:from fake_useragent import UserAgent# 实例化一个UserAgent对象ua = UserAgent ...
- scrapy中间件之下载中间件使用(网易新闻爬取)
scrapy项目中的middlewarse.py中间件 爬虫中间件:目前先不介绍 下载中间件(需要在settings.py中开启) (1)请求处理函数:process_request(self, re ...
- Python之爬虫(十九) Scrapy框架中Download Middleware用法
这篇文章中写了常用的下载中间件的用法和例子.Downloader Middleware处理的过程主要在调度器发送requests请求的时候以及网页将response结果返回给spiders的时候,所以 ...
- Node.js连接Mysql,并把连接集成进Express中间件中
引言 在node.js连接mysql的过程,我们通常有两种连接方法,普通连接和连接池. 这两种方法较为常见,当我们使用express框架时还会选择使用中间express-myconnection,可以 ...
随机推荐
- 浅析负载均衡的6种算法,Ngnix的5种算法
常见的几种负载均衡算法 1.轮询法 将请求按顺序轮流地分配到后端服务器上,它均衡地对待后端的每一台服务器,而不关心服务器实际的连接数和当前的系统负载. 2.随机法 通过系统的随机算法,根据后端服务器的 ...
- open live writer安装以及代码高亮、折叠插件安装
一.目的 方便在本地写博客,不用在浏览器上写. 二.open live writer的安装 下载open live writer 这是我的 链接:https://pan.baidu.com/s/1u8 ...
- PAT 1024 科学记数法
PAT 1024 科学记数法 科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式 [+-][1-9].[0-9]+E[+-][0-9]+,即数字的整数部分只有 1 位,小数部 ...
- 使用Git Bash向GitHub上传本地项目
第一步:下载Git Bash(https://gitforwindows.org/),安装的过程是一路下一步,就不细说啦: 第二步:打开Git Bash,如下图显示: 第三步:现在让我们先放一放Git ...
- json方式的面向对象、拖拽
//json方式的面向对象 var obj= { a:, b:, c:function(){ alert( } } obj.c();//12 //命名空间 var miaov={}; miaov.co ...
- Vue+element 解决浏览器自动填充记住的账号密码问题
我们在做form表单的时候,会发现,浏览器会自动的将我们之前保存的密码, 自动的填充到表单中input 为 type="password" 的框中 登录页面也就算了,但是注册页面就 ...
- 为什么MES实施起来效果不佳?
原因一:我国制造业存在管理基础的先天不足 我国企业与发达国家企业在管理发展上,存在较大的差别.发达制造国家经历了管理探索.发展.成熟.再提高的全过程,从管理基础的奠定到思想认识的深刻程度,都是我国所无 ...
- android studio学习---签名打包的两种方式
注:给我们自己开发的app签名,就代表着我自己的版权,以后要进行升级,也必须要使用相同的签名才行.签名就代表着自己的身份(即keystore),多个app可以使用同一个签名. 如果不知道签名是啥意思, ...
- 用Python玩转微信
Python玩转微信 大家每天都在用微信,有没有想过用python来控制我们的微信,不多说,直接上干货! 这个是在 itchat上做的封装 http://itchat.readthedocs.io ...
- Comet OJ 夏季欢乐赛 Gree的心房
Comet OJ 夏季欢乐赛 Gree的心房 题目传送门 题目描述 据说每一个走进Gree哥哥心房的小姑娘都没有能够再走出来-- 我们将Gree哥哥的心房抽象成一个n \times mn×m的地图,初 ...