Python 爬虫项目 爬虫运行状态监控与异常告警
2026/6/10 22:01:22 网站建设 项目流程

前言

爬虫服务完成开发、定时部署与增量逻辑改造后,便进入长期无人值守运行阶段。网络波动、目标站点反爬策略升级、数据库连接中断、程序逻辑报错、服务器资源耗尽等问题,都会造成爬虫任务停滞、数据采集中断。若缺少完善的状态监控与异常告警体系,故障往往会持续数小时甚至数日才被发现,直接导致业务数据缺失、项目运营受损。

爬虫运行状态监控覆盖任务启停、执行耗时、数据采集量、请求成功率、资源占用等多维度指标,异常告警则能够在故障发生的第一时间推送消息至运维人员,实现问题快速响应与处理。本文从监控指标设计、日志体系搭建、运行状态采集、异常捕获、多渠道告警实现、服务守护等维度展开讲解,结合 Python 原生模块、第三方工具完成全流程代码落地,同时拆解各模块底层运行原理,适配单机爬虫、定时爬虫、增量爬虫等现有架构,所有方案均可直接应用于生产环境。文中涉及的第三方库、工具均提供官方链接,方便读者快速查阅文档与完成环境部署。

相关依赖库官方链接:

  1. requests:网络请求基础库,用于爬虫业务与告警接口调用,https://requests.readthedocs.io/
  2. psutil:系统资源监控库,获取 CPU、内存、磁盘、进程状态,https://pypi.org/project/psutil/
  3. logging:Python 内置日志模块,实现分级日志记录与持久化,https://docs.python.org/3/library/logging.html
  4. traceback:Python 内置异常追踪模块,抓取完整报错堆栈信息,https://docs.python.org/3/library/traceback.html
  5. smtplib:Python 内置邮件发送模块,实现邮件渠道告警,https://docs.python.org/3/library/smtplib.html
  6. datetime:Python 内置时间处理模块,统计任务执行时长、记录时间节点,https://docs.python.org/3/library/datetime.html
  7. threading:Python 内置多线程模块,实现后台常驻监控线程,https://docs.python.org/3/library/threading.html

一、爬虫监控体系整体规划

1.1 核心监控指标分类

监控指标是判断爬虫运行状态是否正常的依据,结合爬虫业务特性与运维需求,将指标划分为业务指标程序指标服务器资源指标三大类别,不同类别指标对应不同的监控逻辑与告警规则,下表为各类指标明细、采集方式与告警触发条件。

表格

指标分类具体监控项采集方式常规告警触发条件
业务指标任务启动 / 停止状态程序内部埋点记录定时任务未按预期启动、任务无故终止
业务指标单任务执行耗时时间戳差值计算执行耗时超出预设阈值,判定为请求阻塞
业务指标数据采集总量 / 新增量业务逻辑中计数统计连续多轮采集新增数据为 0,判定数据源无更新或爬取失效
业务指标网络请求成功率成功请求数 / 总请求数成功率低于 90%,存在大面积访问异常
程序指标代码运行异常全局异常捕获 + 堆栈抓取程序抛出运行时异常、函数调用报错
程序指标数据库连接状态主动探活检测数据库连接失败、查询 / 写入操作报错
程序指标进程存活状态进程 ID 轮询检测爬虫进程意外退出、被系统强制终止
服务器资源指标CPU 使用率系统接口轮询采集瞬时 CPU 占用超过 85%,持续 5 分钟以上
服务器资源指标内存占用率系统接口轮询采集内存占用超过 90%,存在内存泄漏风险
服务器资源指标磁盘剩余空间系统接口轮询采集磁盘剩余空间低于 10%,防止日志 / 数据写失败

业务指标聚焦爬虫核心采集业务,直接反映数据产出情况;程序指标定位代码、第三方组件、中间件的运行故障;服务器资源指标保障运行环境稳定,三类指标结合可实现全方位状态感知。

1.2 监控与告警整体架构

