news 2026/4/29 20:16:11

Scrapy 爬虫监控:结合 Prometheus+Grafana 实践

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Scrapy 爬虫监控:结合 Prometheus+Grafana 实践

在大规模爬虫集群运维场景中,实时监控爬虫的运行状态、请求成功率、数据抓取量等核心指标,是保障业务稳定性和数据质量的关键。Scrapy 作为 Python 生态中最流行的爬虫框架,本身提供了基础的日志输出功能,但缺乏可视化的监控面板和告警机制。本文将介绍如何通过Prometheus(时序数据监控系统)和Grafana(可视化仪表盘工具),搭建一套完整的 Scrapy 爬虫监控体系。

一、监控方案整体架构

在 Scrapy 爬虫监控方案中,核心组件分为三层:

  1. 数据采集层:通过 Scrapy 扩展,在爬虫运行过程中采集核心指标(如请求数、响应数、错误数、item 产出量等),并暴露为 Prometheus 可抓取的 HTTP 接口。
  2. 数据存储与聚合层:Prometheus 定期从爬虫暴露的接口拉取指标数据,存储为时序数据,并支持通过 PromQL 进行指标查询和聚合。
  3. 可视化与告警层:Grafana 对接 Prometheus 数据源,通过自定义仪表盘展示爬虫运行状态,并配置告警规则,当指标异常时触发通知(如邮件、钉钉)。

整体流程:Scrapy爬虫(采集指标) → 暴露metrics接口 → Prometheus(拉取/存储数据) → Grafana(可视化/告警)

二、环境准备

  1. 基础环境
    • Python 3.8+
    • Scrapy 2.0+
    • Docker & Docker Compose(推荐用于快速部署 Prometheus 和 Grafana)
  2. 核心依赖包安装用于暴露 Prometheus 指标的 Python 库:

    bash

    运行

    pip install prometheus-client scrapy-prometheus-exporter
    • prometheus-client:官方 Python 客户端,用于生成和暴露 metrics 指标。
    • scrapy-prometheus-exporter:Scrapy 的第三方扩展,简化爬虫指标的采集和暴露流程。

三、Scrapy 爬虫集成 Prometheus 指标采集

3.1 配置 Scrapy 扩展

修改 Scrapy 项目的settings.py文件,启用 Prometheus 扩展并配置相关参数:

python

运行

# settings.py # 1. 启用Prometheus扩展 DOWNLOADER_MIDDLEWARES = { 'scrapy_prometheus_exporter.PrometheusMiddleware': 543, } # 2. 配置Prometheus指标暴露的端口和路径 PROMETHEUS_ENABLED = True PROMETHEUS_PORT = 9091 # 指标暴露端口,避免与Prometheus服务端口冲突 PROMETHEUS_PATH = '/metrics' # 指标访问路径,默认/metrics PROMETHEUS_REGISTRY = 'prometheus_client.registry.CollectorRegistry' # 3. 可选:自定义监控指标(如item产出量、自定义业务指标)

3.2 内置核心指标说明

scrapy-prometheus-exporter默认采集以下核心指标(均为 Counter 类型,累计值):

指标名指标说明标签
scrapy_requests_total总请求数spider(爬虫名)、method(请求方法)
scrapy_responses_total总响应数spiderstatus(响应状态码)
scrapy_items_total总 Item 产出量spideritem_type(Item 类型)
scrapy_errors_total总错误数spidererror(错误类型)
scrapy_requests_duration_seconds请求耗时直方图spider

3.3 自定义业务指标

如果需要监控业务相关指标(如数据去重数、解析成功率),可以通过prometheus-client手动注册指标:

python

运行

# 在爬虫项目中创建custom_metrics.py from prometheus_client import Counter, Histogram, CollectorRegistry # 创建自定义指标注册表 registry = CollectorRegistry() # 1. 自定义Counter指标:数据去重数 duplicate_item_counter = Counter( 'scrapy_duplicate_items_total', 'Total number of duplicate items', ['spider'], registry=registry ) # 2. 自定义Histogram指标:Item解析耗时 item_parse_duration = Histogram( 'scrapy_item_parse_duration_seconds', 'Duration of item parsing process', ['spider'], registry=registry )

在爬虫的parse方法中使用自定义指标:

python

运行

from scrapy import Spider from .custom_metrics import duplicate_item_counter, item_parse_duration class MySpider(Spider): name = 'my_spider' def parse(self, response): # 记录解析耗时 with item_parse_duration.labels(spider=self.name).time(): item = {} # 业务解析逻辑... # 模拟去重判断 if self.is_duplicate(item): duplicate_item_counter.labels(spider=self.name).inc() return yield item def is_duplicate(self, item): # 去重逻辑实现 return False

