Фильтрация ботов и синтетических запросов

Основные проблемы при измерении Web Vitals

Web Vitals — это метрики, измеряющие пользовательский опыт на сайте. Основные показатели, такие как Largest Contentful Paint (LCP), First Input Delay (FID) и Cumulative Layout Shift (CLS), рассчитаны на реальных пользователей. При этом данные могут искажаться, если в статистику попадают:

  • Автоматические запросы с ботов и краулеров.
  • Синтетические нагрузки от тестов производительности, которые не отражают реальное взаимодействие человека.

Игнорирование этих факторов приводит к неверной оценке производительности сайта, ложным оптимизациям и недостоверной аналитике.

Определение ботов и синтетических запросов

Бот — это скрипт или программа, которая выполняет действия на сайте автоматически. Примеры:

  • Поисковые роботы (Googlebot, Bingbot).
  • Мониторинговые сервисы uptime и performance.
  • Скрипты для сбора данных.

Синтетический запрос — тест, запускаемый человеком или инструментом для измерения скорости и отзывчивости сайта, но без настоящего взаимодействия пользователя. Например, Lighthouse, Puppeteer, Playwright.

Отличие синтетики от реальных пользователей в том, что они создают искусственную нагрузку, не отражающую типичный паттерн поведения.

Методы фильтрации

1. Проверка User-Agent

Самый базовый метод. Боты часто имеют уникальные User-Agent строки. В JavaScript можно реализовать фильтрацию так:

const isBot = () => {
  const ua = navigator.userAgent.toLowerCase();
  return /bot|crawl|spider|slurp|mediapartners/i.test(ua);
};

if (!isBot()) {
  import('web-vitals').then(({getCLS, getFID, getLCP}) => {
    getCLS(console.log);
    getFID(console.log);
    getLCP(console.log);
  });
}

Преимущества: простота реализации. Недостатки: некоторые боты маскируются под обычные браузеры, поэтому этот метод не является полностью надежным.

2. Проверка частоты событий

Реальные пользователи взаимодействуют с сайтом с естественной частотой. Боты могут генерировать десятки или сотни событий в секунду. Можно внедрить ограничение на регистрацию метрик при чрезмерной активности:

let eventCount = 0;
const MAX_EVENTS = 10;

const recordMetric = (metric) => {
  eventCount++;
  if (eventCount <= MAX_EVENTS) {
    console.log(metric);
  }
};
3. Анализ задержки действий

Боты обычно не имитируют случайные задержки между кликами или прокруткой. Для фильтрации можно измерять время между событиями и игнорировать слишком регулярные паттерны:

let lastEventTime = 0;

const trackEvent = (metric) => {
  const now = performance.now();
  if (now - lastEventTime < 50) return; // слишком частые события
  lastEventTime = now;
  console.log(metric);
};
4. Проверка интерактивности

Метрики вроде FID должны фиксироваться только при реальном взаимодействии пользователя: клик, нажатие клавиши, сенсорное событие. Синтетические инструменты часто пропускают эти действия или генерируют их программно. Использование событий DOM для фильтрации:

import {getFID} from 'web-vitals';

getFID((metric) => {
  if (metric.name === 'FID' && metric.entryType === 'first-input') {
    console.log(metric);
  }
});

Интеграция с аналитикой

После фильтрации ботов и синтетики данные можно отправлять в системы аналитики. Например:

function sendMetricToAnalytics(metric) {
  fetch('/analytics', {
    method: 'POST',
    headers: {'Content-Type': 'application/json'},
    body: JSON.stringify(metric)
  });
}

Важно, чтобы фильтрация выполнялась на клиенте, прежде чем данные попадут в аналитическую систему. Это снижает шум и увеличивает достоверность.

Советы по повышению точности

  • Использовать несколько методов фильтрации одновременно (User-Agent + поведенческий анализ).
  • Периодически обновлять список известных ботов и User-Agent.
  • Не отправлять метрики с аномальной частотой или нереалистичными значениями.
  • Сохранять данные о всех фильтрах для аудита и анализа.

Эти практики помогают отделять реальные пользовательские показатели от шумных данных синтетики, обеспечивая корректную интерпретацию Web Vitals.