【Python从入门到进阶】53、Scrapy日志信息及日志级别

接上篇《52、CrawlSpider链接提取器的使用

上一篇我们学习了基于规则进行跟踪和自动爬取网页数据的"特殊爬虫"CrawlSpider。本篇我们来学习Scrapy的日志信息及日志级别。

一、引言

1、日志在Scrapy中的重要性

在Scrapy框架中,日志扮演着至关重要的角色。日志不仅记录了爬虫在运行过程中的详细行为,还提供了大量有助于开发者定位问题和优化程序的信息。通过日志,开发者可以了解到爬虫的每一步操作,包括请求的发送、响应的接收、数据的解析以及任何可能出现的异常。这些信息对于调试程序、监控运行状态以及优化性能都是不可或缺的。

2、日志级别及其作用

日志级别在Scrapy中同样具有重要意义。不同级别的日志信息反映了不同层次的程序运行状况。通过设置合适的日志级别,开发者可以过滤掉大量不必要的细节信息,只关注关键的运行状态和错误提示。这不仅可以提高开发效率,还有助于快速定位并解决潜在的问题。同时,合理的日志级别设置也有助于保护程序的敏感信息,避免信息泄露的风险。因此,深入理解Scrapy的日志级别及其使用方法是每一个Scrapy开发者必须掌握的技能。

二、Scrapy日志系统概述

1、Scrapy日志系统的基本结构

Scrapy的日志系统采用了层次化的设计,确保日志信息能够有序地生成、处理和输出。它主要由以下几个关键组件构成:

日志记录器(Logger) :Scrapy中的每个模块或组件都有自己的日志记录器。这些记录器负责收集并处理与该模块或组件相关的日志信息。

日志处理器(Handler) :日志处理器负责将日志信息输出到指定的目的地,如控制台、文件或远程服务器等。Scrapy支持多种类型的处理器,以满足不同的输出需求。

日志级别(Level) :Scrapy支持多种日志级别,包括DEBUG、INFO、WARNING、ERROR和CRITICAL。这些级别用于区分不同重要程度的日志信息,帮助开发者快速定位问题。

日志格式(Formatter):日志格式定义了日志信息的输出格式,包括时间戳、日志级别、模块名、消息内容等。Scrapy允许开发者自定义日志格式,以满足特定的需求。

2、日志信息的生成与输出

在Scrapy中,日志信息的生成与输出是一个自动化的过程。当爬虫运行时,各个模块和组件会根据其内部状态和操作生成相应的日志信息。这些信息首先被传递给对应的日志记录器,记录器根据配置的日志级别对信息进行过滤和处理。然后,处理后的日志信息被传递给相应的日志处理器,由处理器负责将其输出到指定的目的地。

Scrapy的日志系统支持多种输出方式,包括控制台输出、文件存储和远程日志服务等。开发者可以根据自己的需求选择合适的输出方式,并配置相应的处理器。

在Scrapy中,日志信息的生成与输出通常是自动进行的,无需开发者显式编写日志记录代码。Scrapy内部使用了Python的logging模块来处理日志,并在框架的不同部分自动记录日志信息。以下是一个简单的Scrapy spider示例,其中日志信息的生成和输出是自动发生的:

python 复制代码
import scrapy

class BaiduSpiderSpider(scrapy.Spider):
    name = "baidu_spider"
    allowed_domains = ["www.baidu.com"]
    start_urls = ["https://www.baidu.com"]
    # 百度设置了反爬,使用这个程序测试时,记得把setting.py的ROBOTSTXT_OBEY参数改为False

    def parse(self, response):
        # 当爬虫解析页面时,会自动生成并输出日志信息
        self.logger.info('被抓取的页面地址为: %s', response.url)
        # ... 其他解析逻辑 ...
        pass

在这个示例中,self.logger.info()用于记录一条INFO级别的日志信息。Scrapy会自动处理这条日志信息的输出,通常默认输出到控制台:

3、日志系统的配置与自定义

Scrapy的日志系统提供了丰富的配置选项,允许开发者根据实际需求进行自定义。通过修改Scrapy的配置文件或编写自定义的日志处理逻辑,开发者可以控制日志的级别、格式、输出方式等。

(1)设置日志级别

你可以设置整个Scrapy项目的日志级别,或者为特定的组件设置不同的日志级别(在settings.py中设置):

python 复制代码
# settings.py  
  
# 设置整个项目的日志级别为INFO  
LOG_LEVEL = 'INFO'  
  
# 或者为特定的组件设置日志级别  
# 例如,为Scrapy引擎设置DEBUG级别  
LOG_LEVEL_SCRAPY = 'DEBUG'

除了LOG_LEVEL外,日志系统还包含其他参数:

LOG_FILE : 日志输出文件。如果设置为None,日志信息将直接打印到控制台。通过设置具体的文件路径和名称,你可以将日志保存到本地文件中,方便后续查看和分析。

LOG_ENABLED : 是否启用日志系统。默认为True,表示启用日志记录。如果设置为False,则不会记录任何日志信息。

LOG_ENCODING : 日志编码。默认为utf-8,表示使用UTF-8编码来保存日志信息。你可以根据需要调整此设置以适应不同的编码要求。

LOG_FORMATLOG_DATEFORMAT: 分别用于定义日志的格式和日期格式。通过自定义这些格式,你可以控制日志信息的显示方式,使其更符合你的需求。

(2)自定义日志输出格式

你可以自定义日志的输出格式,使其包含更多或更少的信息(在settings.py中设置):

