Налаштування прокси-ротації для парсера 1С-Бітрікс
Після 200-300 запитів з одного IP джерело починає відправляти 429 Too Many Requests або капчу. Це стандартний захист: Cloudflare, DataDome, PerimeterX — всі відстежують частоту запитів по IP. Єдиний спосіб обійти rate-limiting при промисловому парсингу — ротація прокси. Розберемо інтеграцію пула прокси в парсер на Бітрікс.
Типи прокси та що вибрати
- Датацентрові (DC) — дешеві ($1-3/IP), швидкі, але легко визначаються по ASN. Підходять для джерел без серйозного захисту.
- Резидентні — IP реальних провайдерів, коштують $5-15/GB трафіку. Не визначаються як прокси. Потрібні для джерел з Cloudflare Enterprise.
- Мобільні — IP мобільних операторів. Найбільш «чисті», але найбільш дорогі та повільні.
Для більшості задач автонаповнення каталогу у Бітрікс достатньо пула з 20-50 датацентрових прокси. Резидентні — якщо джерело активно блокує.
Архітектура ротації
Парсер у Бітрікс звичайно використовує \Bitrix\Main\Web\HttpClient або cURL напрямку. Прокси задається через опції з'єднання. Задача — перед кожним запитом вибирати наступний прокси з пула.
Зберігання пула — таблиця або конфігураційний файл:
// /local/php_interface/parser/proxy_pool.php
return [
['host' => '185.1.2.3', 'port' => 8080, 'user' => 'u1', 'pass' => 'p1', 'type' => 'http'],
['host' => '185.1.2.4', 'port' => 8080, 'user' => 'u2', 'pass' => 'p2', 'type' => 'socks5'],
// ...
];
Клас ротатора:
class ProxyRotator
{
private array $pool;
private array $failed = [];
private int $index = 0;
public function next(): ?array
{
$attempts = count($this->pool);
while ($attempts-- > 0) {
$proxy = $this->pool[$this->index % count($this->pool)];
$this->index++;
$key = $proxy['host'] . ':' . $proxy['port'];
if (!isset($this->failed[$key]) || $this->failed[$key] < time()) {
return $proxy;
}
}
return null; // всі прокси в cooldown
}
public function markFailed(array $proxy, int $cooldownSec = 300): void
{
$key = $proxy['host'] . ':' . $proxy['port'];
$this->failed[$key] = time() + $cooldownSec;
}
}
Стратегії ротації:
- Round-robin — найпростіша, прокси використовуються по черзі. Працює при однорідному пулі.
- Random — випадковий вибір. Знижує передбачуваність паттерну для anti-bot систем.
- Sticky per source — один прокси закріплюється за одним доменом-джерелом на N хвилин. Імітує реального користувача, знижує ймовірність блокування.
Для парсингу каталогів рекомендую sticky per source з ротацією кожні 50-100 запитів або при отримані 429/403.
Інтеграція з HttpClient Бітрікс
$proxy = $rotator->next();
$http = new \Bitrix\Main\Web\HttpClient();
$http->setProxy($proxy['host'], $proxy['port'], $proxy['user'], $proxy['pass']);
$http->setTimeout(15);
$http->setStreamTimeout(30);
$response = $http->get($url);
if ($http->getStatus() === 429 || $http->getStatus() === 403) {
$rotator->markFailed($proxy, 600);
// retry з іншим прокси
}
При використанні cURL напрямку — опції CURLOPT_PROXY, CURLOPT_PROXYUSERPWD, CURLOPT_PROXYTYPE (CURLPROXY_HTTP або CURLPROXY_SOCKS5).
Мониторинг здоров'я пула
Прокси умирають — істікає термін, IP попадає в бан, провайдер відключає. Потрібен регулярний health-check. Агент, що запускається раз на годину, проходить по пулу та перевіряє кожен прокси запитом до https://httpbin.org/ip. Результат — оновлення статусу в конфігурації (active/dead). Мертві прокси автоматично виключаються з ротації.
Логуйте статистику по кожному прокси: кількість успішних запитів, кількість 429/403, середній час ответу. Це дозволяє виявити «повільні» прокси та виключити їх до повної смерті.
Додаткові заходи
- Затримка між запитами — 1-5 секунд рандомної паузи. Навіть з ротацією прокси, пулемётна частота запитів виглядає підозріло.
- Ротація User-Agent — пул із 10-20 актуальних рядків UA, переключається разом з прокси.
-
Referer та заголовки — відправляйте
Accept-Language,Accept-Encoding,Refererвід попередньої сторінки. Без них запит виглядає як бот.
Що налаштовуємо за один день
- Файл/таблиця з пулом прокси.
- Клас
ProxyRotatorз round-robin та cooldown для failed. - Інтеграція з
HttpClientпарсера. - Health-check агент для пула.
- Логування статистики по прокси.







