深入Python爬虫的四大组件之Filters(过滤器)

源码分享
https://docs.qq.com/sheet/DUHNQdlRUVUp5Vll2?tab=BB08J2

在构建高效的Python爬虫时,使用日志系统是不可避免的。我们已经讨论了Logger和Handler,现在我们来关注日志系统的另一个重要组件:Filters(过滤器)。Filters允许你更细粒度地控制日志的输出行为,确保只有符合特定条件的日志消息才会被处理。本篇博客将详细介绍如何在Python爬虫中配置和使用Filters,并提供代码实例来帮助你更好地理解其用法。

Filters组件概述

在Python的​​logging​​模块中,Filters可以被附加到Loggers或Handlers上,用于执行日志消息的更复杂的过滤逻辑。Filter基于日志记录属性(例如消息级别、日志记录器名称或消息内容)决定是否允许特定的日志记录通过。

Filters配置

创建一个简单的Filter

下面的例子展示了一个基础的Filter,它只允许错误级别(ERROR)以上的日志通过。

import logging

class ErrorFilter(logging.Filter):
    def filter(self, record):
        return record.levelno >= logging.ERROR

# 创建Logger和Handler
logger = logging.getLogger('spider')
handler = logging.StreamHandler()
handler.setLevel(logging.DEBUG)

# 实例化并添加Filter
error_filter = ErrorFilter()
handler.addFilter(error_filter)

# 设置日志格式并添加Handler
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)
logger.addHandler(handler)

# 日志消息
logger.debug('这是一条debug信息,不会被显示。')
logger.info('这是一条info信息,不会被显示。')
logger.error('这是一条error信息,会被显示。')

使用Lambda作为Filter

Python还允许你使用lambda函数快速定义简单的过滤逻辑。

# 创建一个只允许警告级别的Filter
warning_filter = logging.Filter()
warning_filter.filter = lambda record: record.levelno == logging.WARNING

handler.addFilter(warning_filter)

基于消息内容的Filter

有时候你可能想基于日志消息的内容来过滤日志。如下所示:

class MessageFilter(logging.Filter):
    def __init__(self, message):
        super().__init__()
        self.message = message

    def filter(self, record):
        return self.message in record.getMessage()

# 实例化并添加内容过滤器
message_filter = MessageFilter('敏感')
handler.addFilter(message_filter)

# 日志消息
logger.info('这里包含了一个敏感词汇,会被显示。')
logger.info('这条信息看起来很普通。')

爬虫中的Filters应用

在爬虫中,你可以使用Filters来记录特定事件或排除一些不必要的日志信息。例如,你可能只关心那些包含“错误”或“失败”的日志条目,或者你可能想忽略掉一些频繁出现的、不影响爬虫运行的信息。

class Spider:
    def __init__(self):
        self.logger = logging.getLogger('spider')
        self.logger.setLevel(logging.INFO)
        handler = logging.StreamHandler()
        handler.setFormatter(formatter)
        self.logger.addHandler(handler)
        
        message_filter = MessageFilter('错误')
        self.logger.addFilter(message_filter)
        
    def crawl(self, url):
        # 模拟一个爬虫请求
        self.logger.info(f'正在爬取 {url}')
        # 假设请求失败了
        self.logger.error(f'爬取 {url} 时发生错误!')

# 使用爬虫
my_spider = Spider()
my_spider.crawl('http://example.com')

结语

Filters在Python日志模块中是一个强有力的组件,它可以大幅提升日志系统的灵活性和有效性。通过精确控制哪些日志消息被记录,你可以确保只关注对你真正重要的信息,这在调试复杂的爬虫系统或者分析大量爬取数据时尤其有价值。现在你已经理解了如何在Python爬虫中配置和使用Filters,希望你能够将这些知识应用到你的项目中,构建出更加可靠和高效的爬虫系统。记得,过滤器可以和Handler一起使用,为你的日志系统带来更大的灵活性和控制力。

  • 17
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

web安全工具库

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值