Skip to main content

记录

注解

scrapy.log 已被弃用,其功能支持显式调用Python标准日志记录。继续阅读以了解有关新日志记录系统的更多信息。

Scrapy使用 Python内置的日志系统 进行事件日志记录。我们将提供一些简单的例子,让您开始,但对于更高级的用例,强烈建议阅读它的文档。

日志记录开箱即用,并且可以使用 日志设置 中列出的Scrapy设置在一定程度上进行配置。

Scrapy调用 scrapy.utils.log.configure_logging() 设置一些合理的默认值,并在运行命令时处理 日志设置 中的这些设置,因此如果您正在 从脚本运行Scrapy 中描述的脚本运行Scrapy,建议手动调用它。

日志级别

Python的内置日志记录定义了5个不同的级别来指示给定日志消息的严重性。这里是标准的,按降序排列:

  1. logging.CRITICAL - 对于严重错误(最高严重性)

  2. logging.ERROR - 常规错误

  3. logging.WARNING - 用于警告消息

  4. logging.INFO - 用于信息消息

  5. logging.DEBUG - 用于调试消息(最低严重性)

如何记录消息

这里是一个如何使用 logging.WARNING 级别记录消息的快速示例:

import logging
logging.warning("This is a warning")

有在任何标准5级别发布日志消息的快捷方式,还有一个一般的 logging.log 方法,它以给定的级别作为参数。如果你需要这样,最后的例子可以重写为:

import logging
logging.log(logging.WARNING, "This is a warning")

最重要的是,你可以创建不同的“记录器”来封装消息(例如,一个常见的做法是为每个模块创建不同的记录器)。这些记录器可以独立配置,它们允许层次结构。

最后一个示例使用根日志记录器幕后,这是一个顶级日志记录器,所有的消息传播到(除非另有规定)。使用 logging 助手只是显式获取根记录器的一个捷径,因此这也相当于最后一个代码片段:

import logging
logger = logging.getLogger()
logger.warning("This is a warning")

您可以使用一个不同的记录器只是通过它的名称与 logging.getLogger 功能:

import logging
logger = logging.getLogger('mycustomlogger')
logger.warning("This is a warning")

最后,您可以通过使用 __name__ 变量确保为您正在处理的任何模块定制日志记录器,该变量填充了当前模块的路径:

import logging
logger = logging.getLogger(__name__)
logger.warning("This is a warning")

参见

模块日志,如何

基本日志教程

模块日志,记录器

关于记录器的进一步文档

从蜘蛛记录

Scrapy在每个Spider实例中提供了一个 logger,可以像这样访问和使用:

import scrapy

class MySpider(scrapy.Spider):

    name = 'myspider'
    start_urls = ['http://scrapinghub.com']

    def parse(self, response):
        self.logger.info('Parse function called on %s', response.url)

该记录器是使用Spider的名称创建的,但您可以使用任何自定义的Python记录器。例如:

import logging
import scrapy

logger = logging.getLogger('mycustomlogger')

class MySpider(scrapy.Spider):

    name = 'myspider'
    start_urls = ['http://scrapinghub.com']

    def parse(self, response):
        logger.info('Parse function called on %s', response.url)

日志配置

记录器自己不管理如何显示通过它们发送的消息。对于此任务,可以将不同的“处理程序”附加到任何记录器实例,并且它们将这些消息重定向到适当的目标,例如标准输出,文件,电子邮件等。

默认情况下,Scrapy根据以下设置设置和配置根记录器的处理程序。

日志设置

这些设置可用于配置日志记录:

第一对设置定义日志消息的目标。如果设置了 LOG_FILE,则通过根记录器发送的消息将重定向到具有编码 LOG_ENCODING 的名为 LOG_FILE 的文件。如果unset和 LOG_ENABLEDTrue,日志消息将显示在标准错误上。最后,如果 LOG_ENABLEDFalse,则不会有任何可见的日志输出。

LOG_LEVEL 确定要显示的最低严重性级别,那些具有较低严重性的消息将被过滤掉。它的范围通过 日志级别 中列出的可能级别。

LOG_FORMATLOG_DATEFORMAT 指定用作所有消息布局的格式化字符串。这些字符串可以包含分别在 logging的logrecord属性docsdatetime的strftime和strptime指令 中列出的任何占位符。

如果设置了 LOG_SHORT_NAMES,则日志不会显示打印日志的scrapy组件。它在默认情况下未设置,因此日志包含负责该日志输出的scrapy组件。

命令行选项

有命令行参数,可用于所有命令,可用于覆盖关于记录的一些Scrapy设置。

参见

模块 logging.handlers

关于可用处理程序的更多文档

高级定制

因为Scrapy使用stdlib日志记录模块,您可以使用stdlib日志记录的所有功能来自定义日志记录。

例如,假设您要抓取的网站会返回许多HTTP 404和500响应,而您想要隐藏所有类似的消息:

2016-12-16 22:00:06 [scrapy.spidermiddlewares.httperror] INFO: Ignoring
response <500 http://quotes.toscrape.com/page/1-34/>: HTTP status code
is not handled or not allowed

首先要注意的是记录器名称 - 它在括号中:[scrapy.spidermiddlewares.httperror]。如果你只得到 [scrapy],那么 LOG_SHORT_NAMES 可能设置为True;将其设置为False并重新运行爬网。

接下来,我们可以看到消息具有INFO级别。要隐藏它,我们应该将 scrapy.spidermiddlewares.httperror 的日志记录级别设置为高于INFO; INFO为警告后的下一级。例如,在蜘蛛的 __init__ 方法:

import logging
import scrapy


class MySpider(scrapy.Spider):
    # ...
    def __init__(self, *args, **kwargs):
        logger = logging.getLogger('scrapy.spidermiddlewares.httperror')
        logger.setLevel(logging.WARNING)
        super().__init__(*args, **kwargs)

如果你再次运行这个蜘蛛,那么来自 scrapy.spidermiddlewares.httperror 记录器的INFO消息将会消失。

scrapy.utils.log模块

scrapy.utils.log.configure_logging(settings=None, install_root_handler=True)

初始化Scrapy的日志记录默认值。

参数:
  • settings (dict, Settings object or None) – 用于创建和配置根记录器的处理程序的设置(默认值:无)。
  • install_root_handler (bool) – 是否安装根日志处理程序(默认值:True)

此功能:

  • 通过Python标准日志记录路由警告和扭曲日志记录

  • 分别为Scrapy和Twisted记录器分配DEBUG和ERROR级别

  • 如果LOG_STDOUT设置为True,则将stdout路由到日志

install_root_handler 为True(默认)时,此函数还将根据给定的设置为根记录器创建一个处理程序(请参阅 日志设置)。您可以使用 settings 参数覆盖默认选项。当 settings 为空或无时,使用默认值。

使用Scrapy命令时,将自动调用 configure_logging,但在运行自定义脚本时需要显式调用。在这种情况下,它的用法不是必需的,但它是建议。

如果你计划自己配置处理程序,仍然建议你调用这个函数,传递 install_root_handler=False。请记住,在这种情况下,默认情况下不会设置任何日志输出。

为了让您开始手动配置日志记录的输出,您可以使用 logging.basicConfig() 设置基本的根处理程序。这是一个关于如何将 INFO 或更高版本的消息重定向到文件的示例:

import logging
from scrapy.utils.log import configure_logging

configure_logging(install_root_handler=False)
logging.basicConfig(
    filename='log.txt',
    format='%(levelname)s: %(message)s',
    level=logging.INFO
)

有关使用Scrapy的更多详细信息,请参阅 从脚本运行Scrapy