Python爬虫实战:爬虫监控与告警系统——让爬虫7×24小时稳定运行

Python爬虫实战:爬虫监控与告警系统——让爬虫7×24小时稳定运行

摘要

本文是"Python爬虫实战系列"的第八篇。在前面掌握了基础爬虫、动态爬虫、分布式爬虫之后,本文聚焦生产环境的运维保障——如何监控爬虫运行状态、自动告警异常、记录运行日志,实现真正的7×24小时无人值守运行。

系列回顾:

  • 第六篇:AI辅助爬虫——用大模型自动生成解析规则
  • 第七篇:Scrapy框架从入门到精通

关键词:Python爬虫、监控告警、日志系统、异常处理、钉钉通知、邮件告警

一、为什么需要监控告警?

场景无监控有监控
爬虫半夜挂了第二天才发现,数据缺失立刻收到告警,自动重启
目标网站改版连续几天采集空数据第一时间发现,及时调整
服务器磁盘满了爬虫崩溃,数据丢失提前预警,自动清理
代理IP全部失效采集失败,不知道原因自动切换,通知管理员

二、监控指标体系

┌─────────────────────────────────────────┐ │ 爬虫监控指标体系 │ ├─────────────────────────────────────────┤ │ 系统层:CPU/内存/磁盘/网络 │ │ 应用层:请求成功率/响应时间/并发数 │ │ 业务层:采集量/数据质量/目标完成率 │ │ 异常层:错误类型/错误频率/影响范围 │ └─────────────────────────────────────────┘

三、核心代码实现

3.1 日志系统

# logger.py import logging import os from datetime import datetime def setup_logger(name, log_dir='logs'): """配置日志系统""" os.makedirs(log_dir, exist_ok=True) logger = logging.getLogger(name) logger.setLevel(logging.INFO) # 避免重复添加handler if logger.handlers: return logger # 文件日志(按天分割) log_file = os.path.join(log_dir, f'{name}_{datetime.now().strftime("%Y%m%d")}.log') file_handler = logging.FileHandler(log_file, encoding='utf-8') file_handler.setLevel(logging.INFO) # 控制台日志 console_handler = logging.StreamHandler() console_handler.setLevel(logging.INFO) # 格式 formatter = logging.Formatter( '%(asctime)s [%(levelname)s] %(name)s: %(message)s', datefmt='%Y-%m-%d %H:%M:%S' ) file_handler.setFormatter(formatter) console_handler.setFormatter(formatter) logger.addHandler(file_handler) logger.addHandler(console_handler) return logger # 使用 logger = setup_logger('spider') logger.info('爬虫启动') logger.warning('代理IP失效,切换中...') logger.error('请求失败,状态码: 403')

3.2 爬虫状态监控器

# monitor.py import time import json import requests from datetime import datetime from collections import deque class SpiderMonitor: """爬虫状态监控器""" def __init__(self, spider_name): self.spider_name = spider_name self.start_time = time.time() self.stats = { 'total_requests': 0, 'success_