一套完整的爬虫监控告警系统分为五层架构,各层级各司其职,形成数据采集、分析判断、消息推送的闭环,架构逻辑适用于所有 Python 爬虫项目。 第一层为数据采集层,通过代码埋点、第三方库、系统接口,定时采集上文所列的各类监控指标原始数据,是整个体系的数据来源。 第二层为数据存储层,将采集到的指标数据、运行日志、异常信息进行持久化存储,支持历史数据回溯、故障溯源,常用载体为本地日志文件、SQLite、MySQL 数据库。 第三层为规则判断层,预设各类指标的阈值与判定规则,对实时采集的数据进行校验,区分正常状态、预警状态、故障状态。 第四层为告警触发层,当数据触碰预设告警规则时,抓取异常详情、上下文日志、堆栈信息,组装告警内容。 第五层为消息推送层,对接不同告警渠道,将告警信息推送至运维人员,主流渠道包含日志文件、企业微信 / 钉钉机器人、邮件、短信等。

该架构采用解耦设计,采集逻辑、判断逻辑、推送逻辑相互独立,后续可按需新增监控指标与告警渠道,扩展性极强。

1.3 日志系统:监控数据的基础载体

日志是爬虫监控的核心载体,所有运行状态、异常信息、指标数据都会以日志形式留存。单纯使用print语句无法满足工程化运维需求,必须基于 Pythonlogging模块搭建分级、分文件、按时间切割的标准日志体系。

日志按照严重等级由低到高划分为 DEBUG、INFO、WARNING、ERROR、CRITICAL 五级,爬虫项目常规使用 INFO 记录正常运行状态,WARNING 记录潜在风险,ERROR 与 CRITICAL 记录程序异常与严重故障。同时为避免单一日志文件体积无限膨胀,采用按时间自动分割的日志策略,按天生成独立日志文件,并自动清理过期日志。

二、标准化日志系统搭建实战

日志是监控与故障排查的第一手资料,本节实现分级日志 + 按时间切割 + 多文件分类的日志方案,区分运行日志、错误日志、监控日志,不同类型信息写入对应文件,便于分类查阅。

2.1 日志模块完整代码实现

python

运行

import logging from logging.handlers import TimedRotatingFileHandler import os from datetime import datetime # 日志根目录 LOG_BASE_DIR = "./spider_logs" # 日志保留天数 LOG_SAVE_DAYS = 7 # 创建日志目录 if not os.path.exists(LOG_BASE_DIR): os.mkdir(LOG_BASE_DIR) def init_logger(): """初始化全局日志配置""" # 设置日志总级别 logger = logging.getLogger("spider_monitor") logger.setLevel(logging.INFO) # 清除默认处理器,避免重复输出 logger.handlers.clear() # 定义日志输出格式 log_format = logging.Formatter( "%(asctime)s - %(name)s - %(levelname)s - %(filename)s:%(lineno)d - %(message)s", datefmt="%Y-%m-%d %H:%M:%S" ) # 1. 控制台输出处理器,用于本地调试 console_handler = logging.StreamHandler() console_handler.setFormatter(log_format) logger.addHandler(console_handler) # 2. 全量日志文件:按天切割,保留7天 all_log_path = os.path.join(LOG_BASE_DIR, "spider_all.log") all_file_handler = TimedRotatingFileHandler( filename=all_log_path, when="D", interval=1, backupCount=LOG_SAVE_DAYS, encoding="utf-8" ) all_file_handler.setFormatter(log_format) logger.addHandler(all_file_handler) # 3. 错误日志文件:仅记录ERROR及以上级别日志 error_log_path = os.path.join(LOG_BASE_DIR, "spider_error.log") error_file_handler = TimedRotatingFileHandler( filename=error_log_path, when="D", interval=1, backupCount=LOG_SAVE_DAYS, encoding="utf-8" ) error_file_handler.setLevel(logging.ERROR) error_file_handler.setFormatter(log_format) logger.addHandler(error_file_handler) return logger # 全局日志实例 spider_logger = init_logger()

