在scrapy爬虫项目中经常遇到 爬取数据时报错无法及时处理 导致数据爬取不完整 只能先查看log才能发现报错

  首先写一个简单的邮件发送模块

 """
@file: emailHandler.py 
"""
1 #邮件服务封装 import smtplib
from email.mime.text import MIMEText
from email.utils import formataddr class EmailHandler(object): def __init__(self,user,password,type = 0):
"""
:param user:str 发送人邮箱地址(用户名)
:param password:str 发送人在QQ或163申请的授权码
:param type:int 0 为QQ邮箱 1 为163邮箱
"""
self.__QQ = {'smtp':'smtp.qq.com','port':465}
self.__163 = {'smtp':'smtp.163.com','port':25}
self.user = user
self.password = password
if type == 0:
self.server=smtplib.SMTP_SSL (self.__QQ['smtp'],self.__QQ['port'])
self.server.login (self.user,self.password)
elif type == 1:
self.server=smtplib.SMTP_SSL (self.__163['smtp'],self.__163['port'])
self.server.login (self.user,self.password) def send_mail(self,To,subject,content):
"""
:param To:str 接收人邮箱地址
:param subject:str 邮件标题
:param content:str 邮件内容
:return:bool True 成功 False 失败
"""
try:
msg = MIMEText(content,'plain','utf-8')
msg['From'] = formataddr(['spider邮件报警系统',self.user])
msg['To'] = formataddr(['',To])
msg['Subject'] = subject self.server.sendmail(self.user,To,msg.as_string())
print("【%s】邮件发送成功"%subject)
return True
except Exception as f:
print("【%s】邮件发送失败,请检查信息"%subject)
return False

  需要指定以下几个参数

 #邮箱信息
MAIL_CONFIG = {
'user':'xxxxx', #邮箱账号
'password':'xxxx', #邮箱授权码
'to_add':'xxx', #要发送的邮箱地址
'mail_title':'scrapy_标题' #邮件标题
}

  本项目中主要使用的 pydispatch模块 绑定信号的方式发送邮件(代码片段)

 from pydispatch import dispatcher
err_spider = object() def __init__(self):
#初始化邮件发送次数
self.mail_count = 0
dispatcher.connect(self.send_mail, signal=err_spider)
super(xxx, self).__init__() def send_mail(self, error):
"当spider出现error时发送邮件到邮箱"
if self.mail_count < 1:
mailmanager = EmailHandler(mail_conf.get('user', ''), mail_conf.get('password', ''))
mailmanager.send_mail(mail_conf.get('to_add', ''), mail_conf.get('mail_title', ''), 'spider出现错误请及时查看\r%s' % error)
self.mail_count += 1

  准备工作已经完成,接下来就是在scrapy 爬取数据出现问题时 调用这个模块向指定邮箱发送邮件(代码片段)

  #列表页数据
def parse(self, response):
#列表页条目
data_lists = response.xpath('//div[@id="listbox30"]/div')
try:
#最后一个div是分页数据
for data in data_lists[:-1]:
item = WangdaitianyanItem()
item['title'] = data.xpath('div[1]/div/div[1]/a/@title').extract_first() #标题
log.msg('[info] 正在爬取【%s】' % (item['title']), level=log.INFO)
item['img'] = data.xpath('div[2]/div/a/img/@data-src').extract_first() #封面图
item['introduction'] = data.xpath('div[1]/div/div[2]/text()').extract_first() #简介
item['source'] = data.xpath('div[1]/div/div[3]/div[1]/span[1]/a/text()').extract_first() #源
item['release_time'] = data.xpath('div[1]/div/div[3]/div[1]/span[3]/text()').extract_first() #发布时间
item['read_count'] = data.xpath('div[1]/div/div[3]/div[2]/span[2]/text()').extract_first() #回复数
item['comment_count'] = data.xpath('div[1]/div/div[3]/div[2]/span[5]/text()').extract_first() #评论数
#抓取详情页数据
#//news.p2peye.com/article-513444-1.html
url = data.xpath('div[1]/div/div[1]/a/@href').extract_first() #url
yield scrapy.Request(url='http:%s'%url, callback=self.details_page, meta={'item':item}) #分页部分
#如果检测不到下一页 不在请求
try:
next_page = data_lists[-1].xpath('div/a[contains(@title,"下一页")]/@href').extract_first() #拿去下一页url
yield scrapy.Request(url='https://news.p2peye.com%s'%next_page, callback=self.parse)
except Exception as e:
pass
except Exception as e:
#发送邮件
dispatcher.send(signal=err_spider, error=traceback.format_exc())

    当爬虫出现问题时会以邮件的形式发送到邮箱

  

