← Назад в базу знаний

Как обучить свой прокси-скрипт: эмуляция реального пользователя на основе поведенческих паттернов

Как обучить свой прокси-скрипт: эмуляция реального пользователя на основе поведенческих паттернов

Серые IP-пулы, умные антифрод-системы, поведенческая аналитика. Прокси-скрипты, которые тупо шлют запросы с одинаковыми интервалами, палятся за минуты. Капча, блокировка, бан. Знакомая история?

Эмуляция поведения реального пользователя — единственный способ выжить в современных условиях. Разберём, как это работает на практике.

Почему тупые скрипты дохнут

Антифрод-системы анализируют не только IP и заголовки. Они смотрят на тайминги запросов, последовательность действий, отклонения от нормы. Человек не кликает каждые ровно 5 секунд. Он читает, думает, отвлекается.

Средний пользователь проводит на странице от 30 секунд до 3 минут. Скрипт, который долбит endpoint каждые 2 секунды, — мгновенный красный флаг. Даже с ротацией прокси.

Базовая модель задержек

Начнём с простого — распределение задержек между запросами. Нормальное распределение с математическим ожиданием и дисперсией. Никаких фиксированных интервалов.

```python

import random

import time

import numpy as np

def human_delay(mean=2.5, std=0.8):

delay = np.random.normal(mean, std)

return max(0.3, min(delay, 8.0))

while True:

response = make_request()

time.sleep(human_delay())

```

Параметры подбираются под конкретный сайт. Для новостного портала — 3-5 секунд. Для API — 0.5-1.5 секунды. Изучайте реальное поведение через аналитику или расширения браузера.

Сессии и поведенческие паттерны

Одна сессия — один прокси. Если скрипт переключает IP посреди сессии, это выглядит подозрительно. Сессия должна включать:

- Заход на главную страницу

- Переход по 2-3 внутренним ссылкам

- Скроллинг с переменной скоростью

- Иногда — возврат назад

Вот пример эмуляции сессии с прокси:

```python

import requests

from random import choice

proxies_pool = [

'http://proxy1:8000',

'http://proxy2:8000',

]

def browse_session(proxy):

session = requests.Session()

session.proxies = {'http': proxy, 'https': proxy}

session.get('https://site.com')

time.sleep(human_delay(4.0, 1.2))

session.get('https://site.com/catalog')

time.sleep(human_delay(2.0, 0.6))

session.get('https://site.com/catalog/item/42')

time.sleep(human_delay(6.0, 2.0))

proxy = choice(proxies_pool)

browse_session(proxy)

```

Заголовки и отпечатки браузера

Заголовки — первое, что проверяют. User-Agent, Accept-Language, Sec-Fetch-* — всё должно быть консистентно. Нельзя слать запросы с Chrome UA, а потом с Firefox.

Полный набор заголовков реального браузера:

```bash

curl -X GET 'https://api.site.com/data' \

-H 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36' \

-H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8' \

-H 'Accept-Language: ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7' \

-H 'Sec-Fetch-Dest: document' \

-H 'Sec-Fetch-Mode: navigate' \

-H 'Sec-Fetch-Site: none' \

-H 'Sec-Fetch-User: ?1' \

-H 'Upgrade-Insecure-Requests: 1' \

--proxy 'http://proxy:8000'

```

Обратите внимание на порядок заголовков. Многие антифрод-системы сверяют его с реальными отпечатками браузеров.

Обработка ошибок и ретраи

Человек не долбит страницу после ошибки. Он обновляет, ждёт, пробует позже. Скрипт должен имитировать это поведение.

```python

import time

from random import randint

def request_with_retry(url, max_retries=3):

for attempt in range(max_retries):

try:

response = make_request(url)

return response

except ConnectionError:

if attempt == max_retries - 1:

raise

time.sleep(randint(5, 30))

except HTTPError as e:

if e.code == 429:

time.sleep(randint(60, 300))

elif e.code == 503:

time.sleep(randint(10, 60))

else:

raise

```

Ретраи с экспоненциальной задержкой и джиттером — стандарт для любого уважающего себя скрипта.

Распределение трафика по времени суток

Реальные пользователи не работают 24/7. Ночью трафик минимален, утром — всплеск. Если скрипт долбит в 4 утра с той же интенсивностью, что и в 14:00, это подозрительно.

Пример расписания активности:

| Часы | Интенсивность |

|------|---------------|

| 00-06 | 5% от пика |

| 06-09 | 40% |

| 09-18 | 100% |

| 18-23 | 70% |

Реализация простая — множитель на задержку в зависимости от локального времени.

Прокси-ротация: когда менять IP

Частая ротация — плохо. Редкая — тоже плохо. Оптимальный интервал — 10-30 минут на один IP при активной работе. Для парсинга с низкой частотой — 1-2 часа.

Пример: сервис lexic.ml предоставляет IPv6 прокси с автоматической ротацией. Настраиваете интервал — и скрипт работает с новым IP каждые 15 минут. Удобно, когда не хочется писать собственную логику ротации.

Кейс: парсинг маркетплейса

Проблема: скрипт собирал цены с маркетплейса, используя 50 прокси. Блокировка наступала через 2-3 часа работы.

Причина: скрипт обращался к одному и тому же товару каждые 30 секунд, с одинаковыми заголовками и без задержек на "чтение" страницы.

Решение:

- Добавлены случайные задержки 5-15 секунд

- Эмуляция скроллинга через отправку видимых элементов

- Ротация User-Agent под каждый прокси

- Переходы между категориями перед запросом цены

После изменений скрипт работал 48+ часов без единой блокировки.

Кейс: сбор данных с соцсети

Проблема: сбор постов с публичной страницы. API отдавал ошибку 429 после 100 запросов.

Причина: слишком быстрые запросы с одного IP, отсутствие пауз на "прокрутку ленты".

Решение:

- Задержки 20-40 секунд между запросами

- Паузы 5-10 минут каждые 20 запросов

- Имитация кликов по ссылкам внутри постов

- Использование разных прокси для разных сессий

Результат: стабильная работа без ошибок в течение недели.

Кейс: автоматизация заказов

Проблема: скрипт оформлял заказы на сайте с ограничением — один заказ на аккаунт. Система блокировала аккаунты после 3-4 заказов.

Причина: одинаковое поведение — мгновенный переход от каталога к оформлению заказа.

Решение:

- Добавлена эмуляция чтения описания товара (10-30 секунд)

- Просмотр отзывов с задержками

- Добавление товара в корзину, пауза, переход к оформлению

- Разные тайминги для разных аккаунтов

Блокировки прекратились. Система не отличала скрипт от реальных покупателей.

Мониторинг и адаптация

Поведенческие паттерны меняются. Антифрод-системы эволюционируют. Скрипт должен уметь адаптироваться.

Логируйте:

- Коды ответов

- Время отклика

- Частоту капчи

- Количество блокировок

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

Инструменты для анализа поведения

Для создания реалистичных паттернов полезно изучить:

- Playwright/Selenium для записи реальных сессий

- Wireshark для анализа трафика реального браузера

- Browser DevTools для изучения таймингов запросов

Записали 100 реальных сессий — получили статистику. На основе неё строите модель поведения. Это лучший способ обучить скрипт.

Что в итоге

Эмуляция поведения — не rocket science. Это статистика, терпение и внимание к деталям. Начните с простых задержек, добавьте заголовки, сессии, обработку ошибок. Постепенно усложняйте модель.

Помните: цель — не стать невидимым, а стать неотличимым от реального пользователя. Разница тонкая, но критическая.

✔️Купить прокси