2.2 代码原理详解

  1. 目录初始化:代码首先判断日志根目录是否存在,不存在则自动创建,保证日志文件可正常写入,避免路径不存在引发程序报错。
  2. TimedRotatingFileHandler 原理:该处理器为 Python 标准日志切割工具,when="D"代表按天分割日志,interval=1表示每 1 天生成一个新日志文件,backupCount=7代表仅保留最近 7 天的日志文件,自动删除过期文件,控制磁盘占用。
  3. 日志格式字段说明:格式字符串中包含时间、日志名称、日志等级、代码文件名称、代码行号、日志内容,出现异常时可直接定位到报错代码位置,大幅提升排查效率。
  4. 分级日志隔离:单独创建错误日志文件,只收录 ERROR、CRITICAL 级别的信息,运维人员可直接查看错误日志快速定位故障,无需在海量正常日志中筛选异常内容。
  5. 多处理器协同:同时配置控制台输出与文件输出,本地开发调试时查看控制台,线上运行时留存文件日志,兼顾开发与运维场景。

2.3 日志调用示例

在爬虫业务代码中直接调用全局日志实例,替代传统打印语句,示例如下:

python

运行

import requests def demo_spider(): spider_logger.info("爬虫任务开始执行") try: resp = requests.get("https://httpbin.org/get", timeout=10) spider_logger.info(f"网络请求成功,状态码:{resp.status_code}") except Exception as e: spider_logger.error(f"网络请求失败,异常信息:{str(e)}", exc_info=True) if __name__ == "__main__": demo_spider()

exc_info=True参数会在日志中附加简易异常信息,结合后续traceback模块可输出完整堆栈,是异常日志记录的标准用法。

三、程序内部状态监控与异常捕获

在日志体系基础上,实现爬虫任务执行状态、运行耗时、数据统计、全局异常捕获等内部监控逻辑,无需依赖第三方组件,轻量化且兼容性强,适配所有单机爬虫项目。

3.1 任务执行耗时与数据量监控

通过时间戳计算任务执行时长,同时对采集数据条数、请求次数进行计数统计,实时监控业务运行效率与数据产出。

3.1.1 代码实现

python

运行

import time import requests from datetime import datetime # 引入全局日志实例 from 上文代码 import spider_logger # 全局统计变量 TOTAL_REQUEST_COUNT = 0 # 总请求次数 SUCCESS_REQUEST_COUNT = 0 # 成功请求次数 NEW_DATA_COUNT = 0 # 本轮新增数据条数 def spider_business_task(): """模拟爬虫核心业务逻辑""" global TOTAL_REQUEST_COUNT, SUCCESS_REQUEST_COUNT, NEW_DATA_COUNT task_start_time = time.time() spider_logger.info("新一轮爬虫任务启动") url_list = [ "https://httpbin.org/get", "https://httpbin.org/headers", "https://httpbin.org/ip" ] for url in url_list: TOTAL_REQUEST_COUNT += 1 try: resp = requests.get(url, timeout=8) SUCCESS_REQUEST_COUNT += 1 # 模拟解析数据、判定增量、新增数据计数 NEW_DATA_COUNT += 1 spider_logger.debug(f"请求地址:{url},响应正常") except Exception as e: spider_logger.warning(f"请求地址:{url} 访问失败,异常:{str(e)}") # 计算任务执行耗时 task_cost_time = round(time.time() - task_start_time, 2) # 计算请求成功率 success_rate = round(SUCCESS_REQUEST_COUNT / TOTAL_REQUEST_COUNT * 100, 2) if TOTAL_REQUEST_COUNT > 0 else 0 # 输出本轮监控统计信息 spider_logger.info(f"任务执行完成,总耗时:{task_cost_time} 秒") spider_logger.info(f"总请求数:{TOTAL_REQUEST_COUNT},成功请求数:{SUCCESS_REQUEST_COUNT},请求成功率:{success_rate}%") spider_logger.info(f"本轮新增数据条数:{NEW_DATA_COUNT}") # 阈值判断:执行耗时超过5秒触发预警 if task_cost_time > 5: spider_logger.warning(f"任务执行耗时超标,当前耗时:{task_cost_time} 秒,存在阻塞风险") # 阈值判断:成功率低于90%触发预警 if success_rate < 90: spider_logger.warning(f"请求成功率过低,当前成功率:{success_rate}%,访问异常增多") if __name__ == "__main__": spider_business_task()
3.1.2 原理详解
  1. 耗时统计原理:在任务开始时记录时间戳,任务结束后用当前时间戳减去起始时间戳,得到任务总执行时长,保留两位小数便于读取。
  2. 数据计数逻辑:使用全局变量统计请求次数、成功次数、新增数据量,每完成一次请求、一条数据采集就对应累加,实现全流程数据统计。
  3. 阈值预警逻辑:预设耗时、成功率阈值,当统计数据超出范围时,输出 WARNING 级别日志标记风险,运维人员可通过日志快速识别异常状态。
  4. 适用场景:该方案属于代码埋点监控,和爬虫业务深度结合,无需额外服务,是中小型爬虫项目首选方案。

