python-简单邮件报警-程序员宅基地

技术标签: python  

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

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

 """
@file: emailHandler.py 
"""
1
#邮件服务封装 2 3 import smtplib 4 from email.mime.text import MIMEText 5 from email.utils import formataddr 6 7 class EmailHandler(object): 8 9 def __init__(self,user,password,type = 0): 10 """ 11 :param user:str 发送人邮箱地址(用户名) 12 :param password:str 发送人在QQ或163申请的授权码 13 :param type:int 0 为QQ邮箱 1 为163邮箱 14 """ 15 self.__QQ = { 'smtp':'smtp.qq.com','port':465} 16 self.__163 = { 'smtp':'smtp.163.com','port':25} 17 self.user = user 18 self.password = password 19 if type == 0: 20 self.server=smtplib.SMTP_SSL (self.__QQ['smtp'],self.__QQ['port']) 21 self.server.login (self.user,self.password) 22 elif type == 1: 23 self.server=smtplib.SMTP_SSL (self.__163['smtp'],self.__163['port']) 24 self.server.login (self.user,self.password) 25 26 def send_mail(self,To,subject,content): 27 """ 28 :param To:str 接收人邮箱地址 29 :param subject:str 邮件标题 30 :param content:str 邮件内容 31 :return:bool True 成功 False 失败 32 """ 33 try: 34 msg = MIMEText(content,'plain','utf-8') 35 msg['From'] = formataddr(['spider邮件报警系统',self.user]) 36 msg['To'] = formataddr(['',To]) 37 msg['Subject'] = subject 38 39 self.server.sendmail(self.user,To,msg.as_string()) 40 print("【%s】邮件发送成功"%subject) 41 return True 42 except Exception as f: 43 print("【%s】邮件发送失败,请检查信息"%subject) 44 return False

  需要指定以下几个参数

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

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

 1 from pydispatch import dispatcher
 2 err_spider = object()
 3 
 4 def __init__(self):
 5         #初始化邮件发送次数
 6         self.mail_count = 0
 7         dispatcher.connect(self.send_mail, signal=err_spider)
 8         super(xxx, self).__init__()
 9 
10 def send_mail(self, error):
11         "当spider出现error时发送邮件到邮箱"
12         if self.mail_count < 1:
13             mailmanager = EmailHandler(mail_conf.get('user', ''), mail_conf.get('password', ''))
14             mailmanager.send_mail(mail_conf.get('to_add', ''), mail_conf.get('mail_title', ''), 'spider出现错误请及时查看\r%s' % error)
15             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())

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

 

  

 

转载于:https://www.cnblogs.com/damon-/p/9010523.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_33759269/article/details/94687325

智能推荐

电池包预充RC电路仿真_电池bms预充电阻及预充时间的计算simulink-程序员宅基地

文章浏览阅读1.1k次。电池包在设计BDU 的时候 预充电阻计算计算方程: T = RC * Ln[(Vbatt - V0)/( Vbatt - Vpre)] 注:T为预充电时间,R为预充电阻,C为外部电容,Vbatt为电池包电压,V0为负载端闭合高压前..._电池bms预充电阻及预充时间的计算simulink

使用curl在命令行中下载文件_bat脚本 curl 下载文件夹下所有文件-程序员宅基地

