news 2026/7/1 11:29:13

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/6/29 23:14:12

Scrapy 自定义命令与扩展:打造专属爬虫工具

Scrapy 作为 Python 生态中最强大的爬虫框架之一&#xff0c;其核心优势不仅在于内置的高效爬取能力&#xff0c;更在于高度的可扩展性。通过自定义命令和扩展&#xff08;Extensions&#xff09;&#xff0c;你可以摆脱框架默认功能的限制&#xff0c;打造贴合自身业务需求的专…

作者头像 李华
网站建设 2026/6/22 13:59:41

【图像加密】基于差分扩展的缩略图保持加密技术附matlab代码

✅作者简介&#xff1a;热爱数据处理、建模、算法设计的Matlab仿真开发者。&#x1f34e;更多Matlab代码及仿真咨询内容点击 &#x1f517;&#xff1a;Matlab科研工作室&#x1f34a;个人信条&#xff1a;格物致知。&#x1f525; 内容介绍在数字化浪潮的席卷下&#xff0c;数…

作者头像 李华
网站建设 2026/6/15 13:51:52

计算机的“神经网络”:三大总线及桥接器

目录 一、三大核心总线&#xff1a;数据、地址与控制总线 &#xff08;1&#xff09;数据总线&#xff08;Data Bus, DB&#xff09; &#xff08;2&#xff09;地址总线&#xff08;Address Bus, AB&#xff09; &#xff08;3&#xff09;控制总线&#xff08;Control Bu…

作者头像 李华
网站建设 2026/6/19 15:26:55

Elasticsearch近实时搜索揭秘:1秒内可查如何实现?

当你在 Kibana 中查询刚生成的日志&#xff0c;或在电商网站搜索刚上架的商品时&#xff0c;可能会好奇&#xff1a;数据写入后不到 1 秒就能搜到&#xff0c;这是如何实现的&#xff1f; 这背后就是 Elasticsearch (ES) 的“近实时”&#xff08;Near Real-Time, NRT&#xff…

作者头像 李华
网站建设 2026/6/29 14:16:23

SSM241的房屋中介出租出售系统vue

目录系统概述技术架构核心功能创新点应用价值开发技术源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;系统概述 SSM241房屋中介出租出售系统基于Vue.js前端框架与SSM&#xff08;SpringSpringMVCMyBatis&#xff09;后端架构开发&#…

作者头像 李华
网站建设 2026/6/29 10:05:08

萤石开放平台 设备运维 | 远程设备调试 快速入门

远程设备调试 1. 前置条件 设备要求&#xff1a; 设备绑定在当前账号下当前设备状态&#xff1a;在线设备能力要求&#xff1a;支持设备远程调试能力 2. 使用流程 2.1进入找到对应设备&#xff0c;并开启调试 在萤石开放平台控制台-设备管理页面中找到您需要调试的设备&a…

作者头像 李华