3.2 全局异常捕获与完整堆栈抓取

普通异常捕获只能获取异常描述信息,无法定位具体报错代码行,结合traceback模块可抓取完整异常堆栈信息,同时实现全局异常拦截,避免单一报错导致整个爬虫服务终止。

3.2.1 代码实现

python

运行

import traceback import requests from functools import wraps from 上文代码 import spider_logger def global_exception_catch(func): """全局异常捕获装饰器""" @wraps(func) def wrapper(*args, **kwargs): try: return func(*args, **kwargs) except Exception as e: # 抓取完整异常堆栈 error_stack = traceback.format_exc() spider_logger.critical(f"函数 {func.__name__} 运行出现严重异常:{str(e)}\n完整堆栈信息:\n{error_stack}") return None return wrapper # 为爬虫任务添加异常捕获装饰器 @global_exception_catch def error_test_spider(): # 模拟非法请求,触发异常 resp = requests.get("https://invalid-test-url-12345.com", timeout=5) data = resp.json() return data if __name__ == "__main__": error_test_spider()
3.2.2 原理详解
  1. 装饰器原理:采用 Python 装饰器模式封装全局异常逻辑,所有被装饰的函数执行时都会进入try-except代码块,统一拦截异常,无需在每个函数内重复编写异常捕获代码,简化代码结构。
  2. traceback 模块作用traceback.format_exc()会捕获从异常触发点到调用链路的全部堆栈信息,包含报错文件、代码行号、函数调用顺序,是定位代码 BUG 的核心工具。
  3. 日志级别区分:严重运行异常使用 CRITICAL 级别日志,区别于普通 ERROR 日志,在日志文件中可快速筛选出致命故障。
  4. 异常隔离特性:装饰器捕获异常后,函数返回空值,不会向上抛出异常,保证主线程、定时调度服务不会因为单个函数报错而整体崩溃,实现异常隔离。

3.3 APScheduler 定时任务状态监控

结合前文定时爬虫框架,对 APScheduler 任务进行状态监听,感知任务启动、执行完成、异常报错等事件,实现定时任务专属监控。

3.3.1 代码实现

python

运行