3.4 启动爬虫并验证指标

启动 Scrapy 爬虫:

bash

运行

scrapy crawl my_spider

爬虫运行后,访问http://localhost:9091/metrics,即可看到暴露的指标数据,类似如下格式:

plaintext

# HELP scrapy_requests_total Total number of requests # TYPE scrapy_requests_total counter scrapy_requests_total{method="GET",spider="my_spider"} 100 # HELP scrapy_responses_total Total number of responses # TYPE scrapy_responses_total counter scrapy_responses_total{spider="my_spider",status="200"} 95 scrapy_responses_total{spider="my_spider",status="404"} 5

四、部署 Prometheus 采集指标数据

Prometheus 支持通过静态配置或服务发现机制抓取目标指标。本文采用 Docker Compose 快速部署 Prometheus,并配置静态抓取目标。

4.1 编写 Prometheus 配置文件

创建prometheus.yml配置文件:

yaml

global: scrape_interval: 15s # 全局抓取间隔,每15秒抓取一次指标 evaluation_interval: 15s scrape_configs: # 配置Scrapy爬虫指标抓取任务 - job_name: 'scrapy_spiders' static_configs: - targets: ['host.docker.internal:9091'] # 爬虫暴露的指标地址 labels: project: 'my_scrapy_project' # 自定义标签,用于区分不同项目
  • scrape_interval:控制 Prometheus 抓取指标的频率,根据业务需求调整(如 10s / 次)。
  • targets:爬虫的 IP 和端口,若爬虫和 Prometheus 在同一主机,Docker 环境下使用host.docker.internal访问宿主机端口。

4.2 Docker Compose 部署 Prometheus

创建docker-compose.yml文件:

yaml

version: '3' services: prometheus: image: prom/prometheus:v2.45.0 container_name: prometheus ports: - "9090:9090" volumes: - ./prometheus.yml:/etc/prometheus/prometheus.yml - prometheus_data:/prometheus restart: always command: - '--config.file=/etc/prometheus/prometheus.yml' - '--storage.tsdb.path=/prometheus' - '--web.console.libraries=/usr/share/prometheus/console_libraries' - '--web.console.templates=/usr/share/prometheus/consoles' volumes: prometheus_data:

启动 Prometheus 容器:

bash

运行

docker-compose up -d prometheus

访问http://localhost:9090进入 Prometheus UI,在Status → Targets中可查看爬虫目标的抓取状态(StateUP表示抓取成功)。

五、Grafana 可视化仪表盘配置

5.1 启动 Grafana 容器

修改docker-compose.yml,添加 Grafana 服务:

yaml

version: '3' services: prometheus: # 同上... grafana: image: grafana/grafana:9.5.2 container_name: grafana ports: - "3000:3000" volumes: - grafana_data:/var/lib/grafana restart: always depends_on: - prometheus volumes: prometheus_data: grafana_data:

启动 Grafana:

bash

运行

docker-compose up -d grafana

5.2 配置 Prometheus 数据源

  1. 访问http://localhost:3000,默认账号密码:admin/admin,首次登录需修改密码。
  2. 点击左侧菜单栏Configuration → Data sources → Add data source
  3. 选择Prometheus,配置数据源参数:
    • URLhttp://prometheus:9090(Docker 容器内通过服务名访问)
    • 其他参数保持默认,点击Save & test,提示Data source is working表示配置成功。

5.3 导入 / 创建 Scrapy 监控仪表盘

方式 1:导入社区现成仪表盘

Grafana 社区提供了丰富的开源仪表盘模板,可直接导入使用:

  1. 访问Grafana Dashboards,搜索ScrapyPrometheus Scrapy
  2. 复制仪表盘的 ID(如12345)。
  3. 在 Grafana 中点击Create → Import,输入仪表盘 ID,选择已配置的 Prometheus 数据源,完成导入。
方式 2:自定义仪表盘(推荐)

根据业务需求自定义监控面板,核心步骤如下:

  1. 点击Create → Dashboard → Add panel
  2. Query选项卡中,选择 Prometheus 数据源,输入 PromQL 查询语句,例如:
    • 请求成功率sum(scrapy_responses_total{status=~"2.."}) / sum(scrapy_requests_total) * 100
    • 每分钟 Item 产出量rate(scrapy_items_total[1m])
    • 4xx/5xx 错误占比sum(scrapy_responses_total{status=~"[45].."}) / sum(scrapy_requests_total) * 100
  3. Visualization选项卡中选择图表类型(如折线图、柱状图、单值面板),配置图表标题、单位、颜色等样式。
  4. 保存仪表盘,设置仪表盘名称(如Scrapy爬虫监控面板)。

5.4 配置告警规则