文章浏览阅读1w次,点赞2次,收藏5次。今天帮同学从一个网站上下载点数据, 但是上面有上百个链接, 一个一个点击下载实在是工作量太大。 于是自己就想找一个命令行下载工具并用Python写一个简单的脚本来替代这些工作。百度了一下, 找到了curlcurl: curl是利用URL语法在命令行方式下工作的文件传输工具。 [百科: http://baike.baidu.com/view/1326315.htm]官网: http:_bat脚本 curl 下载文件夹下所有文件

常用的原型开发工具-程序员宅基地

文章浏览阅读67次。1、Axure RP(Rapid Prototyping)Axure(读音为Ack-Sure)无疑是目前最受关注的原型开发工具,其能通过组件的方式帮助网站或软件设计师快速建立带有注释的原型(流程图、线框图),并凭借自定义可重用的元件、动态面板以及丰富的script能够建立基本功能或页面逻辑的动态演示文件。Axure借鉴了office的界面,能够让用户快速上手,并且提供了..._程序员原型法常用工具

nuiapp请求网络_uni-app 接口 - 网络请求-程序员宅基地

文章浏览阅读145次。1、 uni.request(OBJECT) 发起网络请求参数名 类型 必填 默认值 说明url String 是 开发者服务器接口地址data Object/String/ArrayBuffer 否 请求的参数header Object 否 设置请求的 header,header 中不能设置 Referer。method String 否 GET (需大写)有效值:OPTIONS, GET...

Vim命令学习参考_hadoop vim是什么操作-程序员宅基地

文章浏览阅读368次。1. 关于Vim1.1 Vim的几种模式2. 启动Vim3. 文档操作4. 光标的移动4.1 基本移动4.2 翻屏4.3 标记5. 插入文本5.1 基本插入5.2 改写插入6. 剪切复制和寄存器6.1 剪切和复制、粘贴6.2 文本对象6.3 寄存器7. 查找与替换7.1 查找7.2 替换7.3 正则表达式8. 排版8.1 基本排版8..._hadoop vim是什么操作

随便推点

杭州程序员对薪酬最满意,上海程序员最辛苦...原来我们是这样的程序员_杭州软件比上海-程序员宅基地

文章浏览阅读6.3k次,点赞5次,收藏9次。最近,极光大数据根据极光调研平台收到的1684份有效问卷,发布了一份2018年3月中国程序员研究报告,涉及了程序员工作和生活等方方面面,现在笔者与大家分享一下:生活中的程序员婚恋篇七成程序员处于未婚状态,其中四成程序员为单身22-30岁的程序员中,只有19.3%已完成结婚生子的人生大事,在主要职业群体中比例为最低。看来说程序员是大龄青年的聚集地,此言非虚。42%的22-30岁受访程序员目前是单身。..._杭州软件比上海

Unity Shader - 在 URP 获取 Ambient(环境光) 颜色_unity ambient-程序员宅基地

文章浏览阅读4.4k次,点赞5次,收藏19次。之前在 Unity Built-in 管线中,我们在自定义 shader 中,可以使用一下代码来获取 Ambient 环境光的颜色:fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.rgb但是在 Unity URP 中,发现不生效了,虽然 URP 中也有定义这个宏,定义在:#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/UnityInput.hlsl" 中 #define UN_unity ambient

TCPIP详解卷1第3章IP网际协议3.2IP首部3.3IP路由选择-程序员宅基地

文章浏览阅读164次。转载于:https://www.cnblogs.com/sunyongjie1984/p/4319969.html

linux which,whereis,locate,find的区别_linux中whereis locate which的区别-程序员宅基地

文章浏览阅读221次。find就不用多说了,就是递归遍历文件夹。which:有时候可能在多个路径下存在相同的命令,该命令可用于查找当前所执行的命令到底是哪一个位置处的命令。whereis:是在数据库中查找文件,在数据库(var/lib/slocate/slocate.db)中查找与文件名相匹配的二进 制文件、源文件和帮助手册文件,使用之前可以使用up..._linux中whereis locate which的区别

olat中解决查看gui_demo源代码异常或debug模式下查看源代码异常_guidemo_main不显示-程序员宅基地

文章浏览阅读1.2k次。出现这种异常是因为没有设置 project.build.home.directory 参数,系统找不到源代码文件的位置。解决办法:1.首先下载源代码,可参考如何下载olat源代码并在eclipse中查看2.在部署的服务中找到 olat.local.properti_guidemo_main不显示

自定义View-Rect和RectF_android根据rect坐标添加控件-程序员宅基地

文章浏览阅读1.4k次。Rect 类定义了一个矩形结构,同样实现了 Parcelable 序列化接口。Rect 类定义了 left、top、right、bottom 四个成员变量,我们需要正确理解这 4 个成员变量的作用:left:矩形左边线条离 y 轴的距离top:矩形上面线条离 x 轴的距离right:矩形右边线条离 y 轴的距离bottom:矩形底部线条离 x 轴的距离矩形是一种非常常见的图_android根据rect坐标添加控件