from apscheduler.schedulers.blocking import BlockingScheduler from apscheduler.events import EVENT_JOB_EXECUTED, EVENT_JOB_ERROR, EVENT_JOB_MISSED import requests from 上文代码 import spider_logger # 初始化调度器 scheduler = BlockingScheduler() def scheduler_monitor_listener(event): """定时任务监听器,监听任务各类事件""" job_id = event.job_id if event.job_id else "未知任务" # 任务正常执行完成 if event.code == EVENT_JOB_EXECUTED: spider_logger.info(f"定时任务 {job_id} 执行完成") # 任务执行报错 elif event.code == EVENT_JOB_ERROR: spider_logger.error(f"定时任务 {job_id} 执行异常,异常信息:{event.exception}") # 任务错过执行时间(上一轮未完成,下一轮已触发) elif event.code == EVENT_JOB_MISSED: spider_logger.warning(f"定时任务 {job_id} 错过执行时间,存在任务阻塞") # 绑定监听器,监听三大核心事件 scheduler.add_listener( scheduler_monitor_listener, EVENT_JOB_EXECUTED | EVENT_JOB_ERROR | EVENT_JOB_MISSED ) # 测试定时任务 def scheduler_test_task(): spider_logger.info("定时任务正在运行") requests.get("https://httpbin.org/get", timeout=10) # 添加定时任务,每2分钟执行一次 scheduler.add_job(scheduler_test_task, "interval", minutes=2, id="monitor_job_001") if __name__ == "__main__": spider_logger.info("带监控的定时爬虫服务启动") try: scheduler.start() except (KeyboardInterrupt, SystemExit): scheduler.shutdown() spider_logger.info("定时爬虫服务正常关闭")
3.3.2 原理详解
  1. 事件监听机制:APScheduler 内置事件分发机制,任务状态发生变化时会主动触发对应事件,开发者通过绑定监听器即可感知状态。
  2. 核心事件说明EVENT_JOB_EXECUTED代表任务正常结束;EVENT_JOB_ERROR代表任务抛出异常;EVENT_JOB_MISSED代表任务因阻塞错过执行时间,是判断任务堆积的重要依据。
  3. 任务 ID 定位:通过任务唯一 ID 区分不同定时任务,多任务场景下可精准定位出问题的任务,监控粒度更精细。

四、服务器资源与进程监控

爬虫长期部署在服务器中运行,进程意外退出、CPU / 内存占用过高、磁盘空间不足等环境问题,会直接导致服务瘫痪。本节使用psutil库实现进程存活检测、系统资源监控,同时搭建后台常驻监控线程,不影响爬虫主业务运行。

4.1 环境依赖安装

执行以下命令安装系统监控库:

shell

pip install psutil

4.2 进程存活监控

通过进程 ID 检测爬虫进程是否正常运行,适用于服务器后台常驻的爬虫服务。

4.2.1 代码实现

python

运行

import psutil import time from 上文代码 import spider_logger def check_process_alive(pid): """检测指定PID的进程是否存活""" try: # 根据PID获取进程对象 process = psutil.Process(pid) # 判断进程是否处于运行状态 return process.is_running() except psutil.NoSuchProcess: return False except Exception as e: spider_logger.error(f"进程检测异常:{str(e)}") return False def process_monitor(pid, check_interval=10): """后台进程监控循环,默认10秒检测一次""" spider_logger.info(f"开始监控爬虫进程,进程PID:{pid}") while True: is_alive = check_process_alive(pid) if not is_alive: spider_logger.critical(f"警告:爬虫进程 {pid} 已意外终止!") break time.sleep(check_interval) if __name__ == "__main__": # 替换为实际爬虫进程PID TARGET_PID = 12345 process_monitor(TARGET_PID)
4.2.2 原理详解
  1. psutil 进程操作原理psutil.Process(pid)根据进程编号获取系统进程实例,is_running()方法查询进程运行状态;若 PID 不存在,会抛出NoSuchProcess异常,代表进程已退出。
  2. 轮询检测机制:采用循环轮询方式,每隔指定时间检测一次进程状态,一旦发现进程消失,立即输出严重级别日志标记故障。
  3. 使用方式:线上部署时,先通过pstasklist等系统命令获取爬虫进程 PID,再传入监控函数实现常驻检测。

4.3 系统资源监控(CPU / 内存 / 磁盘)

实时采集服务器 CPU 使用率、内存占用、磁盘剩余空间,设置阈值触发风险预警,防止资源耗尽导致服务卡顿或宕机。

4.3.1 代码实现

python

运行