python 复制代码
# settings.py  
  
# 自定义日志输出格式  
LOG_FORMAT = '%(asctime)s [%(name)s] %(levelname)s: %(message)s'  
LOG_DATEFORMAT = '%Y-%m-%d %H:%M:%S'

测试效果:

(3)将日志输出到文件

默认情况下,Scrapy将日志输出到控制台。你可以通过添加自定义的日志处理器来将日志输出到文件(在settings.py中设置):

python 复制代码
# settings.py  
  
# 添加自定义的日志处理器,将日志输出到文件  
from scrapy.utils.log import configure_logging
import logging


class FilelogHandler(logging.FileHandler):
    def emit(self, record):
        msg = self.format(record)
        self.stream.write(msg + '\n')

# Scrapy会设置一些默认设置,并在运行命令时借助scrapy.utils.log.configure_logging()来处理这些设置。
# 当Scrapy的命令行工具(如scrapy crawl)被执行时,它会自动调用configure_logging来设置默认的日志配置。这包括设置日志级别、输出格式、处理器等。
configure_logging({
    'LOG_FILE': 'baidu_spider.log',
    'loggers': {
        'baidu_spider': {
            'level': 'DEBUG',
            'handlers': ['file'],
            'propagate': True,
        },
    },
    'handlers': {
        'file': {
            'level': 'DEBUG',
            'class': 'settings.FilelogHandler',
            'filename': 'baidu_spider.log',
            'append': True,
        }
    },
})

在这个示例中,我们定义了一个自定义的FileLogHandler类,并将其添加到Scrapy的日志配置中。这样,Scrapy就会将日志信息输出到指定的文件myspider.log中。

请注意,为了正确实现自定义日志处理器,你需要根据具体的Scrapy版本和Python版本进行适当的调整。上述代码仅作为示例,实际使用时可能需要根据具体情况进行修改。

三、Scrapy日志级别详解

1、Scrapy支持的日志级别及其含义

Scrapy支持的日志级别及其含义如下:

CRITICAL - 严重错误 :这个级别用于记录系统中出现的严重错误,这些错误通常导致程序无法继续运行或需要立即关注。

ERROR - 一般错误 :记录系统运行时遇到的错误情况,但这些问题通常不会导致程序立即停止运行。

WARNING - 警告信息 :表示可能出现问题的情况,但这些问题不一定是错误,只是需要开发者的注意。

INFO - 一般信息 :记录程序运行时的常规信息,如启动、关闭、任务进度等。

DEBUG - 调试信息:包含最详细的程序运行信息,通常用于开发或调试过程中,帮助开发者理解程序内部的运行情况。

在Scrapy中,默认的日志级别是DEBUG,这意味着所有DEBUG级别及以上的日志信息都会被记录。如果你只想看到ERROR级别或更高级别的日志信息,可以在Scrapy项目的settings.py文件中设置LOG_LEVEL = 'ERROR'。

此外,你也可以通过终端选项-loglevel/-L来设置日志级别。不同的日志级别可以帮助开发者根据需求快速定位问题,或者获取不同详细程度的程序运行信息。

2、日志级别的实际应用场景举例

DEBUG级别: 在开发或调试Scrapy爬虫时,将日志级别设置为DEBUG是非常有用的。DEBUG级别会记录最详细的程序运行信息,包括请求和响应的详细信息、解析过程中的每一步操作等。这些信息有助于开发者深入了解爬虫的内部运行情况,发现并解决潜在的问题。
INFO级别: 当爬虫开发完成后,进入测试或生产环境时,可以将日志级别设置为INFO。INFO级别会记录程序运行时的常规信息,如启动、关闭、任务进度等。这些信息可以帮助监控爬虫的运行状态,确保它按预期执行。
WARNING级别: 在某些情况下,开发者可能只关心可能出现问题的情况,但不希望被过多的日志信息所干扰。此时,可以将日志级别设置为WARNING。WARNING级别会记录那些可能导致问题的操作或情况,但不会记录过多的细节信息。
**ERROR级别:**当爬虫在生产环境中运行时,开发者通常只关心出现的错误情况。此时,可以将日志级别设置为ERROR。ERROR级别只会记录程序运行时遇到的错误情况,帮助开发者快速定位并解决问题。

通过合理设置日志级别,开发者可以根据不同阶段的需求,获取适当详细程度的程序运行信息,从而更好地管理和维护Scrapy爬虫。

转载请注明出处:https://guangzai.blog.csdn.net/article/details/138247107

相关推荐
数据智能老司机1 小时前
精通 Python 设计模式——分布式系统模式
python·设计模式·架构
数据智能老司机2 小时前
精通 Python 设计模式——并发与异步模式
python·设计模式·编程语言
数据智能老司机2 小时前
精通 Python 设计模式——测试模式
python·设计模式·架构
数据智能老司机2 小时前
精通 Python 设计模式——性能模式
python·设计模式·架构
c8i3 小时前
drf初步梳理
python·django
每日AI新事件3 小时前
python的异步函数
python
这里有鱼汤4 小时前
miniQMT下载历史行情数据太慢怎么办?一招提速10倍!
前端·python
databook13 小时前
Manim实现脉冲闪烁特效
后端·python·动效
程序设计实验室13 小时前
2025年了,在 Django 之外,Python Web 框架还能怎么选?
python
倔强青铜三15 小时前
苦练Python第46天:文件写入与上下文管理器
人工智能·python·面试