python-简单邮件报警的更多相关文章

  1. Python简单邮件发送源码

    环境: Python27 主要代码: # -*- coding: utf-8 -*- ''' Created on 2016年10月18日 @author: xuxianglin ''' import ...

  2. python实现监控URL的一个值小于规定的值--邮件报警

    监控URL的一个值小于规定的值--邮件报警 #!/usr/bin/env python #-*- coding:utf-8 -*- __author__ = 'liudong' import urll ...

  3. [转]简单三步,用 Python 发邮件

    https://zhuanlan.zhihu.com/p/24180606 0. 前言 发送电子邮件是个很常见的开发需求.比如你写了个监控天气的脚本,发现第二天要下雨,或者网站上关注的某个商品降价了, ...

  4. Python简单实现邮件群发

    Python简单实现邮件群发 import smtplib from email.mime.text import MIMEText from email.utils import formatadd ...

  5. Python遍历目录下所有文件的最后一行进行判断若错误及时邮件报警-案例

    遍历目录下所有文件的最后一行进行判断若错误及时邮件报警-案例: #-*- encoding: utf-8 -*- __author__ = 'liudong' import linecache,sys ...

  6. python 邮件报警

    为了以后方便使用邮件报警 我这边直接写入一推报警模板 方便以后使用 加入模块 import smtplib from email.mime.text import MIMEText from emai ...

  7. 简单监控网站访问是否正常的shell脚本,邮件报警。网站恢复后继续运行。

    #!/bin/bash # 使用curl检查网页是否可以正常访问,如果无法访问则发邮件. SITE=crm.bjzgjh.com PROT=80 URL="http://$SITE:$PRO ...

  8. Python通过yagmail和smtplib模块发送简单邮件

    SMTP是发送邮件的协议,Python内置对SMTP的支持,可以发送纯文本邮件.HTML邮件以及带附件的邮件.python发邮件需要掌握两个模块的用法,smtplib和email,这俩模块是pytho ...

  9. 分布式监控系统Zabbix-3.0.3-完整安装记录(5)-邮件报警部署

    前面几篇陆续介绍了zabbix3.0.3监控系统的部署和监控项配置,今天这里分享下zabbix3.0.3的邮件报警的配置过程~由于采用sendmail发送邮件,常常会被认为是垃圾邮件被拒,所以不推荐这 ...

  10. zabbix 报警方式之 邮件报警(4)

    一.为什么要自定义邮件脚本报警? 灵活,方便.可以自定义过滤信息. 下面是使用不同方式的邮件报警,一个是利用sendEmail程序来发送报警邮件,第二个是利用python脚本来发送邮件. 二.send ...

随机推荐

  1. eval()和$.parseJSON()注意事项

    在前后端分离大行其道XXX(巴拉巴拉的废话不多讲了).描述实际应用场景:后台组装数据,返回到前台调用. 刚开始没有注意“后台返回字符串_1”的形式,使用eval()处理. 只是返回了字符串,不是严格意 ...

  2. ftp和mysql数据库结合使用

    问题描述: 看下 1.1.1.1 的ftp为什么连不上 报错的信息: 'ftpServer' => '1.1.1.1', // FTP服务器地址 ', 'ftpUsername' => ' ...

  3. JAVA第二次实训作业

    1.一维数组的创建和遍历. 声明并创建存放4个人考试成绩的一维数组,并使用for循环遍历数组并打印分数. 要求: 首先按“顺序”遍历,即打印顺序为:从第一个人到第四个人: 然后按“逆序”遍历,即打印顺 ...

  4. elasticsearch的CPU居高不下的问题

    最近项目中遇到一个令人头疼的问题,毕竟因为工作需要刚学elasticsearch,也没有去关注elasticsearch的配置问题,安装好默认把它当做数据库一样去使用,这导致接下来的项目直接挂掉... ...

  5. ueditor内容带格式回显(html字符串回显)

    简单描述:项目里有个地方用到啦ueditor,用来输入XX描述就用电影film代替,保存后,获取到ueditor里的内容(html字符串),保存到数据库. 吐槽:回显的时候,无论怎么处置,就是死活不好 ...

  6. thymleaf th:text="|第${user.courseSort}课|" 对于不知道的真的是解渴了

    简单描述:最近再做一个课程管理,列表显示第几课,但是后台传递过来的只是数字0~9,意味着,我得自己拼了ヾ(◍°∇°◍)ノ゙  我最烦的就是这种拼,各种难调,果真和我想的一样,4.5遍了还没出来. 我的 ...

  7. Spring框架xml配置中属性ref与value的区别

    1.spring批量扫描mybatis的mapper,使用value 2.spring管理mybatis的单个mapper,用的是ref 虽然引用的是同一个bean,但两个对象的属相类型明显不一样,一 ...

  8. char和unsigned char--数据类型区别

    char和unsigned char --数据类型区别 除去布尔型和扩展的字符型之外,其它整型可以划分为带符号的(signed)和无符号的(unsigned)两种. 类型int.short.long和 ...

  9. Win7共享文件夹简单?这个共享问题可以难倒90%的人

    信息化社会,没有哪个公司不用电脑办公了.一个办公室里面的同事相互之间利用系统的共享功能,共享一些文件和软件已经是司空见惯的了,这个不需要多么复杂的操作.我们使用最多的windows7操作系统就能很方便 ...

  10. 通过View.post()获取View的宽高

    在Android里,获取View宽高的时机是个老生常谈的话题了.众所周知,在Oncreate里直接调用View.getWidth或者View.getMeasuredWidth返回都是0.所以获取宽高时 ...