import psutil import time from 上文代码 import spider_logger # 资源阈值配置 CPU_THRESHOLD = 85 # CPU使用率阈值 % MEM_THRESHOLD = 90 # 内存使用率阈值 % DISK_THRESHOLD = 10 # 磁盘剩余空间阈值 % def get_system_resource(): """获取服务器资源信息""" # CPU使用率 cpu_percent = psutil.cpu_percent(interval=1) # 内存信息 mem_info = psutil.virtual_memory() mem_percent = mem_info.percent # 磁盘信息(检测根目录) disk_info = psutil.disk_usage("/") disk_free_percent = disk_info.free / disk_info.total * 100 return cpu_percent, mem_percent, round(disk_free_percent, 2) def resource_monitor(interval=30): """系统资源循环监控,默认30秒采集一次""" spider_logger.info("服务器资源监控已启动") while True: cpu, mem, disk_free = get_system_resource() # 正常状态日志 spider_logger.info(f"资源状态 - CPU:{cpu}%,内存:{mem}%,磁盘剩余:{disk_free}%") # 阈值判断与预警 if cpu > CPU_THRESHOLD: spider_logger.warning(f"CPU使用率过高,当前:{cpu}%,超出阈值 {CPU_THRESHOLD}%") if mem > MEM_THRESHOLD: spider_logger.warning(f"内存使用率过高,当前:{mem}%,超出阈值 {MEM_THRESHOLD}%") if disk_free < DISK_THRESHOLD: spider_logger.critical(f"磁盘空间严重不足,剩余空间仅:{disk_free}%") time.sleep(interval) if __name__ == "__main__": resource_monitor()
4.3.2 原理详解
  1. CPU 采集psutil.cpu_percent(interval=1)会采样 1 秒内的 CPU 平均使用率,数据更贴近真实运行状态。
  2. 内存与磁盘采集virtual_memory()获取整机内存使用情况,disk_usage()获取指定目录的磁盘总容量、已用容量、剩余容量,计算剩余空间占比。
  3. 阈值分级预警:CPU、内存超标输出 WARNING 预警日志,磁盘空间严重不足输出 CRITICAL 日志,区分风险等级。
  4. 轮询间隔设置:资源监控无需高频采集,30 秒至 1 分钟轮询一次即可,减少监控本身的资源消耗。

4.4 多线程整合监控服务

将业务监控、进程监控、资源监控放在独立子线程中运行,主线程专注爬虫业务,实现监控与业务解耦。

python

运行

import threading from 上文代码 import process_monitor, resource_monitor, demo_spider def start_all_monitor(): """启动所有监控线程""" # 进程监控线程 pid_thread = threading.Thread(target=process_monitor, args=(12345,), daemon=True) # 资源监控线程 res_thread = threading.Thread(target=resource_monitor, daemon=True) pid_thread.start() res_thread.start() spider_logger.info("所有监控线程启动完成") if __name__ == "__main__": # 启动监控 start_all_monitor() # 主线程运行爬虫业务 while True: demo_spider() time.sleep(60)

设置daemon=True守护线程属性,主线程退出时监控线程自动销毁,避免残留进程。

五、多渠道异常告警推送实现

日志与监控只能记录状态,无法主动推送消息,本节实现邮件告警Webhook 机器人告警两大主流主动推送方案,故障发生时第一时间将异常信息发送给运维人员。

5.1 邮件告警实现

基于 Python 内置smtplibemail模块实现邮件推送,支持发送纯文本告警内容,适用于各类服务器告警场景。

5.1.1 代码实现

python

运行

