1.为了更加清晰,下面将项目的结构展示如下
2.具体代码如下
emailtest.py
import scrapy, time
from datetime import datetime
from scrapypro.emailspider.emailspider.emailspider.emailsend import EmailSend
from scrapy.cmdline import execute
class EmailtestSpider(scrapy.Spider):
name = 'emailtest'
allowed_domains = ['baidu.com']
start_urls = ['http://www.baidu.com/']
# 在爬虫启动和关闭的时候,分别发送邮箱,通知爬虫管理者。
def start_requests(self):
email = EmailSend()
content = '爬虫启动时间:{}'.format(datetime.now())
email.send_text_email('xxxxxxxxx@qq.com', 'yyyyyyyy@qq.com', '爬虫启动', content)
for url in self.start_urls:
yield scrapy.Request(url=url, callback=self.parse)
def parse(self, response):
time.sleep(10)
print('123')
def closed(self, reason):
# 爬虫关闭的时候,会调用这个方法
email = EmailSend()
content = '爬虫关闭时间:{}'.format(datetime.now())
email.send_text_email('xxxxxxxx@qq.com', 'yyyyyyyyyy@qq.com', '爬虫结束', content)
execute(['scrapy','crawl','emailtest'])
emailsend.py
import smtplib
from email.mime.text import MIMEText
import logging
class EmailSend(object):
def __init__(self):
self.logging = logging.getLogger('Waring')
self.email_host = 'smtp.qq.com'
self.email_port = '465'
self.email_pass = '填写你的授权码'
def send_text_email(self, from_addr, to_addrs, subject, content):
self.logging.warning('send_text_email is willed 丢弃')
self.logging.error('send_text_email is None')
message_text = MIMEText(content, 'plain', 'utf8')
message_text['From'] = from_addr
message_text['To'] = to_addrs
message_text['Subject'] = subject
try:
# 在创建客户端对象的同时,连接到邮箱服务器。
client = smtplib.SMTP_SSL(host=self.email_host, port=self.email_port)
login_result = client.login(from_addr, self.email_pass)
print(login_result)
# (235, b'Authentication successful')
if login_result and login_result[0] == 235:
print('登录成功')
client.sendmail(from_addr, to_addrs, message_text.as_string())
print('邮件发送成功')
else:
print('邮件发送异常:', login_result[0], login_result[1])
except Exception as e:
# print('连接邮箱服务器异常:',e)
self.logging.error('连接邮箱服务器异常:{}'.format(e))
def send_image_email(self):
pass
def send_word_email(self):
pass
def send_video_email(self):
pass
settings.py
# LOG_FILE: 配置收集日志的本地目录
# LOG_ENABLED: 配置是否启用日志收集
# LOG_ENCODING
# LOG_LEVEL: 配置收集日志的级别,收集INFO(含有及以上),
# LOG_FORMAT
# LOG_DATEFORMAT
# LOG_STDOUT
# LOG_SHORT_NAMES
LOG_FILE = 'mylog.log'
LOG_LEVEL = 'WARNING'
#收集 ERROR(包含以以上)
3.关于logging的知识点
日志级别
Python的内置日志记录定义了5个不同的级别来指示给定日志消息的严重性。以下是标准的,按降序排列:
logging.CRITICAL
- 严重错误(严重程度最高)logging.ERROR
- 经常出错logging.WARNING
- 用于警告信息logging.INFO
- 用于提供信息logging.DEBUG
- 用于调试消息(最低严重性)
记录设置
这些设置可用于配置日志记录:
前几个设置定义了日志消息的目标。如果 LOG_FILE
设置,则通过根记录器发送的消息将重定向到LOG_FILE
以encoding编号 命名的文件LOG_ENCODING
。如果未设置且LOG_ENABLED
是True
,则会在标准错误上显示日志消息。最后,如果 LOG_ENABLED
是False
,则不会有任何可见的日志输出。
LOG_LEVEL
确定要显示的最低严重性级别,将过滤掉那些严重性较低的消息。它的范围是日志级别中列出的可能级别。
LOG_FORMAT
并LOG_DATEFORMAT
指定用作所有消息的布局的格式字符串。这些字符串可以包含日志记录的logrecord属性docs和 datetime的strftime和strptime指令中 分别列出的任何占位符。
如果LOG_SHORT_NAMES
设置,则日志不会显示打印日志的scrapy组件。默认情况下未设置,因此日志包含负责该日志输出的scrapy组件。