【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示例,其中日志信息的生成和输出是自动发生的:

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中设置):

# 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_FORMAT LOG_DATEFORMAT: 分别用于定义日志的格式和日期格式。通过自定义这些格式,你可以控制日志信息的显示方式,使其更符合你的需求。

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

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

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

测试效果:

(3)将日志输出到文件

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

# 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/578037.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

并并并并·病查坤

P1、什么是并查集 引用自百度百科: 并查集,在一些有N个元素的集合应用问题中,我们通常是在开始时让每个元素构成一个单元素的集合,然后按一定顺序将属于同一组的元素所在的集合合并,其间要反复查找一个元素在哪个集合…

虹科Pico汽车示波器 | 免拆诊断案例 | 2006 款林肯领航员车发动机怠速抖动

故障现象 一辆2006款林肯领航员车,搭载5.4 L发动机,累计行驶里程约为26万km。该车因发动机怠速抖动故障进厂维修,维修人员更换了火花塞、点火线圈及凸轮轴位置传感器,清洗了积炭和喷油器,故障依旧,于是向笔…

纵览2024年:排名靠前的项目管理软件一览!

时间飞逝,2024年已经过去近半,让我们来盘点2024年排名靠前的项目管理软件,项目管理软件排行榜,本次上榜的项目管理软件有Zoho Projects、Microsoft Project、Nifty、Smartsheet、ClickUp。 一、项目管理软件排行榜 1.Zoho Projec…

8点法估计基础矩阵

估计基础矩阵 文章目录 估计基础矩阵8点法归一化 8点法 8点法 根据两幅图像中8个对应点对之间的关系,采用SVD求 解最小二乘方 约束:det(F) 0 假设已知N对点的对应关系: { x i , x i ′ } i 1 N \{x_i,x^{\prime}_i\}_{i1}^N {xi​,xi′​…

RKNN:yolov8模型转换与板端推理流程

近期,在研究瑞芯微的RKNN模型推理时,遇到一些坑,现记录下来,以备忘,亦供同道者参考。 目录 1. 模型转换 1.1. 宿主机环境配置 1.2. onnx模型准备 1.3. onnx转rknn 2. 模型推理 2.1. 推理环境配置 2.2. 推理验证…

码农解压宝典

在快速发展的IT行业中,程序员们面临着巨大的工作压力。长时间的工作、高强度的编程任务以及不断更新的技术知识,使得程序员们时常感到疲惫不堪。然而,通过掌握一些简单的小窍门,程序员们可以有效地缓解工作压力,保持身…

【C++】类和对象⑤(static成员 | 友元 | 内部类 | 匿名对象)

🔥个人主页:Forcible Bug Maker 🔥专栏:C 目录 前言 static静态成员 友元 友元函数 友元类 内部类 匿名对象 结语 前言 本篇主要内容:类和对象的一些知识点补充,包括static静态成员,友…

AWTK 开源串口屏开发(17) - 通过 MODBUS 访问数组数据

在 AWTK 串口屏中,内置了 MODBUS Client Channel 的模型,不用编写代码即可实现在 ListView 中显示数组数据。 MODBUS 协议一次只能读取 125 个 WORD,AWTK-MODBUS Client Channel 支持长数据,自动分成多个请求访问。 1. 功能 不用…

C语言入门课程学习记录5

C语言入门课程学习记录5 第23课 - C 语言中的常量第24课 - 初探程序中的数组第25课 - 数组特性深入剖析第26课 - 多维数组的概念与示例 本文学习自狄泰软件学院 唐佐林老师的 C语言入门课程,图片全部来源于课程PPT,仅用于个人学习记录 第23课 - C 语言中…

SecretFlow学习指南(2)学习路径

目录 一、模块架构 二、模块详解 三、算法协议 四、学习路线 一、模块架构 良好的分层设计可以提高开发效率和可维护性,满足不同用户的需求。隐语从上到下一共分为六层。 ●产品层:通过白屏化产品提供隐语整体隐私计算能力的输出,让用户简…

paddle ocr模型量化实践

参考:https://github.com/PaddlePaddle/PaddleOCR/blob/main/deploy/slim/quantization/README.md https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.7.1/doc/doc_ch/FAQ.md 蒸馏 剪枝 量化 参考:https://blog.csdn.net/mddCSDN/article/de…

【MySQL】MySQL中MVCC多版本并发控制的概念

MySQL中MVCC多版本并发控制的概念 锁相关的知识我们已经学习完了,在其中我们提到过一个概念,那就是 MVCC 。这又是个什么东西呢?今天我们就来好好看看 MVCC 到底是干嘛的。 MVCC 多版本并发控制,它主要是控制 读 操作,…

x264 编码器源码分析综述

================================================================================ 系列文章 x264配置文章链接🔗Windows11编译x264源码https://blog.csdn.net/yanceyxin/article/details/135035650Mac调试x264源码https://blog.csdn.net/yanceyxin/article/details

《软件设计师教程:计算机网络浅了解计算机之间相互运运作的模式》

​ 个人主页:李仙桎 🔥 个人专栏: 《软件设计师》 ⛺️生活的理想,就是为了理想的生活! ​ ⛺️前言:各位铁汁们好啊!!!,今天开始继续学习中级软件设计师考试相关的内容&#xff0…

python中怎么注释多行

多行代码注释 方法一:先选中要注释的段落,然后按下“ctrl/”,即可实现多行代码的注释。效果如下: 再一次按下“ctrl/”就可以取消注释。 方法二:跟注释单行一样在每一行前面输入“shift#”。 #r(i-arr[idx])*rat[idx]…

三阶魔方公式大全 图解

https://www.mitao521.com/miji/2020112215034.html 三阶魔方七步还原法的公式有R’UF’U’、R’D’RD X,3OR5,R U R’,(RU R’U’),(RU R’U’)3,U’ L’ U L U F U’ F’,U R U’ R’ U’ F’ U F,F(R U R’ U’)F’。 还有(R U R’ U’)2和(R U R’ U’)5,R2 D2 R’ U’ R …

各种螺纹介绍

按用途,有三个主要大类: 第一,连接螺纹,用于紧固,即是螺栓螺母; 第二,传动螺纹,就是车床走刀那种; 第三,管螺纹,管道连接用。 按标准&#xf…

【刷题篇】动态规划-01背包问题(十)

文章目录 1、01背包2、分割等和子集3、目标和4、最后一块石头的重量 II 1、01背包 #include <iostream> #include<vector> using namespace std;int main() {int n,v;cin>>n>>v;vector<int> Weight(n1);vector<int> Value(n1);vector<i…

PDF加密了无法编辑?解密方法来了!

一下午都在捣鼓各种格式问题&#xff0c;首先是需要合并几个 PDF&#xff0c;然而有一个文件加密了无法操作&#xff0c;碰到加密不能编辑就很头痛&#xff0c;终于让我找到一个可行的方法了&#xff0c; 首先就这个加密文件右键选择打开方式-Google Chrome>>打开>>…

环形链表——java

给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置&#xff08;…