import smtplib from email.mime.text import MIMEText from email.header import Header from 上文代码 import spider_logger # 邮件配置信息 MAIL_HOST = "smtp.qq.com" # 邮件服务器 MAIL_PORT = 465 # SSL端口 MAIL_SENDER = "xxx@qq.com" # 发件邮箱 MAIL_AUTH_CODE = "授权码" # 邮箱第三方登录授权码 MAIL_RECEIVER = ["yyy@qq.com"] # 收件人列表 def send_email_alarm(title, content): """发送邮件告警""" try: # 构造邮件内容 msg = MIMEText(content, "plain", "utf-8") msg["From"] = Header(f"爬虫监控告警<{MAIL_SENDER}>") msg["To"] = Header(",".join(MAIL_RECEIVER)) msg["Subject"] = Header(title, "utf-8") # 连接邮件服务器并发送 smtp = smtplib.SMTP_SSL(MAIL_HOST, MAIL_PORT) smtp.login(MAIL_SENDER, MAIL_AUTH_CODE) smtp.sendmail(MAIL_SENDER, MAIL_RECEIVER, msg.as_string()) smtp.quit() spider_logger.info("告警邮件发送成功") return True except Exception as e: spider_logger.error(f"邮件发送失败:{str(e)}") return False # 告警触发示例 if __name__ == "__main__": alarm_title = "爬虫任务运行异常" alarm_content = "检测到定时爬虫请求成功率低于90%,请及时排查!" send_email_alarm(alarm_title, alarm_content)
5.1.2 原理与配置说明
  1. SMTP 协议原理:邮件发送基于 SMTP 邮件传输协议,QQ 邮箱、网易邮箱等均提供第三方 SMTP 服务,开启 POP3/SMTP 服务并获取授权码后方可使用。
  2. 端口说明:SSL 加密端口 465 为主流配置,安全性更高,优先使用该端口。
  3. 调用时机:在监控逻辑判断出故障后,调用该函数推送告警邮件,形成 “发现异常 - 记录日志 - 推送邮件” 的完整流程。

5.2 企业微信 / 钉钉 Webhook 机器人告警

企业内部运维主流使用即时通讯机器人推送告警,响应速度远快于邮件,原理为调用平台提供的 Webhook 接口,通过requests发送 POST 请求推送消息。

5.2.1 代码实现

python

运行

import requests from 上文代码 import spider_logger # 机器人Webhook地址,替换为自己的机器人链接 WEBHOOK_URL = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxxxxx" def send_webhook_alarm(content): """Webhook机器人推送告警""" headers = {"Content-Type": "application/json"} post_data = { "msgtype": "text", "text": { "content": f"【爬虫监控告警】\n{content}" } } try: resp = requests.post(WEBHOOK_URL, json=post_data, headers=headers, timeout=10) if resp.json().get("errcode") == 0: spider_logger.info("机器人告警消息推送成功") return True else: spider_logger.warning(f"机器人推送失败,返回信息:{resp.text}") return False except Exception as e: spider_logger.error(f"调用Webhook接口异常:{str(e)}") return False # 测试调用 if __name__ == "__main__": alarm_msg = "爬虫进程意外退出,请立即登录服务器检查!" send_webhook_alarm(alarm_msg)
5.2.2 原理说明
  1. Webhook 工作机制:企业微信、钉钉创建群机器人后会生成唯一接口地址,按照平台规定的 JSON 格式提交 POST 请求,即可在群内推送文本消息。
  2. 多渠道组合:项目中可同时启用邮件 + 机器人双渠道告警,机器人用于紧急故障即时通知,邮件用于留存完整告警记录。

六、告警规则整合与防骚扰优化

6.1 告警规则整合

将监控判断逻辑与告警推送逻辑结合,形成完整闭环,示例如下:

python

运行

# 在任务耗时超标时触发告警 if task_cost_time > 5: warn_msg = f"任务执行耗时超标,当前耗时:{task_cost_time}秒" spider_logger.warning(warn_msg) send_webhook_alarm(warn_msg) send_email_alarm("爬虫耗时告警", warn_msg)

6.2 告警防骚扰策略

爬虫运行中可能出现瞬时网络波动、临时资源峰值,频繁推送告警会造成运维干扰,通过以下策略优化:

  1. 连续判定机制:同一指标连续 3 次检测异常,再触发告警,忽略瞬时波动。
  2. 告警冷却时间:同一故障触发告警后,设置 15~30 分钟冷却期,冷却期内不再重复推送相同告警。
  3. 分级告警:普通预警仅记录日志,严重故障才推送消息,区分故障等级。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询