自动化运维(ansible)
2026/6/23 23:57:38
本文是"Python爬虫实战系列"的第八篇。在前面掌握了基础爬虫、动态爬虫、分布式爬虫之后,本文聚焦生产环境的运维保障——如何监控爬虫运行状态、自动告警异常、记录运行日志,实现真正的7×24小时无人值守运行。
系列回顾:
关键词: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_