经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Python » 查看文章
python-简单邮件报警Damon-
来源:cnblogs  作者:Damon-  时间:2018/9/25 20:34:59  对本文有异议

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

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

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

  需要指定以下几个参数

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

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

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

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

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

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

 

  

 

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号