当爬虫指标异常时(如请求成功率低于 90%、错误数骤增),Grafana 可触发告警通知:

  1. 进入仪表盘编辑页面,点击面板右上角Alert → Create alert rule
  2. 配置告警条件:例如,设置请求成功率 < 90%持续 5 分钟触发告警。
  3. 配置通知渠道:在Alerting → Notification channels中添加通知方式(如钉钉机器人、邮件、Slack)。
  4. 保存告警规则,Grafana 将定期评估指标,满足条件时发送告警通知。

六、多爬虫集群监控扩展

当需要监控多个 Scrapy 爬虫实例时,可通过以下方式扩展:

  1. 静态配置扩展:在prometheus.ymlstatic_configs中添加多个爬虫目标:

    yaml

    static_configs: - targets: ['host.docker.internal:9091', 'host.docker.internal:9092', 'host.docker.internal:9093']
  2. 服务发现:对于动态扩缩容的爬虫集群,可使用 Prometheus 的服务发现机制(如 Consul、Kubernetes Service Discovery),自动发现新增的爬虫实例。
  3. 指标聚合:通过 PromQL 的sum()avg()等函数,聚合多个爬虫的指标,实现集群级别的监控视图。

七、常见问题与优化建议

7.1 常见问题

  1. 指标抓取失败:检查爬虫的PROMETHEUS_PORT是否开放,防火墙是否拦截,Prometheus 的targets配置是否正确。
  2. 指标数据缺失:确认 Scrapy 扩展是否正确启用,爬虫是否正常运行并产生指标数据。
  3. Grafana 图表无数据:检查 PromQL 查询语句是否正确,数据源是否选择无误,时间范围是否匹配。

7.2 优化建议

  1. 指标采样频率:根据爬虫运行频率调整scrape_interval,高频爬虫可设置为 10s,低频爬虫可设置为 60s,减少 Prometheus 存储压力。
  2. 数据保留策略:在 Prometheus 配置中设置storage.tsdb.retention.time(如 30d),清理过期数据。
  3. 自定义标签:为指标添加projectenv(开发 / 生产)等标签,便于多维度筛选和聚合。

八、总结

通过Scrapy + Prometheus + Grafana的组合,我们搭建了一套从指标采集、存储到可视化、告警的完整爬虫监控体系。这套方案不仅能实时监控爬虫的运行状态,及时发现请求失败、数据异常等问题,还能为爬虫性能优化和业务决策提供数据支持。在实际生产环境中,可结合容器编排工具(如 Kubernetes)和日志系统(如 ELK),进一步完善爬虫的运维监控体系。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/29 20:15:54

人群仿真软件:Legion_(4).Legion用户界面介绍

Legion用户界面介绍 1. 用户界面概述 Legion是一款专业的人群仿真软件&#xff0c;用户界面设计简洁、直观&#xff0c;旨在为用户提供高效、易用的仿真环境。本节将详细介绍Legion用户界面的主要组成部分及其功能&#xff0c;帮助用户快速上手并进行人群仿真。 1.1 主窗口 主窗…

作者头像 李华
网站建设 2026/4/10 22:13:15

2个方法设置打开密码,保护Excel安全性!

Excel文件通常保存着重要的数据内容&#xff0c;有些数据需要保护&#xff0c;打开密码可以在打开文件时输入密码查看文件内容&#xff0c;这样就可以保护文件内容不被任何人查看了&#xff0c;今天分享excel打开密码的两种设置方法给大家。 方法一&#xff1a;保护工作簿 点…

作者头像 李华
网站建设 2026/4/21 7:28:59

动态SQL(七)sql标签

sql标签 可以将常用的sql片段进行记录 需要用的时候直接引入即可 设置sql片段引用sql片段测试

作者头像 李华
网站建设 2026/4/29 14:12:37

边缘计算节点延迟专项测试实践指南

1. 测试概述与重要性 边缘计算节点的延迟直接影响实时应用性能&#xff08;如工业自动化、车联网&#xff09;&#xff0c;延迟过高可能导致业务中断或数据不一致。专项测试需评估端到端响应时间、抖动及丢包率等指标&#xff0c;确保节点在5G等低延迟场景下满足SLA要求&#…

作者头像 李华
网站建设 2026/4/20 18:10:40

我的十年:从测试员到AI创业者的真实旅程

启程于测试的基石 回首2016年&#xff0c;我作为一名初入行的软件测试员&#xff0c;坐在狭小的工位前&#xff0c;面对着一堆杂乱的测试用例和反复出现的bug报告。那时的测试世界&#xff0c;大多依赖手动执行&#xff1a;我们用Excel记录用例&#xff0c;用JIRA追踪缺陷&…

作者头像 李华